【问题标题】:How to wait for Google Form script to finish execution before executing Google sheet script in sheet linked to the form如何在链接到表单的表单中执行 Google 表单脚本之前等待 Google 表单脚本完成执行
【发布时间】:2021-10-17 06:05:46
【问题描述】:

我有两个脚本。一个链接到 Google 表单,另一个链接到 Google 表格。在为链接到 Google 表单的表单执行 Google 表单脚本的主体之前,我需要确保 Google 表单脚本完成执行。如何做到这一点?'

需要等待 Google 表单脚本完成,如下面的代码所示。我不能使用Utilities.sleep,因为它可能会根据执行时间而导致竞争条件。

//SCRIPT LINKED TO FORM
function onFormSubmit(e) {
 //does something
 return;
}
//SCRIPT LINKED TO SHEET
function onFormSubmit(e) {
 // Need to wait here until SCRIPT LINKED TO FORM finishes execution
 return;
}

【问题讨论】:

  • 分享您的代码,因为两行代码不足以提供理解您的问题所需的上下文信息。如果可能,还请描述您所做的事情以及错误所在。
  • 触发器onFormSubmit()在链接表单提交后触发。这就是触发点。可能您的问题出在其他地方。
  • 没有开箱即用的方式。如果您的//SCRIPT LINKED TO FORM 有特定的功能,我们也许可以抓住它。或者,您可以在驱动器中放置一个显示成功或类似内容的文件。也可以只创建一个人工 Web api 并挂上它。取决于您的用例。
  • 查看webapp。将工作表脚本发布为 web 应用程序,并在完成后从表单脚本发出 Urlfetchapp 请求。 chat.stackoverflow.com//transcript/message/53266763#53266763
  • @Julia 虽然叫web app,但它只是一个功能doPost()没有html,没有js,什么都没有。这只是一个简单的api。此外,如果没有minimal reproducible example,我们不确定您在做什么。请发布您的脚本。

标签: google-apps-script google-sheets google-forms race-condition


【解决方案1】:

您表示您有多个表单链接到一个通用电子表格,并且每个表单都有自己的绑定脚本。您描述的问题是多个脚本可能会同时触发,因此最终可能会竞相更新同一个电子表格。电子表格另外还有一个绑定脚本,该脚本也在表单提交触发器上运行。

与其试图协调许多不同脚本项目的时间安排,不如在一个脚本项目中实现所有功能来处理它们。

使用由多个表单调用的standalone script project installable on submit 触发器 - 每个表单一个触发器。

一个脚本应该同时更新表单数据和电子表格。使用Lock Service 确保在任何给定时刻您只运行一个将数据写入电子表格的代码实例。

您可以从绑定到表单的脚本中访问电子表格,如下所示:

function onFormSubmit(e) {
  const lock = LockService.getScriptLock();
  lock.waitLock(60 * 1000);
  const form = e.source;
  // ...adjust form response data in the form's response store
  const spreadsheet = SpreadsheetApp.openById(form.getDestinationId());
  // ...adjust form response data in the spreadsheet
  lock.releaseLock();
  // ...send email
}

此代码假定更新过程总是在一分钟内完成。

【讨论】:

  • 感谢您的建议。不幸的是,我无法实现绑定到表单的脚本中的所有功能,因为我有多个表单链接到一个公共工作表。我还需要从脚本发送电子邮件。我不确定是否可以从绑定到表单的脚本发送 GmailApp 电子邮件。
  • 在这种情况下,您将不得不使用standalone script projectLock ServiceGMailApp 在此上下文中可用。电子邮件将从安装触发器的帐户发送。编辑了答案。
  • 感谢您的建议。使用 LockService.getScriptLock() on entry 和 lock.releaseLock() 保护一张表中的脚本免受多个同时执行;在所有出口。我的理解是,在脚本本身中防止竞争条件应该就足够了。
  • 这很好,但电子表格脚本中的锁定不会帮助您与绑定到表单的其他脚本协调。锁只会在创建它的脚本项目中处于活动状态。要在多个脚本项目之间进行协调,您需要一个“全局”互斥锁。为所有人使用一个脚本会简单得多。
  • 只有两个表单有清单,需要有脚本来解决这个错误。它们在电子表格中的不同工作表上进行操作,因此据我所知无需协调它们。为所有表单使用一个通用脚本将有助于解决无法可靠地同步表单脚本和电子表格脚本的问题。为了使该解决方案起作用,需要有一种方法可以可靠地等待表单提交后更新工作表,然后再执行更正提交的表单脚本。我为此提出了单独的问题,正在等待有关如何完成此操作的回复 (#69607724)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
相关资源
最近更新 更多