スキルアップを始める!

【GAS】1行目のセルにチェックが入ったら行のデータをGmailで自動メール送信するスクリプト(Part2)

GAS(GoogleAppsScript)
GAS(GoogleAppsScript)
この記事は約4分で読めます。

※記事中に広告情報を含みます。

スキルを手に入れた時、人は強くなれる。
Youtubeでスキルアップを始める 電子書籍でスキルアップを始める
\ワードプレスのスキルアップはこちら!/ WordPress入門読本

前回までで、セルの位置を取得して、メールの自動送信までは成功しました。

排他制御を設定する

前回までの振り返りです。

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行目にチェックが入った場合に、排他制御をして送信するスクリプトができました。

つづく。

URLをコピーしました!