【问题标题】:Creating Bar Chart - Adding Rows创建条形图 - 添加行
【发布时间】:2014-01-14 18:30:09
【问题描述】:

我正在尝试从谷歌电子表格创建条形图。我不想手动添加每一列和每一行,所以这个例子似乎应该工作并使用 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;
}

【问题讨论】:

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


    【解决方案1】:

    您选择了一个范围'A1:G7'。那是 7 列乘 7 行。现在,您开始通过添加列来构建您的数据表。

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

    2-6:for(var i=1; i&lt;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]);
    }
    

    还有很多其他方法可以做到这一点,但无论您选择哪种方式,只要确保您涵盖了您需要的所有值。

    【讨论】:

    • 谢谢。现在由于某种原因,当我尝试使用 DATE 作为 ColumnType 时,它​​会给出错误“对象与 ColumnType 不匹配”。数据在工作表上采用日期格式。如果我有纯文本的数据,它会工作,但如果我有它作为日期格式。
    • 列中的所有数据必须是同一类型,并且必须与您指定的列类型匹配。空白被解释为字符串。在this questionthis question 中了解更多信息。
    • 列不填空并指定为 DATE。还是不会接受。
    猜你喜欢
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 2012-10-23
    • 2013-04-30
    • 1970-01-01
    相关资源
    最近更新 更多