Edited at

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