GAS・LINEmessagingAPIを使ってGmailをLINEに転送する

LINE Notifyが3/31に終了するらしい
https://notify-bot.line.me/closing-announce

今まで、Google Apps Scriptを使って、特定のGmailの内容をLINE Notifyに転送していた
転送設定が便利だったため、なくなると非常に困る

ただ、それらの代案としてLINE Messaging API を使用することができるらしい
https://developers.line.biz/ja/services/messaging-api/

【追記】LINE公式アカウントの無料版のメッセージ通数は200通/月のため、上限には注意が必要。
    詳細はコメント参照。
（ ありがたいことにコメントでご指摘いただきました :bow::bow: ）
    


今回、Messaging APIとGoogle Apps Scriptを使用して、「特定のGMailの通知を、LINEに転送する」機能の実装を行なったため、備忘録として残しておくとする
初学者な上に、ChatGPTに頼ったところもあるのでやや不安もある…
間違っていることがあればぜひコメントとしていただきたい


▼公式LINEの設定
1.公式LINE（チャネル）を作成する
https://entry.line.biz/start/jp/
2.設定にあるMessaging APIから[Messaging APIを利用する]を選択する
![Messaging API.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4000966/42fda282-bea9-3381-e948-6cbb91c2dcd2.png)

3.[LINE Developer]へアクセスして、コンソールを選択する
https://developers.line.biz/ja/
4.プロバイダーを作成する
　※名前は後からでも変更できる
5.作成したプロバイダーでチャネル設定を行なう
6.作成したチャネルを選んで、Messaging API 設定を選択する
7.チャンネルアクセストークンを発行して、トークンをコピーする

▼Gmail特定のメールにラベルを設定
フィルタを作成して、ラベルを付与する自動振り分け設定を行なう
https://support.google.com/mail/answer/6579?hl=ja


▼GASの設定：プロジェクトの作成
https://script.google.com/home?hl=ja
1.新しいプロジェクトを作成する
2.プロジェクト名を設定する
3.下記のコードを記述する
　3行目の（Messaging APIのトークン）を上記で取得したトークンの値へ書き換える
 
```
/* ------------------------------------------------------- */
// LINE BOT のチャネルアクセストークン
// これを使用して LINE の API にアクセスします
var LINEBOT_CHANNEL_TOKEN = '（Messaging APIのトークン）'; 

// 検索条件: 未読 & ラベル「LINE」が付いたメールを取得
var GMAIL_QUERY = "is:unread label:LINE";
/* ------------------------------------------------------- */

/**
 * メッセージを LINE BOT に送信する関数
 * @param {string} message 送信するテキストメッセージ
 */
function pushMessageLineBot(message) {
    var options = {
        method: "post",
        headers: {
            "Content-Type": "application/json",
            Authorization: "Bearer " + LINEBOT_CHANNEL_TOKEN,
        },
        payload: JSON.stringify({
            messages: [{ type: "text", text: message }]
        })
    };
    
    // LINEのAPIにリクエストを送信
    UrlFetchApp.fetch("https://api.line.me/v2/bot/message/broadcast", options);
}

/**
 * Gmail から未読のメッセージを取得し、フォーマットしてリストにまとめる関数
 * 取得したメッセージは既読にする
 * @return {string[]} 取得したメールのリスト（フォーマット済み）
 */
function getMessageGmail() {
    var threads = GmailApp.search(GMAIL_QUERY); // 指定の条件に一致するスレッドを取得
    var messages = GmailApp.getMessagesForThreads(threads); // 各スレッド内のメッセージを取得
    var items = [];

    messages.forEach(thread => {
        var latestMessage = thread.pop(); // 各スレッドの最新メッセージを取得
        var date = latestMessage.getDate();
        var formattedDate = `[日時]\n${date.getFullYear()}/${date.getMonth() + 1}/${date.getDate()} ${date.getHours()}:${date.getMinutes()}`;

        // メッセージを読みやすい形式にフォーマット
        items.push(
            `${formattedDate}\n\n[件名]\n${latestMessage.getSubject()}\n\n[本文]\n${latestMessage.getPlainBody()}`
        );

        // スレッド内のすべてのメッセージを既読にする
        thread.forEach(message => message.markRead()); 
    });

    return items;
}

/**
 * メイン関数
 * Gmail から未読メールを取得し、それを LINE BOT で送信する
 */
function main() {
    var items = getMessageGmail();
    items.forEach(item => pushMessageLineBot(item));
}
```

4.実行する関数を選択：main にする
5.保存
6.実行テスト
　ラベルが付与されたメールを受信すると、作成した公式LINEから通知が送付される


▼GASの設定：トリガーの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4000966/44ce41f4-b915-28d5-509d-00ec0d19220b.png)


完了
ここ数日動かしてはいるが、問題なく動いているため、おそらくこれで問題ない作りになっているはず…