【LINE Notify終了】それでも特定のGmailをLINEに自動で通知したい

# はじめに
LINE Notifyのサービス終了に伴い、LINE公式アカウントのMessaging APIとGASスクリプトを利用して、Gmailに送られてくる特定のメールを自動でLINEに通知する仕組みを作りました。

参考にしたのはコチラ▼

https://engineers-box.com/gmail%E3%82%92line%E3%81%AB%E8%BB%A2%E9%80%81%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F%E3%80%82

## 準備すること
### 1.　通知用LINE公式アカウントの作成
まずは通知に使うための[LINE公式アカウント](Uhttps://entry.line.biz/start/jp/?_gl=1*19m1vbc*_ga*MTc1MzQzOTg0Ny4xNzE0NzEzMTYw*_ga_LRN9K71PXW*MTczNzY4MzUzMi42Ny4wLjE3Mzc2ODM1MzIuNjAuMC4w*_gcl_au*MTg2ODU0NTc1Ny4xNzMzOTY3Nzk3 "LINE公式アカウント開設")を作成します。

### 2.　LINE Developersでの設定
* [LINE Developersコンソール](https://developers.line.biz/console/ "LINE Developersコンソール")で、新しいプロバイダーとチャネルを作成します。![チャネルを作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904038/4711c97d-53b3-e111-4630-b930f471993c.png)
* 作成したMessaging APIをクリックして、チャネル基本設定　＞　**チャネルアクセストークン**　と　Messaging API設定　＞　**チャネルシークレット**　を発行します。<font color = "red">（GASで使用）</font>
* Webhookの設定を行い、GASで作成するスクリプトのURLを登録します。<font color = "red">（GASを作成してから設定）</font>

## GASプロジェクトの作成:
![GASを開く.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904038/3b6f242b-a3e9-dfd9-0bce-046ed4ee6473.png)

* Google Apps Scriptで新しいプロジェクトを作成して![コードをコピペ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904038/a32fd08e-a493-2361-2216-b07e3c860c3a.png)下のコードを張り付けます。

```JS
  // Line Message Api用　URL
  const LINEMSGURL = "https://api.line.me/v2/bot/message/broadcast"
  
  // Line Message Api用　トークン
  const CHANELTOKEN = "チャネルアクセストークン"

  // 1分置きにメールの確認を実施
function main() {
  var msg = getNfMailMessage()
  // 結果が空なら終了
  if(msg == undefined) return

  sendMessage(msg)
}

 //Gmailのメールを確認する
function getNfMailMessage() {
  var today = new Date();
  var dateString = Utilities.formatDate(today, "GMT", "yyyy/MM/dd"); // 今日の日付

  // 今日の日付のスレッドを検索
  const threads = GmailApp.search('from:送信元アドレス after:' + dateString);
  
  // 対象のスレッドがなければ、終了
  if (threads.length == 0) return undefined;

  // 未読メールを収集
  var unreadMessages = [];
  threads.forEach(function(thread) {
    var messages = thread.getMessages();
    messages.forEach(function(message) {
      if (message.isUnread()) {
        unreadMessages.push({
          message: message,
          date: message.getDate().getTime()
        });
      }
    });
  });

  // 未読メールがなければ、終了
  if (unreadMessages.length == 0) return undefined;

  // 日時でソート（降順）
  unreadMessages.sort(function(a, b) {
    return b.date - a.date;
  });

  // 最新の未読メールを取得
  var latestMessage = unreadMessages[0].message;

  // デバッグ用ログ
  Logger.log("検索されたスレッド数: " + threads.length);
  Logger.log("未読メール数: " + unreadMessages.length);
  Logger.log("取得したメールの日時: " + new Date(unreadMessages[0].date));
  Logger.log("メールの件名: " + latestMessage.getSubject());

  // メールを既読にする
  latestMessage.markRead();

  // メールから本文を取得
  const res = latestMessage.getPlainBody();

  // 本文がなければ、終了
  if (res == undefined) return undefined;

  return res;
}

// Line Apiでメッセージを送信
function sendMessage(msg) {
  // 送信メッセージ
  const payLoad = {
    "messages" : [ 
      { 
        "type" : "text",
        "text" : msg
      }
    ]
  }
  
  // ヘッダ
  const header = {
      "Content-Type": "application/json",
      "Authorization": "Bearer " + CHANELTOKEN
  }

  // オプション
  const options = {
    "method" : "post",
    "headers" : header,
    "payload" : JSON.stringify(payLoad) 
  }

  // 送信実施
  UrlFetchApp.fetch(LINEMSGURL, options)
}
```

### コードを設定します
下の2か所を変更して保存します。余計なスペースが入らないように注意！
* `'チャネルアクセストークン'`の`''`の間に、LINE Developersで発行した **チャネルアクセストークン（長期）** を張り付けます。
* `'送信元のメールアドレス'`の`''`の間に、通知したい **送信元のメールアドレス** を入れます。
メールの件名で検索したい場合は`subject:"メールタイトル"`に変更

### トリガーを設定します
実行する関数を選択して、1分おきに実行するように設定すれば、ほぼリアルタイムで通知されます。

![トリガーを選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904038/3ca51ad5-e8d4-8cfb-57c1-ec0e43341146.png)
* 時間ベースのトリガーのタイプを選択: 分ベースのタイマー
* 時間の間隔を選択（分）: １分おき

### ウェブアプリとしてデプロイ
GASをデプロイしてスクリプトのURLをLINE DevelopersのWebhook URLに設定します。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904038/e4ea884d-a48e-46af-b568-72efcfdd1d68.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904038/182bb4e1-a654-48f6-aecc-13f5b452e290.png)

## Webhook設定
LINE Developers　の設定に移ります。
管理画面を開いてMessaging API設定　＞　Webhook設定
の箇所にGASでデプロイしたURLを張り付けて更新します。

![Webhook設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904038/a60d7c25-40ff-4488-b20e-0799e4132e8c.png)

これで任意のメールがLINEに通知されるようになります。

### その他注意点など
* セキュリティ: アクセストークンとチャネルシークレットは厳重に管理してください。
* 料金: メッセージ配信を利用するため通数がかかります。無料枠で通知する場合は月200通までとなりますので、利用状況に合わせてプランを選択してください。

### さいごに
初めGmailのスレッドの概念が分からず、同じ日付に複数のメールが届いた場合、1通目だけが通知されるので困りました。

そこでCursorに手伝ってもらい、同じ日付のメールを一旦変数に格納して`forEach`で探すという方法にしたところ上手くいきました。

**メールスレッドについて**参考ページ▼
https://jp.tdsynnex.com/blog/google/gmail-gas/