GAS を使って gmail を slack で通知してみる

## はじめに
ブラウザのタブをあまり増やしたくないという理由で Gmail 通知を slack に通知させるようにしました。<br>
「そんなことしなくても」と思われるかもしれません、 Gmail の拡張機能が Chrome にはありますから。<br>

そうです。ただ、 GAS でなにかしてみたかっただけです...

## やること
1. slack の Incoming WebHooks の登録
1. Google Apps Script の実装
1. トリガーを設定する

## slack の Incoming WebHooks の登録
まずは、 slack のサービスである [Incoming Webhook](https://api.slack.com/messaging/webhooks) の設定をします。<br>

1. 自動通知用のチャンネルを用意してください。（既存チャンネルでも可）

2. チャンネル上部をクリック

![Slack___general___sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687433/bd2a21ec-1201-05ef-675c-ae10cc36674f.png)

![Slack___gmail-notification___sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687433/5c0df665-305e-1d92-94db-901aea109544.png)

![Slack___gmail-notification___sample-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687433/dbc399af-c2f4-9f48-73d3-9eedbea095cb.png)

5. 作成完了後、Webhook URL の項目に出てくるURLを後で使用します。

## Google Apps Script の実装
GAS の開き方はいろいろあると思いますが、2つ紹介します。

### スプレッドシート経由で開く
1. スプレッドシートを開く
2. 下記の通りクリック


![スクリーンショット_2022-07-15_12_07_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687433/49baad1d-1284-f364-57e4-39b63ec14e4e.png)


### Google ドライブ経由で開く
1. Google ドライブを開く
2. 左上の新規をクリック
3. その他から Google Apps Script を選択

### コードを書きます

```js
// Gmail を取得する
function fetchGmail() {

  // 取得間隔
  const now = Math.floor(new Date().getTime() / 1000);
  const interval = now - (60 * 1); // 取得時間 => 1 = 1分

  // 取得条件
  const terms = '(is:unread after:'+ interval + ')';

  // Gmail　取得
  const threads = GmailApp.search(terms);
  const emails = GmailApp.getMessagesForThreads(threads);

  const value = [];

  if(emails.length === 0) {
    // 未読がない場合のメッセージ
    return ":tada: 未読メールはありません :tada:";
  } else {
    for(const i in emails) {
      // 各要素を取得
      const email = emails[i][0];
      const dateAndTime = (email.getDate().getMonth() + 1) + "月" + (email.getDate().getDate()) + "日 "
                      + (email.getDate().getHours()) + "時" + (("00" + email.getDate().getMinutes()).slice(-2)) + "分";
      const sender = email.getFrom();  // メールの相手
      const subject = email.getSubject(); // 件名
      const text = email.getPlainBody().slice(0,100); // 本文

      value[i] = dateAndTime + "\n\n" + "【from】\n" + sender + "\n\n" + "【sbject】\n" + subject + "\n\n" + "【Message】\n"+ text;
    }

    const email =  "```\n" + value.join('') + "\n```"; // slack でブロックを効かせたいので ``` を使う
    return email;
  }
}

// slack に通知する
const postUrl = "取得した Webhook URL";

function postSlack() {
  const message = fetchGmail();

  var jsonData =
  {
    "username" : 'slack の app 名',
    "text" : message  // メッセージ内容
  };
  var payload = JSON.stringify(jsonData);

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

  UrlFetchApp.fetch(postUrl, options);
}

```

### slack で確認する
画面上部の実行ボタンを押します。<br>
未読の Gmail が投稿されるはずです。
![Slack___gmail-notification___sample-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687433/5ee876ba-6682-0333-9bdc-b45c83325e3d.png)

## トリガーを設定する
画面左のサイドバーからトリガーを選択、右下の + アイコンから新規トリガーを追加します。<br>
時間主導型、分主導型などお好きなトリガーを設定してください。

![スクリーンショット 2022-12-30 11.19.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687433/78d56edf-4aa0-2a6c-4e1d-0866b75e7153.png)

finish!!!

## appendix

GAS はなんでもできます。上げたらきりがないと思いますが、参考までにカレンダー登録もやってみましょう。


```javascript
function createSchedule () {
  const gmail = "Eメールをここに";
  const calender = CalendarApp.getCalendarById(gmail);
  const title = 'test';
  const startDate = new Date('2023/01/01 10:00:00');
  const endDate = new Date('2023/01/01 19:00:00');
  calender.createEvent(title, startDate, endDate);
}
```

初回はアクセス権限の承認が必要になります。

![スクリーンショット 2022-12-30 11.23.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687433/6b70ef1f-b202-3967-b03a-a84efa76e116.png)

いいですね！できてます。

## おわり

いかがでしたでしょうか？
みなさんも GAS を使って遊んでみてください。

## 参考
- https://hoshino-wp.com/gmail-line-gas/
- https://qiita.com/chihiro/items/c7b11abc78f5d806c3a8