【问题标题】:Set Timeout in Google Apps Scripts在 Google Apps 脚本中设置超时
【发布时间】:2015-04-15 19:43:14
【问题描述】:

是否可以在 Google Apps 脚本中调用 setTimeout 或等效函数?

当我尝试运行以下代码时:

function onSubmit() {
  // we've been called, remove trigger, set timeout, re-enable, and then run function
  destroySubmitHandler();
  setTimeout(function() {
    createSubmitHandler();
    myFunction()
  }, 5 * 1000)
}

我收到以下错误:

【问题讨论】:

  • SetTimeout 是一个浏览器函数,而不是 javascript 因此未定义。使用睡眠但会消耗时间配额。

标签: google-apps-script


【解决方案1】:

显然你可以像这样使用函数Utilities.sleep()

function onSubmit() {
  // we've been called, remove trigger, set timeout, re-enable, and then run function
  destroySubmitHandler();
  Utilities.sleep(5 * 1000)
  createSubmitHandler();
  myFunction()
}

【讨论】:

  • 欢迎回到同步 javascript 的土地。
  • Utilities.sleep() 是让整个脚本进入睡眠状态,还是只是让函数进入睡眠状态?
  • @user1063287,它会立即让脚本休眠指定的毫秒数。
【解决方案2】:

您应该尝试专门设计的功能,以解决并行提交过多的问题:

function onSubmit(e) {
  var lock = LockService.getScriptLock();
  lock.waitLock(30000); // lock 30 seconds

  //do whatever you want here

  lock.releaseLock();
}

据说没有这个锁的id是一样的,参考google dev-document:https://developers.google.com/apps-script/reference/lock/lock

例如,下面是一个apps脚本独立网站功能:

google.script.run.withSuccessHandler(ready).logNow(email);

每次谷歌表格更新表格时我都会锁定它,以防有多个人同时更新它,否则数据可能会相互覆盖:

  var ls = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("logged");
  lock.waitLock(30000);
  ls.getRange(ls.getLastRow()+1, 1).setValue(email);
  lock.releaseLock();

虽然 30 秒看起来很长,但是一旦 setValue() 函数关闭,锁就会被释放。如果你能看懂中文,我推荐这篇文章:https://www.wfublog.com/2017/03/google-apps-script-spreadsheet-delay-write-data.html

【讨论】:

    最近更新 更多