GoogleAppsScriptでGmailをLinebot に通知する。

# GMail to Line Bot
小学校からの緊急メールが埋もれてしまい、見落としが発生した。
このため、使用頻度の高いLINEで管理できるよう以下に変更した。

GMAILを指定条件(未読かつ指定ラベル)で検索した結果をLINE BOTに通知する。
これはNotifyでも可能だが、LINE BOTならお友達にも使ってもらえるため選択した。

![説明.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238338/41ae02c9-b323-0971-e207-40989d45f748.png)

# version
| date     | ver | note |
| -------- | --- | -----|
|2020-07-08|v0.0.1||
|2020-07-14|v0.0.2|label複数条件の設定方法を追記|

# Prerequisites
- registration line-developers

　Messaging API利用 [こちらから](https://developers.line.biz/ja/)

　フリープランOK
　　- 月額利用料： 無料
　　- メッセージ配信数（無料分）: 1000通
　　- 追加メッセージ料金: 追加購入不可

- registration google account

    google Apps Script利用　[こちらから](https://www.google.com/accounts/NewAccount?hl=ja)

# Preparation

1) line-developersログイン

　 [line-developers](https://developers.line.biz/ja/)を開いて、ログインする。

2) Provider選択

　Providerがない場合、CreateしてProviderをクリックする。

2) Create a channel
    
　Messaging APIを選択し、必要情報を入力してCreateする。
　Messaging API settingsの「Channel access token」は後で使います。

# Program
1) 新しい空のプロジェクトを作成

[google apps Script](https://script.google.com/home/start)を開いて、新しい空のプロジェクトをクリックする。

![0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238338/7d65a1f7-e305-58cb-a30e-0c135e004d4b.png)

2) ソースコード

Apps Scriptのエディタに下記ソースを貼り付ける。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238338/dec1228c-ff1b-0b40-d93e-44c88b5a752c.png)

■ 設定について
- LINEBOT_CHANNEL_TOKEN : Messaging API settingsのChannel access tokenから取得したもの
- LINE_NOTIFY_TOKEN : LINE Notifyを使う場合はこちら
- GMAIL_QUERY : gmailのラベル名を指定する

[github](https://github.com/sanlike0911/gas-gmail-to-linebot/blob/0884/main.gs#L1)

```javascript
/* ------------------------------------------------------- */
// setting: LINE BOT
var LINEBOT_CHANNEL_TOKEN = 'XXXXXXXXXXXXXXXX'; 

// setting: Line Notify ※必要であれば
var LINE_NOTIFY_TOKEN = "XXXXXXXXXXXXXXXX";

// setting: GAMIL ※未読 かつ ラベル名(下記サンプルのラベル条件は複数指定[OR])
var GMAIL_QUERY = "is:unread label:{ラベル名1 ラベル名2}";
/* ------------------------------------------------------- */

// func: LINE BOT
function pushMessageLineBot( _message ) {
    var _postData = {
        "messages": [{
        "type": "text",
        "text": _message,
        }]
    };

    var _url = "https://api.line.me/v2/bot/message/broadcast";
    var _headers = {
        "Content-Type": "application/json",
        'Authorization': 'Bearer ' + LINEBOT_CHANNEL_TOKEN,
    };

    var _options = {
        "method": "post",
        "headers": _headers,
        "payload": JSON.stringify(_postData)
    };
    var response = UrlFetchApp.fetch(_url, _options);
}

// func: LINE Notify ※必要であれば
function pushLineNotify(_message){
    var _options = {
        "method"  : "post",
        "payload" : {'message' : _message},
        "headers" : {"Authorization" : "Bearer "+ LINE_NOTIFY_TOKEN}  
    };
    UrlFetchApp.fetch("https://notify-api.line.me/api/notify", _options);
}

// func: get GMAIL message
function getMessageGmail() {

    // Search Gmail with the given query.
    var _gmailThread = GmailApp.search(GMAIL_QUERY);
    var _messages = GmailApp.getMessagesForThreads(_gmailThread);
    var _items = [];

    for(var _idx = 0; _idx < _messages.length;_idx++){
        _items[_idx] =            
            "\n[from]\n" + _messages[_idx].slice(-1)[0].getFrom()
            + "\n"
            + "\n[date]\n"
            + _messages[_idx].slice(-1)[0].getDate().getFullYear()
            + "/" + _messages[_idx].slice(-1)[0].getDate().getMonth()
            + "/" + _messages[_idx].slice(-1)[0].getDate().getDate() 
            + " " + _messages[_idx].slice(-1)[0].getDate().getHours()
            + ":" + _messages[_idx].slice(-1)[0].getDate().getMinutes()
            + "\n"
            + "\n[sbject]\n" + _messages[_idx].slice(-1)[0].getSubject()
            + "\n"
            + "\n[Message]\n"+ _messages[_idx].slice(-1)[0].getPlainBody()
            + "\n";
        _messages[_idx][0].markRead();
    }

    return _items;
}

// func: main
function main() {
    _items = getMessageGmail()
    if( _items.length > 0 ){
        for( var _idx = ( _items.length - 1) ; _idx >= 0; _idx-- ){
            //pushLineNotify( _items[ _idx ] );
            pushMessageLineBot( _items[ _idx ] );
        }
    }
}
```

3) トリガー作成

時計アイコンをクリックする。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238338/60eb0311-cf54-65c3-8156-b7da9ada1f9c.png)

以下設定を参考に保存をクリック。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238338/92db9a6c-a003-b5fc-89c9-c635f3d69ec9.png)

以上

# Note
### GmailApp.searchの複数条件について(追記：2020.07.14)
- AND条件：半角スペースで区切る　※必要に応じて()で囲む
- OR条件：{}で囲む