イベントトリガーを使ってスプレッドシートが更新時に自動でメールを送る方法

GAS

読んで欲しい人

  • GASを使ってみたい人
  • スプレッドシートの内容をメールしたい人
  • イベントトリガーを使ってみたい人
  • イベントトリガーの実施時にシート内の特定部分の条件判定をしたい人

やれること

イベントトリガーをGASに設定して、データが編集された時点で、指定の条件を満たす場合、メールを対象者に送ることを目的にしています。

スプレッドシートないの特定のセル変化を検知して、イベントトリガーを設定するGASを動作させるということができればベストなのですが、installableイベントトリガーのスプレッドシート関連は起動時・編集時・変更時・フォーム送信時の4つしかなく、特定の列や行が変更されたらというのは、独自Trigerを作成しないとできない記憶です。

そのため、簡易にトリガー設定できる編集時に実行されるトリガーを設定して、値を全て取得した上で、該当するデータが存在した場合、メールを送信するという流れで実装しています。

スプレッドシートと送信メール

下記のようなスプレッドシートを利用します。実際の実務ではより多くのデータが一つのシートの中に含まれているかと思いますが、簡便化のために、ステータス管理するカラムだけ抽出したシートにしています。

今回の設定は、設定1が完了以外(下記では”途中”と”その他”)で、設定2が完了に変更されたものをメールするGASを作成していきます。

今回はNo4の項目を未了→完了に変更して実行結果を表示します。

入力前スプレッドシート
入力後スプレッドシート
送付されたメール

うまく動作しました、それでは実際のコードになります。

対象コード

function sendEmailByEvent() {
  
 //シート内の全データを取得
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();
 
 //変更されたセルを取得、また、セルの行数を取得して配列に対応できるように-1した変数を設定
  var targetCell = sheet.getActiveCell();
  var targetCellRow = targetCell.getRow()-1;
 
 //メール送付先のアドレスとメール題名を設定
  var recipient = "メールの送り先アドレス", subject = "テスト";
  
 //メール本文用に、取得したセルの行データをbody配列にpushする
  var body = []
  body.push(data[targetCellRow])
    
 //今回のメイン。最初のifで変更があったセルが設定2に対応するC列であるかどうかを判断。次のifで設定1が完了以外、設定2が完了になっているかどうかを確認。そして、GmailAppで内容こみのメールを送る
  if(targetCell.getColumn() === 3){
    if(data[targetCellRow][1] !== "完了" && data[targetCellRow][2] ==="完了")
     GmailApp.sendEmail(recipient, subject, body)
  }
}

コード解説

基本コード内の説明書きをみていただければわかると思いますが、一部補足です。

//変更されたセルを取得、また、セルの行数を取得して配列に対応できるように-1した変数を設定
  var targetCell = sheet.getActiveCell();
  var targetCellRow = targetCell.getRow()-1;

後ほど説明するイベントトリガーを編集時にしているので、トリガーが動作するタイミングでは、どなたかがセルを編集しているはずです。そして、そのセルをgetActiveCellで取得できれば、どのセルが変更されたものかを一意で判別できることになります。

この方法で設定しているために、No3も設定1:途中、設定2:完了というNo4と同一の情報ですが、メールが送付されるデータはNo4だけになっています。

イベントトリガーの設定

イベントトリガーの設定

イベントトリガーはイベントソースをスプレッドシートにして、種類を編集時に設定してください。トリガーの設定方法がわからない方は、GASのエディターでストップウォッチボタンを押してもらえれば起動します。

まとめ

よく管理系のシートを作ると特定編集された時に、関連する人に通知を出して欲しいというリクエストを受けます。今回のコードは私が所属するノンプロ研で質問を受けたのを理由に作ってみました。

終わったよーって連絡するのもいいですが、忘れることもあるので、こういう細かい作業はGASさんに自動化してもらいましょう。

コメント