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


#はじめに
コロナ対策で、定期的にオフィスの窓を開けて換気が必要なのだが
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](https://script.google.com/home)にアクセス
3. `新しいプロジェクト`をクリック
<img width="610" alt="スクリーンショット 2020-04-02 20.12.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602794/08c313ea-e580-5834-85d2-1369c02b5e21.png">

4. こんな感じのエディタ画面が開く
<img width="612" alt="スクリーンショット 2020-04-02 20.02.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602794/62df902f-a75f-3eb7-3ce6-5a80b2f56067.png">
5. `無題のプロジェクト`に任意の名前をつける
6. 下記のコードをコピペする（デフォルトの`function myFunction() {...`は消してください）
7. `★★★ここに送信したいメールアドレスを入力★★★`の部分に送信したいメールアドレスを入力
8. `⌘command` + `S`で保存


```javascript
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`を選択し、`デバッグボタン（虫みたいなアイコン）`をクリック
<img width="589" alt="スクリーンショット 2020-04-02 20.30.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602794/e4b23af1-a907-6ee9-d4dd-1190138230f9.png">
3. 最初の実行時には、許可を求める画面が出てくるので、許可していく
4. `許可を確認`をクリック
<img width="536" alt="スクリーンショット 2020-04-02 20.35.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602794/a0a1735d-97a7-8a2e-36e4-150be14bc341.png">
5. ログインしているアカウントをクリック
<img width="605" alt="スクリーンショット 2020-04-02 20.35.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602794/5f9b391f-1826-795f-ddf2-0e00ee727716.png">
6. `許可`をクリック
<img width="606" alt="スクリーンショット 2020-04-02 20.39.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602794/8a7664b0-64ae-22de-f6c9-7e3b826b07f4.png">
7. 1.で設定したメールアドレスに、メールが届いていれば成功！

##3. トリガーの設定
スクリプトを書いただけでは、自動送信されません。
最初に1回だけトリガーを設定する必要があります。
1. 時計のアイコンをクリック
<img width="584" alt="スクリーンショット 2020-04-02 20.45.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602794/164d2e03-30f9-3c2f-4deb-e55eb396758c.png">
2. 別タブで開かれるページ右下の`トリガーを追加`をクリック
<img width="667" alt="スクリーンショット 2020-04-02 20.47.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602794/6c591a44-8eca-c7c1-c41d-dfccbacaa96d.png">
3. ポップアップが現れるので、下記のように入力して`保存`
- `実行する関数を選択`：`mail`
- `時間ベースのトリガータイプを選択`：`特定の日時`
- `日時を入力`：最初に実行したい日時を入力
<img width="731" alt="スクリーンショット 2020-04-02 20.50.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602794/9cbb93dc-ab03-2123-c3ed-b712a34acfeb.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つの場合でも必要です。
#####⑩次の正時のトリガーを設置する
メールを送信してもしなくても、次の正時のトリガーを設置するために、関数を呼び出しています。

※ここでは、`setTrigger`と`delTrigger`の説明は省略します。
それぞれ、

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

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

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

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

##参考記事
[【簡単】Gmailでメールを定期的に送信する方法【GAS】](https://ebijun.work/programming/send-gmail-regularly-by-gas)