如何在电子表格完成计算之前暂停应用程序脚本

use*_*107 7 google-sheets google-apps-script

由于谷歌电子表格不支持迭代,我编写了自己的简单应用程序脚本,根据电子表格输出的计算调整输入.但是,在我更改输入变量后,电子表格会重新计算,但应用程序脚本似乎不会等待重新计算,因此我最终会检索诸如"Thinking ..."或"#NA"之类的值.有没有办法暂停脚本并等待计算完成后再移动到脚本中的下一行?

目前,我只是使用循环来观察单元格,但我想知道是否有一种更优雅的方式暂停执行,直到完成工作表计算.

我编写了很多Excel宏,Excel VBA始终等待计算完成,然后再转到代码中的下一行.Apps脚本似乎没有这样做,所以我希望有一个简单的方法来做到这一点.

第二个问题:因为这个迭代可能需要一些时间,如何中断并终止脚本运行?我似乎找不到办法做到这一点.

Mis*_*awn 7

这是一种非常简单的方法,可以防止下一个脚本启动,直到当前脚本在 google 应用程序脚本中完成。只需在您连续处理的每个脚本之后添加对 testWait() 的调用。SpreadsheetApp.flush() 似乎还将电子表格上的超时计时器重置为默认的 5 分钟,因此您有更多时间一次性处理多个脚本。

//holds processing of next script till last one has completed
function testWait(){
  var lock = LockService.getScriptLock(); lock.waitLock(300000); 
  SpreadsheetApp.flush(); lock.releaseLock();
}
Run Code Online (Sandbox Code Playgroud)

  • 就我而言,只需调用“SpreadsheetApp.flush();”就足够了。不管怎么说,还是要谢谢你! (4认同)

Fre*_*red 5

脚本在大约6分钟后超时,以防止无限循环和不断运行程序.我不认为有一种手动方式来停止脚本.

编辑:哎呀,忘了回答你的第一个问题:我认为onEdit运行后重新计算了值,但显然我没有使用足够的公式来看到这一点.如果它没有等待,那么最好的方法是做这样的事情:

while(value === "Thinking..." || value === "#NA") {
  Utilities.sleep(10000);
}
Run Code Online (Sandbox Code Playgroud)

它会暂停脚本几秒钟,然后再次检查.

  • 只是为了它的价值,对于任何在 Sheets 之外查看这种生产代码设置的人来说,添加一个健全性检查计数器是值得的(如果计数器达到某个较大的值,则退出 while 循环),因为如果由于某种原因这永远不会完成它永远锁定一个线程。我见过这样的代码在服务器缓慢锁定每个线程时会导致服务器宕机...... (2认同)