【GAS】時間ベーストリガーの多重実行を防ぐ(LockService)
概要
Google Apps Script を時間ベーストリガーで実行していると、
前回の実行がまだ終わっていないタイミングで、次回の実行が始まる可能性がある。
その場合、同じ処理が並行して動作し、重複投稿や二重登録が発生するおそれがある。
その対策として、LockService を使用して多重実行を防ぐようにした。
対応内容
エントリーポイントとなる main() でスクリプトロックを取得し、
ロックを取得できなかった場合は処理をスキップするようにした。
また、もともと main() に記述していた業務処理は mainProcess() に分離し、
main() には排他制御のみを持たせる構成に変更した。
変更後のコード
code:main.js
/** エントリーポイント */
function main() {
const lock = LockService.getScriptLock();
if (!lock.tryLock(1000)) {
console.log('前回実行がまだ動作中のため、今回の実行はスキップします。');
return;
}
try {
mainProcess();
SpreadsheetApp.flush();
} finally {
lock.releaseLock();
}
}
ポイント
LockService.getScriptLock() を使う
スクリプト全体に対するロックを取得する。
tryLock(1000) でロック取得を試みる
1秒以内にロックを取得できなければ、その回の実行はスキップする。
定期実行では、無理に待機させるよりもスキップしたほうが運用しやすいと判断した。
finally で releaseLock() する
処理中にエラーが発生しても、最後にロックを解放できるようにしている。
SpreadsheetApp.flush() をロック解放前に呼ぶ
スプレッドシートへの変更を確定させてからロックを解放する。
#GAS #LockService