LoginSignup
4
3

More than 3 years have passed since last update.

GoogleAppsScriptでGmailをLinebot に通知する。

Last updated at Posted at 2020-07-08

GMail to Line Bot

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

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

説明.png

version

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

Prerequisites

  • registration line-developers

 Messaging API利用 こちらから

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

Preparation

1) line-developersログイン

  line-developersを開いて、ログインする。

2) Provider選択

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

2) Create a channel

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

Program

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

google apps Scriptを開いて、新しい空のプロジェクトをクリックする。

0.png

2) ソースコード

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

1.png

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

github

/* ------------------------------------------------------- */
// 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

以下設定を参考に保存をクリック。
3.png

以上

Note

GmailApp.searchの複数条件について(追記:2020.07.14)

  • AND条件:半角スペースで区切る ※必要に応じて()で囲む
  • OR条件:{}で囲む
4
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3