创建条形图 - 添加行

时间:2014-01-14 18:30:09

标签: javascript google-apps-script google-sheets google-visualization

我正在尝试从Google电子表格创建条形图。我不想手动添加每个列和行,因此看起来这个示例应该可以工作并使用for循环自动执行该过程。

以下示例来自https://sites.google.com/site/appsscripttutorial/chart-services/bar-chart

错误显示“行有太多单元格。最多应该是列数。”

function doGet(){
  //Get the data from spreadsheet
  ssID ='SpreadsheetID';//Change it to yours
  var SS = SpreadsheetApp.openById('ssID');
  var sheet = SS.getSheets()[0];
  var data = sheet.getRange('A1:G7').getValues();

  //Build data table
  var dataTable = Charts.newDataTable();

  //Add Column types
  dataTable.addColumn(Charts.ColumnType.STRING, data[0][0]);
  for(var i=1; i<data[0].length-1; i++){
    dataTable.addColumn(Charts.ColumnType.NUMBER, data[0][i]);
  }

  //Add rows
  for(var j=1; j<data.length; j++){
    dataTable.addRow(data[j]);
    Logger.log(data[j])
  }

  //Create and build chart
  var chart = Charts.newBarChart()
      .setDataTable(dataTable)
      .setTitle("Sales by store")
      .build();

  var app = UiApp.createApplication().setTitle("AST Chart");
  app.add(chart)
  return app;
}

1 个答案:

答案 0 :(得分:2)

您选择了范围'A1:G7'。这是7列7行。现在,您可以通过添加列来开始构建dataTable。

1:dataTable.addColumn(Charts.ColumnType.STRING, data[0][0]);

2-6:for(var i=1; i<data[0].length-1; i++)

请参阅data[0].length等于7,循环遍历1, 2, 3, 4, 5,所有数字均小于6

然后,当您开始添加数据行时,dataTable中没有足够的列,您会看到错误。 (现在很清楚,不是吗?)

要修复它,请更改循环上限。

//Add Column types
dataTable.addColumn(Charts.ColumnType.STRING, data[0][0]);
for(var i=1; i<data[0].length; i++) {
  dataTable.addColumn(Charts.ColumnType.NUMBER,data[0][i]);
}

...或遍历所有列,在循环内做出类型决定......

//Add Column types
for(var i=0; i<data[0].length; i++) {
  if (i == 0) {
    dataTable.addColumn(Charts.ColumnType.STRING,data[0][i]);
  }
  else {
    dataTable.addColumn(Charts.ColumnType.NUMBER,data[0][i]);
  }
}

......或同样的事情,但使用三元运算符来减少代码...

//Add Column types
for(var i=0; i<data[0].length; i++){
  dataTable.addColumn(
     i==0 ? Charts.ColumnType.STRING : Charts.ColumnType.NUMBER,
     data[0][i]);
}

您可以通过许多其他方式执行此操作,但无论您选择哪种方式,只需确保覆盖所需的全部值即可。