【GAS】Gmailを定期的に確認し新規メールをSlackに通知する

# はじめに
### 背景
普段メルマガなどメールが大量にきて、スマホの通知がうるさいので止めたい
送信元ごとすべて止めるとたまにくる重要メールなどに気づけない
スマホのメール取得間隔を伸ばすとすぐに見たいメールが来ない
なので、一旦アーカイブして、定期的にメールの件名を取得し、slackに通知するようにした

### 参考にさせていただいたもの
[【決定版】GAS で Gmail の検索結果をスプレッドシートに抽出する方法](https://qiita.com/tanabee/items/17eb721801eff8d97db9)
[【初心者向け】GASを使ってSlackへ自動通知](https://qiita.com/chihiro/items/c7b11abc78f5d806c3a8)

# 設計概要
下記の動作を行う

* Gmailのラベル毎に新規に受信したメールを確認する
* 該当するメールがあれば、件名を抽出し、ラベル毎にslackに通知する
* 確認間隔は12時間ごと

#事前準備
### Gmailの設定
すぐに通知が不要なメールは下記のフィルタを設定

* 受信トレイをスキップ（アーカイブ）
* 任意ラベルをつける

### slackの設定
左カラムの下側にある「Add Apps」をクリック
「incoming-webhook」を検索して、インストール

<img width="400" alt=image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405298/eb5fe9a2-906b-3097-5d80-93e271a1c884.png">

incoming-webhook の設定画面で、「Add Configuration」をクリック

<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405298/ae0e5e2c-fb2e-d3db-8a13-319338506792.png">

投稿したいチャンネルを選択し、「Add Incoming WebHooks integration」をクリック
※ここでは gmail チャンネルを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405298/c18ff920-08f5-bc45-e368-208a237b654a.png)

すると「Webhook URL」が作成される。
後ほど使用するので控えておく

# GAS設定
Google Drive から新規をクリックし、Google Apps Script を選択
下記のスクリプをコピペ　
※一部修正箇所あり（2行目）

```php:mail.gs
function sendToSlack(message) {
  var postUrl = '<Slack Webhook URL>'; // 先程取得した Slack の Webhook URLを指定する
  var username = 'GmailBot';      // 通知時に表示されるユーザー名
  var icon = ':hatching_chick:';  // 通知時に表示されるアイコン
  
  var jsonData =
  {
     "username" : username,
     "icon_emoji": icon,
     "text" : message
  };
  var payload = JSON.stringify(jsonData);

  var options =
  {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : payload
  };

  UrlFetchApp.fetch(postUrl, options);
}

function main() {
  var messages = 'Gmail Check Start!\n';
  var after = parseInt(((new Date()).getTime() - 13 * 60 * 60 * 1000) / 1000);  //13時間前を指定
  
  var labels = GmailApp.getUserLabels();  //ラベル一覧を取得
  for (var i = 0; i < labels.length; i++) {
    var targetLabel = "label:" + labels[i].getName();
    var searchTarget = targetLabel + ' after:' + after
    var subjects = ''
    
    var loopcount = 0;
    GmailApp
    .search(searchTarget, 0, 10)
    .forEach(function (thread) {
      thread.getMessages().forEach(function (message) {
        var subject = message.getSubject();  //メールの件名を取得
        subjects += subject + "\n"
        loopcount++;
      });
    });
    
    if (loopcount === 0) continue;
    messages += "\n" + targetLabel + "\n" + subjects
  }
  
  sendToSlack(messages)
}

```

# テスト実行

main 関数を指定し、実行ボタン▶ をクリック
※初回のみ権限許可について、同意が求められるので、同意する

<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405298/882528ac-7a34-d585-d178-68592c9e85c8.png">

slack に正しく投稿されたら成功！

こんな感じになるはず
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405298/9770f754-8551-8cb0-ded4-262160fd68ac.png">


# 定期実行
プロジェクトのトリガーをクリック
<img width="100" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405298/6962276e-9f5c-c85a-8c7e-9e7abb706355.png">

トリガーを追加をクリックし、下記画像のように設定
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405298/b5e41c46-0a3d-86c9-3d56-8b97bfc8fa43.png">

同様に実行時間を「午後10時～11時」に設定したトリガーを追加する
※トリガーはこの範囲で実行されるため、毎回変動する
※そのため、gasプログラムのafterを13時間としている

# さいごに

複数のアカウントを確認する方法を調べましたが、よくわからず。
とりあえずは、各アカウントごとに同様の設定をするしかなさそう。
どなたか、方法をご存知であればご教示下さい。