Google apps script 将仪表板插入StackPanel

Google apps script 将仪表板插入StackPanel,google-apps-script,dashboard,stackpanel,Google Apps Script,Dashboard,Stackpanel,我收到“对象类型与列类型不匹配”错误,不确定原因。。。不确定我的代码中是否有错误(可能性更大),或者它是否只是不接受仪表板。我认为我的错误与数据源以及如何从电子表格中提取数据有关 function doGet() { var app = UiApp.createApplication().setTitle('DHS: Kurzweil Calendar'); //Create stack panel var stackPanel = app.createStackPanel().s

我收到“对象类型与列类型不匹配”错误,不确定原因。。。不确定我的代码中是否有错误(可能性更大),或者它是否只是不接受仪表板。我认为我的错误与数据源以及如何从电子表格中提取数据有关

function doGet() {
  var app = UiApp.createApplication().setTitle('DHS: Kurzweil Calendar');

  //Create stack panel
  var stackPanel = app.createStackPanel().setSize('100%', '100%');
  var info = about(app);
  var p1 = app.createVerticalPanel().setId('vrtPanel1').add(info);
  var cal = calendar(app);
  var p2 = app.createVerticalPanel().setId('vrtPanel2').add(cal);
  var form = formBuild(app);
  var p3 = app.createVerticalPanel().setId('vrtPanel3').add(form);

  //add widgets to each stack panel, and name the stack panel
  stackPanel.add(p1, 'About the Lab');
  stackPanel.add(p2, 'Lab Calendar');
  stackPanel.add(p3, 'Lab Scheduling');

  //Add the panel to the application
  app.add(stackPanel);
  return app;
}

function about(app){
  return app.createHTML('<br />' + 
                        '<p>The Kurzweil Lab at Davie High School supports <i>20 independent student workstations</i> and is designed for the specific use of Kurzweil software.  The lab\'s main objective is to support students who have a Read-Aloud accommodation on their Individual Education Plan (IEP).  If a student does not have a Read-Aloud accommodation, but has another accommodation like: Separate Setting, Extended Time, or English as a Second Language (ESL) then they are welcome in the lab as long as the lab is not full.  If the lab reaches capacity and Read-Aloud students need to use Kurzweil, the student(s) without a Read-Aloud accommodation or who are refusing their Read-Aloud accommodation will be asked to go back to their classroom so that the teacher can make other arrangements for that student.</p>' + 
                        '<p>During non-testing situations the Kurzweil Lab can be scheduled by EC teachers to help with study skills, individual projects, or other work that requires the use of a computer lab.</p>', true);
}

function calendar(app){
  // Create Data Source
  var ss = SpreadsheetApp.openById('0Aur3owCpuUY-dGJIOGZ1LXhqT2FNMGVXSGNJazFnUmc');
  var datasource = ss.getSheetByName('Schedule').getRange(1,1,ss.getLastRow(),ss.getLastColumn());

  // Create Charts and Controls
  var dateFilter = Charts.newCategoryFilter()
      .setFilterColumnLabel("Date").build();
  var teacherFilter = Charts.newCategoryFilter()
      .setFilterColumnLabel("Teacher").build();
  var subjectFilter = Charts.newCategoryFilter()
      .setFilterColumnLabel("Subject").build();
  var periodFilter = Charts.newCategoryFilter()
      .setFilterColumnLabel("Period").build();
  var typeFilter = Charts.newCategoryFilter()
      .setFilterColumnLabel("Type").build();
  var tableChart = Charts.newTableChart().build();

  //Create and bind Dashboard
  var dashboard = Charts.newDashboardPanel()
      .setDataTable(datasource)
      .bind([dateFilter, teacherFilter, subjectFilter, periodFilter, typeFilter], [tableChart])
      .build();

  //Create Application
  dashboard.add(app.createVerticalPanel()
                .add(app.createHorizontalPanel()
                     .add(dateFilter).add(teacherFilter).add(subjectFilter).add(periodFilter).add(typeFilter)
                     .setSpacing(70))
                .add(app.createHorizontalPanel()
                     .add(tableChart)
                     .setSpacing(10)));

  //Add the panel to the application
  app.add(dashboard);
  return app;
}
函数doGet(){
var app=UiApp.createApplication().setTitle('DHS:Kurzweil Calendar');
//创建堆栈面板
var stackPanel=app.createStackPanel().setSize('100%,'100%);
var信息=关于(应用程序);
var p1=app.createVerticalPanel().setId('vrtPanel1').add(info);
var cal=日历(应用程序);
var p2=app.createVerticalPanel().setId('vrtPanel2').add(cal);
var form=formBuild(应用程序);
var p3=app.createVerticalPanel().setId('vrtPanel3').add(表单);
//向每个堆栈面板添加小部件,并命名堆栈面板
添加(p1,“关于实验室”);
添加(p2,‘实验室日历’);
stackPanel.add(p3,“实验室计划”);
//将面板添加到应用程序中
应用程序添加(stackPanel);
返回应用程序;
}
功能关于(应用程序){
返回app.createHTML(“
”+ Davie高中的Kurzweil实验室支持20个独立的学生工作站,专为Kurzweil软件的特定用途而设计。该实验室的主要目标是支持在个人教育计划(IEP)中有朗读空间的学生.如果学生没有朗读空间,但有另一个空间,如:单独设置、延长时间或英语作为第二语言(ESL),则只要实验室没有满,就欢迎他们进入实验室。如果实验室达到容量且朗读学生需要使用Kurzweil,则学生没有朗读安排或拒绝朗读安排的学生将被要求返回教室,以便老师为该学生做出其他安排。

'+ “在非测试情况下,EC教师可以安排Kurzweil实验室帮助学习技能、个人项目或其他需要使用计算机实验室的工作。

”,没错); } 功能日历(应用程序){ //创建数据源 var ss=SpreadsheetApp.openById('0aur3owcpuuuy-dGJIOGZ1LXhqT2FNMGVXSGNJazFnUmc'); var datasource=ss.getSheetByName('Schedule').getRange(1,1,ss.getLastRow(),ss.getLastColumn()); //创建图表和控件 var dateFilter=Charts.newCategoryFilter() .setFilterColumnLabel(“日期”).build(); var teacherFilter=Charts.newCategoryFilter() .setFilterColumnLabel(“教师”).build(); var subjectFilter=Charts.newCategoryFilter() .setFilterColumnLabel(“主题”).build(); var periodFilter=Charts.newCategoryFilter() .setFilterColumnLabel(“期间”).build(); var typeFilter=Charts.newCategoryFilter() .setFilterColumnLabel(“类型”).build(); var tableChart=Charts.newTableChart().build(); //创建并绑定仪表板 var dashboard=Charts.newDashboardPanel() .setDataTable(数据源) .bind([dateFilter,teacherFilter,subjectFilter,periodFilter,typeFilter],[tableChart]) .build(); //创建应用程序 dashboard.add(app.createVerticalPanel()) .add(app.createHorizontalPanel()) .add(日期过滤器).add(教师过滤器).add(主题过滤器).add(周期过滤器).add(类型过滤器) .1(70)) .add(app.createHorizontalPanel()) .add(表格图表) .1(10)); //将面板添加到应用程序中 应用程序添加(仪表板); 返回应用程序; }
您只是忘记了您更改了构建UI的每个函数返回数据的方式。。。如果你还记得我们把电话改成了

  var cal = calendar(app);
然后

  var p2 = app.createVerticalPanel().setId('vrtPanel2').add(cal);
因此,我们显然希望得到一个Ui对象(小部件)作为回报

您只需更改
功能日历(app){
的结尾,如下所示:

  ...
  dashboard.add(app.createVerticalPanel()
                .add(app.createHorizontalPanel()
                     .add(dateFilter).add(teacherFilter).add(subjectFilter).add(periodFilter).add(typeFilter)
                     .setSpacing(70))
                .add(app.createHorizontalPanel()
                     .add(tableChart)
                     .setSpacing(10)));

  //Add the panel to the application
  return dashboard;// return the dashboard itself, not the app.
}

编辑:这绝对是简单到真实的…我的答案是正确的,但显然没有包括仪表板建设的问题

经过几次研究(我以前从未使用过Charts服务),我找到了这段代码,它不会产生错误,但我肯定不确定它是否会返回您想要的结果

尽管如此,它应该能帮助你找到自己的路。(如果它看起来不对劲,不要怪我;-)


我得到“对象类型与列类型不匹配。”我如何返回动态电子表格中的所有数据?我无法进一步测试,因为我无法访问您的SS,可能是过滤函数需要其他类型的数据或图表本身…也许您可以解释/显示一些数据?无法打开id为0Aur3owCpuUY-dGJIOGZ1LXhqT2FNMGVXSGNJazFnUmc的文档:您没有访问请求的文档的权限。您现在应该可以访问它…如果不让我知道,我将尝试其他操作。答案已更新…但我在图表服务中确实是一个新手…抱歉。也许您可以在单独的线程中寻求有关如何获取正确类型的仪表板的帮助,因为问题不在于将其添加到stackPanel anymore但是关于图表服务功能。没有责备,很高兴得到帮助。我只是觉得我错过了一些简单的事情或者做了一些不正确的事情。我将把这个带到一个新的线程,看看如果这没有给出我想要的结果,我无法从这里弄清楚会发生什么。我只是觉得这会比日历选项更好。。。
function calendar(app){
  // Create Data Source
  var ss = SpreadsheetApp.openById('0Aur3owCpuUY-dGJIOGZ1LXhqT2FNMGVXSGNJazFnUmc');
  var sh = ss.getSheetByName('Schedule');
  var datasource = sh.getRange(1,2,sh.getLastRow(),sh.getLastColumn()).getValues();
  Logger.log(datasource)
  var dataTable = Charts.newDataTable();
  for( var j in datasource[0] ){
  dataTable.addColumn(Charts.ColumnType.STRING, datasource[0][j]);
  }
  for( var i = 1; i < datasource.length; ++i ){
  dataTable.addRow(datasource[i].map(String));
  }
var dashboard = Charts.newDashboardPanel().setDataTable(dataTable);  // Create Charts and Controls
  var dateFilter = Charts.newCategoryFilter()
      .setFilterColumnLabel("Date").setDataTable(dataTable).build();
  var teacherFilter = Charts.newCategoryFilter()
      .setFilterColumnLabel("Teacher").setDataTable(dataTable).build();
  var subjectFilter = Charts.newCategoryFilter()
      .setFilterColumnLabel("Subject").setDataTable(dataTable).build();
  var periodFilter = Charts.newCategoryFilter()
      .setFilterColumnLabel("Period").setDataTable(dataTable).build();
  var typeFilter = Charts.newCategoryFilter()
      .setFilterColumnLabel("Type").setDataTable(dataTable).build();
  var tableChart = Charts.newTableChart().setDimensions(1000, 600).setDataTable(dataTable).build();

  //Create and bind Dashboard
  var dashboard = Charts.newDashboardPanel()
      .setDataTable(dataTable)
      .bind([dateFilter, teacherFilter, subjectFilter, periodFilter, typeFilter], [tableChart])
      .build();

  //Create Application
  var dashBoardPanel = app.createVerticalPanel()
  dashBoardPanel.add(app.createHorizontalPanel()
                     .add(dateFilter).add(teacherFilter).add(subjectFilter).add(periodFilter).add(typeFilter)
                     .setSpacing(30));
  dashBoardPanel.add(tableChart);

  //Add the panel to the application
  return dashBoardPanel;
}
function calendar(app){
      // Create Data Source
      var ss = SpreadsheetApp.openById('0Aur3owCpuUY-dGJIOGZ1LXhqT2FNMGVXSGNJazFnUmc');
      var sh = ss.getSheetByName('Schedule');
      var datasource = sh.getRange(1,1,sh.getLastRow(),sh.getLastColumn()).getValues();
      Logger.log(datasource)
      var dataTable = Charts.newDataTable();
      dataTable.addColumn(Charts.ColumnType.DATE, datasource[0][1]);
      for( var j=2 ;j< datasource[0].length ;++j ){
        dataTable.addColumn(Charts.ColumnType.STRING, datasource[0][j]);
      }
      for( var i = 1; i < datasource.length; ++i ){
        var datarow = [];
        datarow.push(datasource[i][1]);
        for( var j=2 ;j< datasource[0].length ;++j ){
          datarow.push(datasource[i][j].toString());
        }
        dataTable.addRow(datarow);
      }
         var dashboard = Charts.newDashboardPanel().setDataTable(dataTable);  // Create Charts and Controls
          ...