Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

概要

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

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

KentoDodo
docker-composeが大好き。 昔はiOSやAndroidのフロントエンジニア、今はB向けか社内向けのwebサービスのアプリエンジニアやってます。 実は、気象予報士資格を持ってたりします。趣味は、旅行 のち 天体写真撮影 です。
weathernews
ウェザーニューズは、気象リスクを軽減するための気象情報サービスを行なっています。そのための気象予測やその情報活用に関するサービス開発や研究を行っています。
https://weathernews.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away