我希望通过GAS将多行添加到Google工作表中,同时考虑到性能和不受欢迎的可能性。
要为单行实现此目的,我会使用appendRow
来解决干预突变的问题,并在单个函数中完成所有操作。
简单示例:
var sheet= SpreadsheetApp.openById(ssId).getSheetByName(sheetName);
sheet.appendRow(["foo", "bar", "foobar"]);
当然要将它扩展到多行,我可以简单地为每一行循环这个函数,尽管GAS最佳实践建议不要这样做。
尝试使用appendRow
通过2D数组添加多行是不成功的,并且使用对辅助数组的引用作为进入行的值,从而导致API。
因此,我想问,有没有办法将多行附加到电子表格中,该电子表格仍然可以处理appendRow
所做的干预可变性,并尽可能避免循环?
答案 0 :(得分:9)
编辑:答案不满意
在这种情况下,你的答案可悲地不符合我的标准。这种方法可以导致 在行创建和数据之间的工作表的突变 插入。 (即:有人插入数据)。克服这个是关键 appendRow的奖金
原始答案:
您可以使用Range.setValues()方法立即设置值。你只需要获得良好的范围(具有数组长度)和良好的位置(使用sheet.getLastRow() +1方法)。这是一个例子:
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var example = [[1,2,3],[4,5,6],[7,8,9]];
sheet.getRange(sheet.getLastRow()+1, 1, example.length, example[0].length).setValues(example);
答案 1 :(得分:5)
我还要确保为此代码段制作一个行和列变量。如果您尝试直接在getrange函数中添加object.length,则GAS有时会抛出错误。即
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var example = [[1,2,3],[4,5,6],[7,8,9]];
var row = example.length;
var column = example[0].length;
sheet.getRange(sheet.getLastRow()+1, 1, row, column).setValues(example);
答案 2 :(得分:1)
您应该查看Sheet Class的官方文档,列出了许多批量行插入方法,其中一种方法可能符合您的标准。如果证明不足,您可能需要查看Advanced Sheet Service。
修改强>
在回复您的评论时,我不相信有一种方法可以批量添加行和数据作为纯粹的原子操作。但是有一种方法可以通过LockService API解决您对干预突变的担忧。此服务允许您阻止对代码块的并发访问,因此对于您的用例,您可以利用批量插入方法创建新行并填充它们而不必担心突变。