2

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

但是,在我深入研究该触发器的脚本之前,我很想知道“表单提交”触发器是否可靠。例如,它会立即触发吗?如果同时(或几乎同时)提交 2 个(或更多)表单会发生什么?附加到该触发器的脚本会分别并按顺序处理每个表单提交吗?最终,我主要担心的是,如果先前的脚本仍在运行,而从表单提交中附加新记录,则附加记录将被跳过测试。

另一种选择是“时间驱动”触发器,尽管这需要测试所有数据,然后处理满足特定标准的记录。我不反对使用这种类型的触发器,但它需要更复杂的脚本,以及不同的流程方法。

有没有人可以与我分享与“提交表单”触发器相关的成功/恐怖故事?

4

1 回答 1

2

请参阅: 类锁定

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

// 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 读取之后但在新值写回之前可能会发生变化。

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

于 2013-04-17T19:06:44.607 回答