我正在更改Google电子表格中的一些数据单元格。我想将数据写回电子表格。我遇到的问题是表单有5列,当我将新数据添加到其中一个单元格中时,我希望备份该行中下一个空闲单元格中的旧数据。当我这样做时,我无法回写数据。这是我的代码。
var sheet = SpreadsheetApp.openByUrl("URL");
var d = sheet.getSheetByName('Form Responses').getDataRange().getValues();
var head = sheet.getSheetByName('Form Responses').getRange(1,1,1,sheet.getLastColumn()).getValues()[0];
d[29][2] = "A";
d[29][3] = "B";
d[29][4] = "C";
d[29][5] = "D";
sheet.getSheetByName('Form Responses').getRange(1,1,d.length,d[0].length).setValues(d);
这是我得到的错误。 Incorrect range width, was 6 but should be 5
我也尝试将回写语句修改为
sheet.getSheetByName('Form Responses').getRange(29,1,1,d[29].length).setValues(d[29]);
在这种情况下,我得到Cannot convert Array to Object[][].
回写数据的正确方法是什么。我最好只想回写该特定行的数据,而不是整个工作表数据。
答案 0 :(得分:1)
这里的问题是你只修改数组中的一个“行”,以便最后它不再是“symetric”(即每行不具有相同的长度)并导致你得到的错误。
可能的解决方案:
可能有多种避免该错误的好方法,您可以使用新数据(相同高度)创建第二个数组,并在写回工作表之前连接数组,或者如下例所示添加单元格(或许多单元格)在为循环分配新值之前,循环中的每一行。根据数组的大小,可以比另一个更好和/或更容易实现......这是一个应该有效的简化示例:
for(var n=0;n<d.length;n++){
d[n].push('');
Logger.log('row '+n+' = '+d[n]+'\n');// see the result
}
编辑以下评论:
如果您只更改一行,则可以写一行,只需将代码更改为
即可sheet.getSheetByName('Form Responses').getRange(29,1,1,d[29].length).setValues([d[29]])
这与您尝试过的距离不远,但您只是缺少一对括号来获取setValues()
所需的2D数组