11
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[GAS]Gmailで、定期的(1時間ごと)にメールを送信する方法

Last updated at Posted at 2020-04-02

#はじめに
コロナ対策で、定期的にオフィスの窓を開けて換気が必要なのだが
1時間ごとに声をかけるのも、メールを作成して送るのも大変(そもそも忘れる)

そこで、GAS(Google Apps Script)でメールを自動で定期的に送信するスクリプトを書いたので共有

#やりたいこと

  • 1時間ごとの毎正時(9:00、10:00、11:00...)に、決まった宛先(全社員が入っているグループアドレス宛)にメールを自動送信したい
  • メールのタイトルに「10:00」など、送信する時間を入れたい
  • 8〜20時の間のみ送りたい
  • 土日以外のみ送りたい

#準備するもの

  • Googleアカウント(無料版でも有料版でもOK)

会社でGmailを使っているならそのアカウントを流用できる
会社のGoogleアカウントがなくても、個人用のアカウントで作成も可能

#手順
大きく3ステップです。
1. プロジェクトの作成
2. スクリプトのテスト
3. トリガーの設定
##1. プロジェクト(スクリプトを書くファイル)の作成

  1. Googleアカウントにログイン
  2. Google Apps Scriptにアクセス
  3. 新しいプロジェクトをクリック
スクリーンショット 2020-04-02 20.12.46.png
  1. こんな感じのエディタ画面が開く
スクリーンショット 2020-04-02 20.02.04.png 5. `無題のプロジェクト`に任意の名前をつける 6. 下記のコードをコピペする(デフォルトの`function myFunction() {...`は消してください) 7. `★★★ここに送信したいメールアドレスを入力★★★`の部分に送信したいメールアドレスを入力 8. `⌘command` + `S`で保存
function mail() {
  var dayNum = new Date().getDay();             //①曜日判定用の変数
  var currentMinutes = new Date().getMinutes(); //②現在時刻の"MM"の部分(何分か)
  //③現在時刻の"MM"の部分が、10より小さいか判定
  if (currentMinutes <=10) {                    
    var currentHour = new Date().getHours();
  } 
  else {
    var currentHour = new Date().getHours()+1;
  }
  var to = ['★★★ここに送信したいメールアドレスを入力★★★'];  //④メール送信先
//複数アドレスに送りたい場合は、下記のように , で区切って入力する
//var to = ['hogehoge@gmail.com, foo@yahoo.co.jp']; 
  var title = "" +currentHour + ":00】換気のお願い";  //⑤メールタイトル
  var body =                                         //⑥メール本文
        "みなさま\n\n" 
        + currentHour + ":00になりました。換気を行ってください。\n\n"
        + "・窓際の方は、【1時間に1回】窓を10分以上あけてください。\n"
        + "・可能であれば、廊下側も空けて通気の確保をしてください。\n"
        + "・窓際の人(MGR)の不在時は、近くの方が必ず窓をあけてください。";
  //⑦曜日判定(日曜日と土曜日の時には処理を避ける)
  if (dayNum != 0 && dayNum != 6) {
    if (currentHour > 7 && currentHour < 21) { //⑧送信する時間を8〜20時に限定
      MailApp.sendEmail(to.join(','), title, body); //⑨メール送信処理
    }
  }
  setTrigger(); //⑩次の正時のトリガーを設置する
}

function setTrigger(){
  delTrigger(); 
  var currentTime = new Date();
  var setTime = new Date(currentTime.setHours(currentTime.getHours()+1));
  setTime.setMinutes("00");
  ScriptApp.newTrigger('mail').timeBased().at(setTime).create();
}

function delTrigger() {
    var triggers = ScriptApp.getProjectTriggers();
    for(var i=0; i < triggers.length; i++) {
        if (triggers[i].getHandlerFunction() == "mail") {
            ScriptApp.deleteTrigger(triggers[i]);
        }
    }
}

##2. スクリプトのテスト
書いたスクリプトが正しく挙動するか確認しましょう
※テストを行う際は、メールの送信先を自分のアドレスに変えるなど、送信しても影響のないものに変更してください。

  1. 送信先のアドレスを、自分のメールアドレスなどに変更する
  2. 関数名でmailを選択し、デバッグボタン(虫みたいなアイコン)をクリック
