在表单提交触发器上 - 来自Google文档表单的脚本结果

时间:2013-04-17 19:00:02

标签: google-apps-script google-docs

我有一个提交数据的表单,一旦新的表单数据被附加到电子表格,就需要进行测试和操作。因此,我希望使用“On form submit”触发器来处理最新的条目(新的最后一行)。

然而,在我深入了解该触发器的脚本之前,我很想知道“On form submit”触发器是否可靠。例如,它会立即触发吗?如果2(或更多)形式提交同时(或几乎同时)发生会发生什么?脚本是否会附加到该触发器进程,每个表单提交单独和顺序? 最后,我主要担心的是,如果从表单提交中追加新记录时,如果前一个脚本仍在运行,则会跳过测试的附加记录。

另一种选择是“时间驱动”触发器,但这需要测试所有数据,然后操纵符合特定条件的记录。我并不反对使用这种类型的触发器,但它需要更复杂的脚本,以及不同的流程方法。

有没有人有与他们可以与我分享的“On form submit”触发器相关的成功/恐怖故事?

1 个答案:

答案 0 :(得分:1)

请参阅:Class Lock

互斥锁的表示。此类允许脚本确保一次只有一个脚本实例执行给定的代码段。这对于回调和触发器特别有用,其中用户操作可能会导致对共享资源的更改,并且您希望确保不是冲突。以下示例显示如何在表单提交处理程序中使用锁。

// Generates a unique ticket number for every form submission.
 function onFormSubmit(e) {
   var targetCell = e.range.offset(0, e.range.getNumColumns(), 1, 1);

   // Get a public lock on this script, because we're about to modify a shared resource.
   var lock = LockService.getPublicLock();
   // Wait for up to 30 seconds for other processes to finish.
   lock.waitLock(30000);

   var ticketNumber = Number(ScriptProperties.getProperty('lastTicketNumber')) + 1;
   ScriptProperties.setProperty('lastTicketNumber', ticketNumber);

   // Release the lock so that other processes can continue.
   lock.releaseLock();

   targetCell.setValue(ticketNumber);
 }

如果没有LockService,如果两个用户几乎同时提交表单,则票号最终可能会相同,因为lastTicketNumber属性在从ScriptProperties读取之后但在写回新值之前可能会更改。 / p>

  

以上内容是从新的和改进的文档中复制的。