我正在尝试将我的项目从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)每次写一行一行。
答案 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。