特定のメールの内容を所属している LINE グループに自動連携する

# はじめに
- ある会に所属しているメンバーの中でメールしか使いたくない人、LINE しか使いたくない人の橋渡しをする
  - 会の会報が毎月末日近辺でメールで送信される
  - 送信者はメールのみを使用している
  - 現在はメール (Gmail) と LINE の両方を使用している会の担当者が受信したメールの内容をコピー＆ペーストして LINE グループのメンバーに伝えている
- 橋渡しの方法として特定のメール (会報) のみを LINE グループに自動連携する
  - 自動連携の方法として Google Apps Script と LINE Notify を使用する

# Google Apps Script (以降 GAS と表記す) とは
- Google が開発・提供しているプログラミング言語で JavaScript という Web ブラウザ上で動作するプログラミング言語をベースに作成されている
- Google サービスとの連携・自動化が容易
  - Google サービス以外でも各 Web サービスが提供している API 等を利用可能
- 無料
- 開発環境不要 (Google アカウントとブラウザ必須)

# LINE Notify とは
- Web サービスと連携すると LINE が提供する公式アカウント "LINE Notify" から通知が届きます。
複数のサービスと連携でき、グループでも通知を受信することが可能です ([LINE Notify](https://notify-bot.line.me/ja/) より)
- メールの受信など様々なサービスの通知を LINE 上で受け取ることが可能になる
  - ユーザーとしては連携した外部 Web サービスの通知を LINE 上で一括管理できるというメリットがある
- アクセスするためには事前にアカウントを作成しておく必要あり

# 特定のメールの内容を所属している LINE グループに自動連携する手順

# [LINE Notify](https://notify-bot.line.me/ja/) での作業
- LINE Notify にアクセス＆ログインする
![top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583362/16cb03f9-91c7-904b-01aa-d2b6282b1f46.png)

- マイページに移動しトークンの発行を行う (対象のトークルーム選択画面が表示される)
![publish.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583362/e93b7688-b2f8-c108-40b1-1ecabd3234f5.png)

- 発行されたトークン (イメージ) をコピーする
![token.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583362/4ca6dd64-39b2-c60c-c516-6b7b574ee7e1.png)


# GAS で連携処理のコードを記述する
- [GAS](https://script.google.com/home) にアクセスし新しいプロジェクトの作成からエディタが開かれる
- 処理概要
  1. Gmail で受信したメールの中から condition に合致するメールを取得する
  1. 発行されたトークンを指定し、かつメールの日時、タイトル、本文を抽出して LINE Notify の API にわたす
  1. 処理対象となったメールに処理済み判定用のスターを付与する
- 処理を記述する

```
// 条件指定：メールタイトルに特定の文字列を含む、かつ、特定の送信者
var condition = "(subject:XXXX会報 from:dummy@dummy.dummy)";
 
function getMail(){
 
  // 条件にマッチするスレッドを取得する (最大 10)
  var threads = GmailApp.search(condition, 0, 10); 
  // 各スレッドから個々のメールを取得して二次元配列に格納する
  var messages = GmailApp.getMessagesForThreads(threads);
 
  for(var i in messages){
    for(var j in messages[i]){
 
      // スター無しメールのみを処理する
      if(!messages[i][j].isStarred()){ 
        
        // メールの日時
        var strDate = messages[i][j].getDate() + "\n";
        // メールタイトル
        var strSubject = messages[i][j].getSubject() + "\n";
        // メール本文
        var strMessage = messages[i][j].getPlainBody();
        
        // line に取得したメールの内容を送信する
        sendLine(strDate, strSubject, strMessage);
 
        // line に送信したメールにはスターを付与する
        messages[i][j].star(); 
      }
    }
  }
}

function sendLine(strDate, strSubject, strMessage){
   
  // line に送信するためのトークン
  var strToken = "999999999999999999999999999999";
  var options =
   {
     "method"  : "post",
     "payload" : "message=" + strDate + strSubject + strMessage,
     "headers" : {"Authorization" : "Bearer "+ strToken}
   };

   UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);
}
```


- トリガーの設定
  - 先述した連携処理を定期的に呼び出すためのトリガー設定を行う
  - サンプルとしてはデイリーで午後 1 時から 2 時の間で実行するように設定している
![trigger.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583362/4b975408-24d0-f7fe-a8b3-59724e8e06d9.png)

# 注意点
- LINE Notify のアカウントを通知したいグループに招待しておく必要あり
- LINE 上に表示されるメールの受信日時がアメリカ東部標準時になっている
  - appsscript.json 上でデフォルトのタイムゾーンが America/New_York になっているので日時を表示したい場合は Asia/Tokyo に更新する必要あり
![timeZone.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583362/0071dfcc-bc22-c711-119d-26724008fdcf.png)


# 所感
　連携される日時の問題はあったが、全体的にはスムーズに実装から実際のメール内容の連携を行うことができた。
　個人的に、また普段の業務を行うレベルではこのようなギャップは起こりにくいが情報の連携という観点で GAS を利用してその他のツールを連携がおこなえれば老若男女などで生じる使用できるツールの差分を埋めていくことが出来ると感じられた。

# 参考にしたページ
https://gadgelaun.com/?p=18985