【Gmail→LINE】スプレッドシートに書いたメールアドレスで受信したメールをLINEへ転送

# 概要
スプレッドシートに転送したいメールアドレスのリストを作成し、指定したメールアドレスからのメールで、未読のメールをLINEへ転送します。
LINEへ転送する内容は受信日時、送信元、件名です。
GASを使っているため簡単に定期実行できます！

機能のイメージは以下です！
![mails.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327323/e1632c78-915f-d788-9fb1-559899d3b332.png)
↓
![line_notification.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327323/be026b5f-7d3f-37b0-f4e4-ba7fcb32e8d7.png)


# コード
```Javascript

const LINE_TOKEN = "XXXXXXXXXXXXXXXXXX"; // 取得したトークンに置き換えてください

/*
 * GmailからLINEへ転送する
 */
function main() {
 newMessage = fetchContactMail()
 if(newMessage.length > 0){
   for(let i = newMessage.length-1; i >= 0; i--){
     sendLine(newMessage[i])
   }
 }
}

/*
 * メールを取得する
 * @return メールの配列
 */
function fetchContactMail() { 
 // メール検索条件指定
 const mailAdressesStr = getMailAdressesStr();
 const strTerms = 'is:unread (' + mailAdressesStr + ')';
 
 // メールを取得
 const myThreads = GmailApp.search(strTerms);
 const myMssages = GmailApp.getMessagesForThreads(myThreads);
 
 const valMssages = [];
 for(let i = 0; i < myMssages.length;i++){
   // 受信日時を取得
   valMssages[i] = " " + (myMssages[i].slice(-1)[0].getDate().getMonth()+1) + "/"+ myMssages[i].slice(-1)[0].getDate().getDate()
   + " " + myMssages[i].slice(-1)[0].getDate().getHours() + ":" + myMssages[i].slice(-1)[0].getDate().getMinutes();
   const from = "\n[送信元]" + myMssages[i].slice(-1)[0].getFrom();
   const title = "\n\n[件名]" + myMssages[i].slice(-1)[0].getSubject();
   valMssages[i] = valMssages[i] + from + title;
 }
 return valMssages;
}

/*
 * 検索対象のメールアドレスを取得する
 * @return 検索対象のメールアドレス
 */
function getMailAdressesStr() {
  const mySheet = SpreadsheetApp.getActiveSheet();
  const lastRow = mySheet.getLastRow();
  const ROW_2 = 2;
  const COLUMN_1 = 1;
  // 1行目は項目名のため、2行1列目から 全行数-1行分 を取得 
  const adress = mySheet.getRange(ROW_2,COLUMN_1,lastRow-1).getValues();
  let mailAdressesStr = "";
  for (let i = 0; i <= adress.length-1; i++) {
    mailAdressesStr += adress[i];
    if (i != adress.length-1) {
      mailAdressesStr += " OR "
    }
  }
  return mailAdressesStr;
}

/*
 * LINEへ送る
 * @param massage 新着メール
 */
function sendLine(massage){
 const payload = {'message' : massage};
 const options ={
   "method" : "post",
   "payload" : payload,
   "headers" : {"Authorization" : "Bearer "+ LINE_TOKEN}  
 };
 UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);
}
```

# 簡単なコードの解説
## main関数
GASのトリガーで実行するメイン関数。
ここからメールを取得する関数と、LINEへ転送する関数を呼び出しています。GASのトリガー機能を使うことで簡単に定期実行することができます。「10分おきに新着のメールをチェック」といったことができます。実行間隔は1分おき、1時間おき、1日おきなど、調整できます。簡単に設定できますので、「GAS トリガー」などで調べてみてください。

## fetchContactMail関数
メールの検索条件を指定して、LINEへ転送するメールを検索して取得しています。
検索にはGmailAppクラスの関数を使っています。いろいろ検索条件を指定できるので、条件を変更したい場合は以下のドキュメントを見てみるとよいかもしれません。
https://developers.google.com/apps-script/reference/gmail/gmail-app#search(String)

forの中では取得したメールの日時や件名などを抽出して、少しだけ整形しています。

## getMailAdressesStr関数
Gmailを検索するための文字列を生成しています。
スプレッドシートA列のメールアドレスのリストを取得して、それらを`' OR '`でつないでいます。
A列に「aaaa@aaa」と「bbbb@bbb」というアドレスが書いてあったとしたら、「aaaa@aaa OR bbbb@bbb」という文字列を返します。

## sendLine関数
LINE NotifyのAPIへPOSTしています。
LINE Notifyのドキュメントの「通知系」と書いてあるところです。
https://notify-bot.line.me/doc/ja/


`UrlFetch`を使うことでGASでリクエストができます。
https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app#fetch(String)

APIをあまり使い慣れていない方は以下の記事を参考にすると良いと思います。「そもそもAPIって何？」というところから、とてもわかりやすく解説しています。
https://tonari-it.com/gas-web-api-http-urlfetch/#toc6

LINEのトークンの取得は以下の記事を参考にさせていただきました。
https://qiita.com/chivi_dump/items/a62a7b8c32e6ea894a09

# まとめ
自分用のツールとして作ってみたのですが、予想以上に簡単にできて驚きました。
スプレッドシートの列を追加して、「○、✕」とかをC列に作って、「✕」がついているメールアドレスは転送しない、といったこともできそうですね。