0

我正在尝试将我的项目从 ScriptDB 存储转换为电子表格存储。我一直在使用 ScriptDB 时遇到问题,而这个先前的答案有一些关于电子表格令人惊讶的相对速度的重要数据。

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

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

  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)一次写入每个对象一行。

4

1 回答 1

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 库及其 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 与电子表格的性能比较,你应该考虑你在做什么操作。ScriptDB 旨在快速访问键控数据 - 它能够响应搜索匹配的查询,而不是先前答案中分析的一部分。我只是这样说,以便您了解这一点,并且我鼓励您自己在自己的应用程序中进行一些测量,以确定是否有必要离开 ScriptDB。

于 2013-06-06T13:50:35.293 回答