前回までで、セルの位置を取得して、メールの自動送信までは成功しました。
排他制御を設定する
前回までの振り返りです。
function onCheck(e) {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const targetSheet = "リスト";
const activeSheetName = e.source.getActiveSheet().getName();
console.log('activeSheetName:' + activeSheetName);
if (activeSheetName == targetSheet) {
onColNumber(e);
}
}
function onColNumber(e) {
const cell = e.range;
const column = cell.getColumn();
if (column === 1 && !cell.isBlank()) {
sendToMail(e);
}
}
function sendToMail(e) {
const mailFrom = "eguweb.jp@gmail.com";
const mailTo = "demo.eguweb@gmail.com";
let subject = "件名です";
let body = "本文テスト\n"
+ "送信します。\n";
GmailApp.sendEmail(mailTo, subject, body, {
from: mailFrom
}
);
}
チェックを入れてみます。
メールが送信されました!
しかし、このままでは、連続でチェックが入った際に、メールが1通しか届かない現象が発生してしまうようです。
メール送信中は、次のスクリプトに待ってもらうように排他制御しておきます。
LockService
排他制御のロックサービスは以下の3種類がありました。
LockService.getDocumentLock()
ドキュメント単位で排他制御
[rml_read_more]
LockService.getScriptLock()
スクリプト単位で排他制御
LockService.getUserLock()
ユーザー単位で排他制御
3種類から選択して使用します。スクリプトで排他制御したい場合は、getScriptLockで良いかもしれません。
排他制御開始/Lock オブジェクトメソッド
tryLock(timeoutInMillis)
他の処理が終了した場合は処理を進めて終わらなければelse 文を実行する。
if (lock.tryLock(500)) {
}else{
console.log("他の処理が実行中です");
}
waitLock(timeoutInMillis)
他の処理が終了した場合は処理を進めて終わらなければエラーを返す。
if (lock.waitLock(500)) {
} catch (e) {
console.log("他の処理が実行中です");
}
tryLockを実装してみます。
if (column === 1 && e.value === "TRUE") {
console.log(row+"行目のチェックが押されました");
if (lock.tryLock(5000)) {
console.log("排他処理が終わったのでsendToMailを実行します");
sendToMail(e);
//リリース
lock.releaseLock();
} else {
console.log("他の処理が実行中です");
}
}
実行されました。
waitLockを実装してみます。
if (column === 1 && e.value === "TRUE") {
console.log(row + "行目のチェックが押されました");
try {
lock.waitLock(5000);
console.log("排他処理が終わったのでsendToMailを実行します");
sendToMail(e);
lock.releaseLock();
} catch (e) {
console.log("他の処理が実行中です");
}
}
実行されました。
まとめ
これで、、Google Sheetsの特定の範囲で1行目にチェックが入った場合に、排他制御をして送信するスクリプトができました。
つづく。