use*_*534 6 concurrency multithreading triggers google-sheets google-apps-script
这是我在 stackoverflow 上的第一个问题。
\n背景: \n从对appendRow(rowContents)的参考中我了解到此操作是原子的,这意味着处理对工作表最后一行的并发访问并防止潜在的问题。
\n问题/意外行为: \n但是,我最近意识到,对于将行附加到同一工作表的函数的许多并发实例,最后一行会定期被来自 的新数据覆盖appendRow(rowContents),而不是rowContents作为新行附加到下面最后一排。
过去,我没有遇到appendRow()覆盖工作表上的内容的问题。这似乎是最近才出现的现象。然而,这是我的第一个 GAS 项目,有如此多的并发实例将其进度记录到同一个电子表格/工作表中。
要实现的目标: \n与并发实例的数量无关,脚本应该为每个appendRow() 操作追加一行,而不是覆盖前面的行。
\n重现问题的小样本:
\n我已经尝试过的:
\nappendRow()操作发送了一封电子邮件。我可以确认这按预期工作(每次appendRow()操作我都会收到一封电子邮件)appendRow()操作都会生成一个新行。一旦达到超时,appendRow()就开始再次覆盖最后一行。寻求帮助:
\n任何想法都受到高度赞赏!
\nappendRow()不建议在循环内使用,因为您也可以阅读此处(最佳实践)。
相反:
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一次,而在第二种情况下,只有一次。
| 归档时间: |
|
| 查看次数: |
2593 次 |
| 最近记录: |