連載
» 2019年02月19日 05時00分 公開

働く価値を上げる“VBA/GAS”術(14):「仕事完了! でも報告メールは面倒くさい」――GASで実現する報告メール自動化術 (2/3)

[高橋宣成,プランノーツ]

ToDo完了メール送信スクリプト

 ToDoシートのステータスを「完了」に切り替えた際に動作する関数「onChangeStatus(e)」を以下に記載します。

function onChangeStatus(e){
  var cell = e.range;
  var status = e.value;
  var sheet = cell.getSheet();
  var column = cell.getColumn();
  var row = cell.getRow();
  var lastRow = sheet.getLastRow();
    
  if(column === 5 && row >= 2 && row <= lastRow && status === '完了'){
    sendEmail(row);
  }
}

 このスクリプトは、GASで用意されている「トリガー」という仕組みを使って、セルが編集されたときに自動で動作するように設定しています。

 スクリプトの動作は、以下の条件が全て成立したときに、別の関数「sendEmail(row)」を呼び出すというものです。

  • 変更されたセルの列数が5と等しい
  • 変更されたセルの行数が2以上であり、データのある最終行数以下である
  • 変更後のセルの値が「完了」である

 また、関数onChangeStatus(e)から呼び出される関数sendEmail(row)を以下に記載します。

function sendEmail(row){
  
  var FIELDS = {
    no: 0,
    task: 2,
    status: 4
  }
  
  var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
  var index = row - 1;
  var myNo = values[index][FIELDS.no];
  var task = values[index][FIELDS.task];
  
  var recipient = 'example@example.com';
  var recipientName = '皆様';
  var subject = '';
  subject += 'タスク完了メール: [' + myNo + '] ';
  subject += task;
  
  var body = '';
  body += recipientName + '\n';
  body += '以下のタスクが完了しました\n';
  body += '[' + myNo + '] ' + task;
  
  GmailApp.sendEmail(recipient, subject, body);
  
}

 このプロシージャのおおまかな処理の流れは以下になります。

  1. 列指定用のオブジェクト「FIELDS」の定義
  2. アクティブシートのデータ全体を二次元配列に格納し、No.とタスクを取り出す
  3. メールの送信先アドレス、件名、本文を文字列として生成
  4. メールの作成および送信

イベントとトリガー

 GASでは「指定した日時」「スプレッドシートを編集したとき」「フォームを投稿したとき」など、特定のイベントが発生したときに自動的にスクリプトを実行させるトリガーという機能があります。

 トリガーには、「G Suite Developer Hub」という管理画面から設定する「インストーラブルトリガー」と、特定の関数名で作成する「シンプルトリガー」の2種類があります。インストーラブルトリガーでは、以下のようなイベントに応じたトリガーが設置可能です。

  • スプレッドシートから
    • 起動時
    • 編集時
    • 変更時
    • フォーム送信時
  • 時間主導型
    • 特定の日時
    • 分ベースのタイマー
    • 時間ベースのタイマー
    • 日付ベースのタイマー
    • 週ベースのタイマー
    • 月ベースのタイマー
  • カレンダーから
    • カレンダー更新済み

 一方、シンプルトリガーでは、以下の5種類のトリガーを設置できます。

  • 起動時(onOpen)
  • 編集時(onEdit)
  • インストール時(onInstall)
  • WebアプリケーションへのGETリクエスト(doGet)
  • WebアプリケーションへのPOSTリクエスト(doPost)

 比較するとインストーラブルトリガーの方が設定できるトリガーのバリエーションが豊富です。シンプルトリガーは簡単に設置可能ですが、種類も少なく使用上の制約も多く設定されています。今回は、インストーラブルトリガーの「スプレッドシートから」→「編集時」のトリガーを設定する方針で進めていきます。

 なお、このトリガーを使用する場合は、イベントの対象となるスプレッドシートのコンテナバインドスクリプトで作成する必要があるので、注意してください。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。