Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
40
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

Organization

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

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
40
Help us understand the problem. What are the problem?