2

新しいフォーム データがスプレッドシートに追加されたら、テストと操作が必要なデータを送信するフォームがあります。したがって、「フォーム送信時」トリガーを使用して最新のエントリ (新しい最終行) を処理したいと考えています。

ただし、そのトリガーのスクリプト作成に深く入り込む前に、「フォーム送信時」トリガーが信頼できるかどうかを知りたいと思っています。たとえば、すぐにトリガーされますか? また、2 つ (またはそれ以上) のフォーム送信が同時に (またはほぼ同時に) 行われた場合はどうなりますか? そのトリガーに添付されたスクリプトは、各フォーム送信を個別に順番に処理しますか? 最終的に私の主な懸念は、フォーム送信から新しいレコードが追加されている間に以前のスクリプトがまだ実行されている場合、追加されたレコードがテストからスキップされることです。

もう 1 つの方法は「時間駆動型」のトリガーですが、これにはすべてのデータをテストしてから、特定の基準を満たすレコードを操作する必要があります。私はそのような種類のトリガーを使用することに反対していませんが、より複雑なスクリプトと、プロセスへの別のアプローチが必要になります。

「フォーム送信時」トリガーに関連する成功/恐怖の話を私と共有できる人はいますか?

4

1 に答える 1

2

参照: クラスロック

相互排除ロックの表現。このクラスを使用すると、スクリプトは、スクリプトの 1 つのインスタンスのみがコードの特定のセクションを一度に実行することを確認できます。これは、ユーザー アクションによって共有リソースが変更される可能性があり、それらが衝突しないようにする必要があるコールバックとトリガーに特に役立ちます。次の例は、フォーム送信ハンドラーでロックを使用する方法を示しています。

// 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 がない場合、2 人のユーザーがほぼ同時にフォームを送信すると、最終的にチケット番号が同じになる可能性があります。これは、lastTicketNumber プロパティが ScriptProperties から読み取られた後、新しい値が書き戻される前に変更される可能性があるためです。

上記は、新しく改善されたドキュメントからコピーされたものです。

于 2013-04-17T19:06:44.607 に答える