应用程序脚本图表仪表板绑定到Google Spreadsheet作为数据源

时间:2012-08-19 14:29:33

标签: google-apps-script google-visualization

它在charts dashboard tutorial中表示,信息中心可以绑定到Google电子表格范围作为数据源。但是在教程中没有证明这一点,我也无法在Apps Script docs中找到相关信息。似乎Datatable无法绑定到电子表格范围,因为这些方法仅提供手动添加行和列。

有谁知道如何将信息中心绑定到Google电子表格的范围?

在我目前的代码中,我假设仪表板可以绑定到Google Spreadsheet的范围,就像这样,但是setDataTable函数调用让我很难。

var ss = SpreadsheetApp.openById(spreadsheetId);
var data = ss.getRangeByName("DataWithColHeadings");
var dashboard = Charts.newDashboardPanel()
  .setDataTable(data) // throws error here! I think it is expecting a DataTableBuilder
  .bind([durationFilter, lineFilter], [pieChart, tableChart])
  .build();

4 个答案:

答案 0 :(得分:2)

您可以使用点表示法指定数据范围:

var datasource = ss.getSheetByName("SheetName").getRange("A1:J20");

然后按如下方式使用它:

var dashboard = Charts.newDashboardPanel()
      .setDataTable(**datasource**)

以这种方式使用时,可以删除指定列名和行值的代码。只需确保指定范围内的值一致且非空。

答案 1 :(得分:0)

这相当于绑定到电子表格中命名范围的教程。命名范围包括列标题。

    function doGet() {
      var uiApp = UiApp.createApplication();
      var ssKey = "0At0FGJizRd-gdFo5bWZUUFRrUnRabENiRFdmT2o4WUE";
      var ss = SpreadsheetApp.openById(ssKey);
      var datasource = ss.getRangeByName("myRange").getValues();
      Logger.log(datasource);
      var data = Charts.newDataTable()
          .addColumn(Charts.ColumnType.STRING, datasource [0] [0])
          .addColumn(Charts.ColumnType.STRING, datasource [0] [1])
          .addColumn(Charts.ColumnType.NUMBER, datasource [0] [2])
          .addColumn(Charts.ColumnType.NUMBER, datasource [0] [3])
          for (i=1;i<=datasource.length-1;i++){
        Logger.log(datasource [i]);
        data.addRow([datasource [i] [0], datasource [i] [1], datasource [i] [2], datasource [i] [3]])
          };

      data.build();
      var ageFilter = Charts.newNumberRangeFilter()
          .setFilterColumnLabel("Age")
          .build();

      var genderFilter = Charts.newCategoryFilter()
          .setFilterColumnLabel("Gender")
          .build();

      var pieChart = Charts.newPieChart()
          .setDataViewDefinition(Charts.newDataViewDefinition()
                         .setColumns([0,3]))
          .build();

      var tableChart = Charts.newTableChart()
          .build(); 
      var dashboard = Charts.newDashboardPanel()
          .setDataTable(data)
          .bind([ageFilter, genderFilter], [pieChart, tableChart])
          .build();
      dashboard.add(uiApp.createVerticalPanel()
            .add(uiApp.createHorizontalPanel()
                 .add(ageFilter).add(genderFilter)
                 .setSpacing(70))
            .add(uiApp.createHorizontalPanel()
                 .add(pieChart).add(tableChart)
                 .setSpacing(10)));
      uiApp.add(dashboard);
      return uiApp;
    }

答案 2 :(得分:0)

您还可以使用名为.getDataTable()的对象RANGE的API函数。以下示例适用于我的双列多行表。

function doGet() {
   var uiApp = UiApp.createApplication().setTitle("My Dashboard");

   var dataRange = sheet.getDataRange();
   var dataTable = dataRange.getDataTable(true);

   var catFilter = Charts.newCategoryFilter()
       .setFilterColumnLabel("Category")
       .build();

   var chart = Charts.newPieChart()
       .build();

   var dashboard = Charts.newDashboardPanel()
       .setDataTable(dataTable)
       .bind([catFilter], [chart])
       .build();

   var panel = uiApp.createVerticalPanel()
     .add(chart)
     .add(catFilter);

   dashboard.add(panel);
   uiApp.add(dashboard);
   return uiApp;
}

答案 3 :(得分:0)

附件是一个示例,其中Applescript直观地获取从谷歌电子表格中第一张工作表的单元格A1开始的数据范围。

这是我的第一个stackoverflow答案,所以请提供反馈

我已经重新创建了谷歌饼图Applescript dashboard tutorial,用于引用下面的电子表格:

    function doGet() {
    var uiApp = UiApp.createApplication();
    // type the SpreadsheetKey below within quotes for 
    // example "1MfXR_ELFevumQwEOjWneNL5j2M8aVLgELBOsS41LD5o"
    var ssKey = "1MfXR_ELFevumQwEOjWneNL5j2M8aVLgELBOsS41LD5o";
    var ss = SpreadsheetApp.openById(ssKey);
    var dataRange = ss.getDataRange();
    var data = dataRange.getDataTable(true);

    var ageFilter = Charts.newNumberRangeFilter()
        .setFilterColumnLabel("Age")
        .build();

    var genderFilter = Charts.newCategoryFilter()
        .setFilterColumnLabel("Gender")
        .build();

    var pieChart = Charts.newPieChart()
        .setDataViewDefinition(Charts.newDataViewDefinition()
        .setColumns([0,3]))
        .build();

    var tableChart = Charts.newTableChart()
        .build(); 

    var dashboard = Charts.newDashboardPanel()
        .setDataTable(data)
        .bind([ageFilter, genderFilter], [pieChart, tableChart])
        .build();  
    dashboard.add(uiApp.createVerticalPanel()
          .add(uiApp.createHorizontalPanel()
               .add(ageFilter).add(genderFilter)
               .setSpacing(70))
          .add(uiApp.createHorizontalPanel()
               .add(pieChart).add(tableChart)
               .setSpacing(10)));
    uiApp.add(dashboard);
    return uiApp;
    }