作者:猫ranran | 来源:互联网 | 2023-01-31 15:36
我希望通过GAS将多行附加到谷歌表,同时考虑到性能和不希望的可能性.
为了实现这一目标,我将使用appendRow
这个解决干预突变的问题,并在单个函数中完成所有操作.
简单示例:
var sheet= SpreadsheetApp.openById(ssId).getSheetByName(sheetName);
sheet.appendRow(["foo", "bar", "foobar"]);
当然要将其扩展到多行,我可以简单地为每一行循环遍历此函数,尽管GAS最佳实践建议不要使用这些实践.
尝试使用appendRow
通过2D阵列添加多行是不成功的,并且使用对辅助数组的引用作为进入行的值导致API.
因此,我想问,有没有办法将多行附加到电子表格中,该电子表格仍然可以处理干预的可变性,appendRow
并尽可能避免循环?
1> Pierre-Marie..:
编辑:答案不满意
在这种情况下,你的答案可悲地不符合我的标准.此方法可能导致行创建和数据插入之间的工作表发生突变.(即:有人插入数据).克服这个是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);
没错,sheet.getRange()方法正在处理现有范围.在这种情况下,您可以使用[Sheet.insertRows(rowIndex,numRows)方法]添加一些行(https://developers.google.com/apps-script/reference/spreadsheet/sheet#insertrowsrowindex-numrows)
尝试使用Lock Service API,它可以防止并发访问并避免"干预突变"
2> 小智..:
我还要确保为此代码段制作一个行和列变量。如果您尝试直接在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);