Google Apps 脚本和表格:appendRow() 定期覆盖最后一行,而不是在下面追加新行

use*_*534 6 concurrency multithreading triggers google-sheets google-apps-script

这是我在 stackoverflow 上的第一个问题。

\n

背景: \n从对appendRow(rowContents)的参考中我了解到此操作是原子的,这意味着处理对工作表最后一行的并发访问并防止潜在的问题。

\n

问题/意外行为: \n但是,我最近意识到,对于将行附加到同一工作表的函数的许多并发实例,最后一行会定期被来自 的新数据覆盖appendRow(rowContents),而不是rowContents作为新行附加到下面最后一排。

\n

过去,我没有遇到appendRow()覆盖工作表上的内容的问题。这似乎是最近才出现的现象。然而,这是我的第一个 GAS 项目,有如此多的并发实例将其进度记录到同一个电子表格/工作表中。

\n

要实现的目标: \n与并发实例的数量无关,脚本应该为每个appendRow() 操作追加一行,而不是覆盖前面的行。

\n

重现问题的小样本:

\n\n

我已经尝试过的:

\n
    \n
  1. 我没有记录到电子表格,而是为每个appendRow()操作发送了一封电子邮件。我可以确认这按预期工作(每次appendRow()操作我都会收到一封电子邮件)
  2. \n
  3. 利用锁服务:只要未达到尝试获取锁的超时时间,每个appendRow()操作都会生成一个新行。一旦达到超时,appendRow()就开始再次覆盖最后一行。
  4. \n
\n

寻求帮助:

\n
    \n
  1. 有人面临同样的问题吗?
  2. \n
  3. 您建议采取哪些解决方法?
  4. \n
  5. 我完全错过了什么吗?
  6. \n
\n

任何想法都受到高度赞赏!

\n

soM*_*rio 2

appendRow()不建议在循环内使用,因为您也可以阅读此处(最佳实践)。

相反:

  for (var i = 0; i < N; i++) {
    var row = [new Date(), task, i]
    s.appendRow(row);
    SpreadsheetApp.flush();
    console.log('row appended: \n',JSON.stringify(row))
  }
Run Code Online (Sandbox Code Playgroud)

你应该这样做:

  var tb = [];
  for (var i = 0; i < N; i++) {
    var row = [new Date(), task, i];
    tb.push(row);
  }
  s.getRange(s.getLastRow()+1,1,tb.length,tb[0].length).setValues(tb);
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,您与电子表格文件交互N一次,而在第二种情况下,只有一次。