写入电子表格 - 可以用不同长度的行写入吗?

时间:2013-06-06 12:51:25

标签: google-apps-script google-sheets

我正在尝试将我的项目从ScriptDB存储转换为电子表格存储。我一直有使用ScriptDB的问题,this previous answer有一些关于电子表格令人惊讶的相对速度的精彩数据。

我的问题是我的对象可以有多种属性,我不确定是否有可能有效地批量写入这种数据。

我可能有一个快速测试数组,如:

  var arrData = [["sku:6100","price:16.00","Brand:Widget","Stock:2"],
                 ["sku:6102","price:13.00","Brand:Widget","Stock:2","Somethingelse:3"]]

用以下内容编写:

      var data_write = sheet.getRange(1, 1, arrData.length, 5).setValues(prod_data);

会给我一个关于“5”长度值的投诉,说它应该是4.如果我使用4它说应该是5.有没有办法强制setValues()写这样的数组?

如果没有,我可以看到的另外两个选项是:1)遍历我的数组并用空单元格值填充它以均衡每一行的长度,或者2)每次写一行一行。

1 个答案:

答案 0 :(得分:1)

假设只需将数据从ScriptDB移动到电子表格一次,性能就不是一个大问题了。您可以遍历每一行prod_data是您根据arrData中的数据创建的数组(问题中的选项2):

for (var row=0; row < prod_data.length; row++) {
  var data_write = sheet.getRange(1, 1, 1, prod_data[row].length).setValues(prod_data[row]);
}

但是 - 您可能会发现输出数据与列名不一致,因为不保证对象属性的顺序。如果这是一个问题,替代解决方案(如您的选项1)将利用ObjService library及其objectToArray()方法。通过这样做,每一行将具有相同的长度,并且所有属性将根据标题的顺序最终在行数组中对齐。

var headers = ["sku","price","Brand","Stock","Somethingelse"...];
var prod_data = [];
prod_data.push(headers);
for (var row=0; row < arrData.length; row++) {
  // get a 2D array from this object
  var rowData = objectToArray(headers,arrData[row]);
  prod_data.push(rowData[0]);
}
var data_write = sheet.getRange(1, 1, rowData.length, rowData[0].length).setValues(prod_data);

WRT与ScriptDB和Spreadsheets的性能比较,你应该考虑你正在做什么操作。 ScriptDB旨在快速访问键控数据 - 它能够响应搜索匹配的查询不是之前答案中的分析的一部分。我只是这样说,所以你知道它,我鼓励你自己在自己的应用程序中做一些测量,以决定是否需要移出ScriptDB。