スクリーンショット 2020-04-02 20.30.51.png 3. 最初の実行時には、許可を求める画面が出てくるので、許可していく 4. `許可を確認`をクリック スクリーンショット 2020-04-02 20.35.06.png 5. ログインしているアカウントをクリック スクリーンショット 2020-04-02 20.35.58.png 6. `許可`をクリック スクリーンショット 2020-04-02 20.39.15.png 7. 1.で設定したメールアドレスに、メールが届いていれば成功!

##3. トリガーの設定
スクリプトを書いただけでは、自動送信されません。
最初に1回だけトリガーを設定する必要があります。

  1. 時計のアイコンをクリック
スクリーンショット 2020-04-02 20.45.15.png 2. 別タブで開かれるページ右下の`トリガーを追加`をクリック スクリーンショット 2020-04-02 20.47.00.png 3. ポップアップが現れるので、下記のように入力して`保存` - `実行する関数を選択`:`mail` - `時間ベースのトリガータイプを選択`:`特定の日時` - `日時を入力`:最初に実行したい日時を入力 スクリーンショット 2020-04-02 20.50.25.png 4. 設定完了! 5. あとは設定した条件で、自動で毎時間メールを送ってくれます

#コード解説
#####①曜日判定用の変数
土曜日(6)と日曜日(0)に送らないように、object.getDay()で曜日を数字で取得しています。
#####②現在時刻の"MM"の部分(何分か)
関数mailを実行した時刻が何分かによって条件分岐させるために、10:01の"01"の部分を取得しています。
#####③現在時刻の"MM"の部分が、10より小さいか判定
関数mailは、正時に起動するように設定していますが、微妙にタイムラグが発生することがあります(9:59や10:01に起動する可能性がある)。
そこで、minutesの部分(:59、:01)を取得してその数字の大きさによって処理を分けています。
こうすることによりタイムラグが発生しても、意図した時間でメール送信ができます。

  • 10以下の場合(10:00〜10:10)→ currentHourは"10"
  • 10より大きい場合(9:10〜9:59)→ currentHourは"10"

※10分以上のタイムラグを確認していないので、適当に10としてます。
#####④メール送信先
送信したいメールアドレスを入力します。
複数アドレスに送りたい場合は、,(カンマ)で区切ってください。
例)var to = ['hogehoge@gmail.com, foo@yahoo.co.jp'];
#####⑤メールタイトル
③で取得した時間を、メールの件名に設定しています。
メールが送信される時間が10:01や9:59だとしても、そこは一律で【10:00】と表示されるようにしています。
#####⑥メール本文
送信されるメール本文の内容です。改行は、""に囲まれた部分で\nです。
サンプル文をメールにすると下記のようなメールが届きます。

みなさま

10:00になりました。換気を行ってください。

・窓際の方は、【1時間に1回】窓を10分以上あけてください。
・可能であれば、廊下側も空けて通気の確保をしてください。
・窓際の人の不在時は、近くの方が必ず窓をあけてください。

#####⑦曜日判定(日曜日と土曜日の時には処理を避ける)
メール送信処理を行う前の条件分岐です。
①で取得した数字をもとに、現在が土曜日(6)でも日曜日(0)でもない場合に、処理を進めています。
#####⑧送信する時間を8〜20時に限定
③で取得した時間をもとに、現在が8〜20時の場合に、メール送信処理を行うように条件分岐しています。
#####⑨メール送信処理
ここでメールを送信しています。
MailApp.sendEmailの引数は(送信先, 件名, 本文)です。
この時、送信先を格納した変数に対して.join(',')のメソッドをつけないと、メールアドレスとしてうまく認識してくれません。
※送信先のアドレスが1つの場合でも必要です。
#####⑩次の正時のトリガーを設置する
メールを送信してもしなくても、次の正時のトリガーを設置するために、関数を呼び出しています。

※ここでは、setTriggerdelTriggerの説明は省略します。
それぞれ、

  • setTrigger:次のmail関数のトリガーを設置するためのもの
  • delTrigger:実行し終わったmail関数のトリガーを削除するためのもの

と考えていただければ問題ありません。

#最後に
コロナウイルスの対策として、3密(密閉、密集、密接)を避けるのが有効とされています。
この定期メールの自動送信で、密閉を解消し、少しでもコロナ感染のリスクを下げられたら幸いです。

私の会社ではこれを導入したことにより、換気が徹底されています。

##参考記事
【簡単】Gmailでメールを定期的に送信する方法【GAS】

11
15
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?