GoogleAppsScript
gas
gmail
GoogleSpreadSheet

Google Apps Scriptで指定時刻にメールを送信するシステムを作ってみた

概要

ある日、ふと思いました。メールを指定の時刻に自動的に送信できないかな、と。

そこで、今回はGoogle Apps Scriptを使ってGoogleアカウントから自動的にメールを送信してみることにします。

Google Apps Script (GAS) とは

Google Apps Script (略:GAS) とは、Googleアプリやプラットフォーム(スプレットシートやフォームなど)を自動的に扱えるようにするScriptです。
つまり、これを使えば、ドキュメントを元にメールを送信したり、スプレットシートを元にカレンダーにイベントを作成することができます。とても便利!!

GASはJavaScriptにGoogle Appsを操作するためのAPIを備えた形なので、プログラミング初心者でも比較的取り組みやすいのが特長です。

詳細
https://developers.google.com/apps-script/

メール自動送信システムの構築

今回は、メール自動送信システムを構築します。

スプレッドシートの準備

まず、スプレッドシートを1枚用意します。
そのシートの1行目にはヘッダーを、2行目以降には自動送信したいメールを以下のように書きます。

スプレッドシート、例

各項目の意味ですが、

項目名 書く内容 人が書く必要があるか
to 宛先
title メールのタイトル
description メール本文
send_mail 送信予定日時(メールを送信したい日時)
sent_mail 送信完了日時(実際に送信された日時) ×(スクリプトで使用される)

です。

スクリプトファイルの準備

次に、GASを書くためのスクリプトファイルの用意します。
先ほど作成したスプレッドシート内メニューの「ツール」>>「スクリプトエディタ」を選択し、スクリプトファイルを作成します。

デフォルトでコード.gsが作成されるので、そこへセルの情報を元にメールを自動送信するためのスクリプトを書いていきます。

スクリプトの中身

コード.gs
function calledByCron() {
  var sheet = SpreadsheetApp.getActiveSheet();  // シートの取得
  var startRows = 2;  // 開始行数
  var sheetData = sheet.getSheetValues(startRows, 1, sheet.getLastRow(), sheet.getLastColumn());  // シートのデータを取得(2次元配列)
  var dtLimit = new Date();  // 現在時刻を取得

  // シートの各行ごとにデータを取り出す
  sheetData.forEach(function(value, index) {
    // 送信完了していない、かつ送信予定日時が現在時刻より前ならば、メールを送信する
    if (!value[4] && (new Date(value[3])).getTime() < dtLimit.getTime()) {
      MailApp.sendEmail(value[0], value[1], value[2]);  // メールを送信する
      sheet.getRange(startRows + index, 4 + 1).setValue(dtLimit);  // 送信完了日時をシートに書く
    }
  });
}

calledByCron()を実行すれば、メールが自動送信されるという形です。

なお、初回実行時にメールを自動的に送信する権限を許可するかを聞かれますので、許可しておいてください。

実行例

上述の例で、2017/09/12 14:56:55 に calledByCron()を実行した場合、スプレッドシートのsent_time列が以下のように変化します。

スプレッドシート、実行結果

sent_time列の2行目に時刻が自動で入力されました。これは、2行目に設定したメールのみが送信されたという意味です。

で、確認のために送信されたメールをGmail上で開くと・・・
自動送信されたメール

正常に2行目に設定したメールのみが送信されたことが確認できました。(3行目のメールは送信されないことも確認できました。)

実行の自動化

メールが送信されることが確認できたので、calledByCron()をトリガー設定して一定時間ごとに実行するようにすれば、自動送信されるようになります。

ただし、実際のメールの送信が最大で設定よりトリガー実行間隔分遅れる可能性がありますので、ご注意ください。
なお、設定可能トリガー実行間隔は、最小で1分毎(※記事執筆時)です。つまり、1分以内の遅延を許せるなら、この方法が有効となるわけです。

おわりに

Google Apps for Business などGoogleサービスを活用している会社では、GASの使い方次第では大きなコスト削減の可能性を感じました。😃

一方で、当然ですがGoogle側の都合でサービスを変更・停止することがある(大抵、事前告知はあるようですが)ので、依存しすぎには注意したいですね。(とはいえ、やはり便利だから使ってしまいますが。)