向电子表格添加多行 - Google Apps脚本

dbr*_*dbr 9 google-apps-script google-spreadsheet-api

我希望通过GAS将多行附加到谷歌表,同时考虑到性能和不希望的可能性.

为了实现这一目标,我将使用appendRow这个解决干预突变的问题,并在单个函数中完成所有操作.

简单示例:

var sheet= SpreadsheetApp.openById(ssId).getSheetByName(sheetName);
sheet.appendRow(["foo", "bar", "foobar"]);
Run Code Online (Sandbox Code Playgroud)

当然要将其扩展到多行,我可以简单地为每一行循环遍历此函数,尽管GAS最佳实践建议不要使用这些实践.

尝试使用appendRow通过2D阵列添加多行是不成功的,并且使用对辅助数组的引用作为进入行的值导致API.

因此,我想问,有没有办法将多行附加到电子表格中,该电子表格仍然可以处理干预的可变性,appendRow并尽可能避免循环?

Pie*_*ard 10

编辑:答案不满意

在这种情况下,你的答案可悲地不符合我的标准.此方法可能导致行创建和数据插入之间的工作表发生突变.(即:有人插入数据).克服这个是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);
Run Code Online (Sandbox Code Playgroud)

  • 没错,sheet.getRange()方法正在处理现有范围.在这种情况下,您可以使用[Sheet.insertRows(rowIndex,numRows)方法]添加一些行(https://developers.google.com/apps-script/reference/spreadsheet/sheet#insertrowsrowindex-numrows) (2认同)
  • 尝试使用Lock Service API,它可以防止并发访问并避免"干预突变" (2认同)

小智 7

我还要确保为此代码段制作一个行和列变量。如果您尝试直接在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);
Run Code Online (Sandbox Code Playgroud)

  • 不是原子操作。 (2认同)

Dim*_*gns 3

您应该查看Sheet Class的官方文档,其中列出了许多批量行插入方法,其中一种可能符合您的条件。如果这还不够,您可能需要考虑高级纸张服务

编辑

针对您的评论,我不认为有一种方法可以作为纯粹的原子操作批量添加行和数据。但是有一种方法可以通过LockService API来解决您对干预突变的担忧。该服务允许您防止并发访问代码块,因此对于您的用例,您可以利用批量插入方法来创建新行并填充它们,而不必担心突变。

  • 锁服务。你这个该死的天才 (3认同)