
【冬休み自由工作】ついつい埋もれちゃうメールをLINEに通知してみよう
こんばんは、しがない情シスです。
今回はメールをLINEに通知するやつを作ってみたお話です。
お仕事とかじゃなく、お家用のやつですね。
お家用なので作りも雑!運用も雑!
「趣味」ということを免罪符に好きなようにやらせていただこうね〜〜〜!
正月に余った餅をつまむ感覚でお楽しみください。
ことの発端
餅家では家計簿アプリ的なアレで銀行口座の入出金データを管理して家計をどんぶり勘定的にチェックしてます。
(「収支の赤黒がわかればええんじゃい!」くらいの他所様が見たら卒倒レベルの管理と言ってはならない管理)
家計簿アプリ(SaaS)は各銀行口座とAPI連携して口座データを引っ張ってくるわけなのですが、銀行の連携仕様次第では定期的に連携が切れ、データ同期が不能となります。
ネットバンクはそうでもないのだけど、地銀は定期的に切れます。パスワードも未だに定期変更を求められます。(それでも以前よりだいぶ改善されたほう)
「連携不能になったよ〜」というシステム通知はメールで届くようにしていたのですが、まぁ、その、スッと既読つけてスルーしてしまいますよね…はい…すみません…。
家族にも転送してチェックしてもらう必要もあったりしまして。
で、転送設定するか〜と思ったのですが、「転送しても埋もれるんじゃないか?」「Gmailの転送設定仕様がなんか使いづらいなぁ…」と何となくモヤモヤしており、「そんなんやったら家庭内のデファクト連絡手段であるLINEに転送したろ!」と思い至ったわけです。
「そっちの方が面倒じゃない?」とお思いでしょう?
そうです、そっちの方が確実に面倒です。
ただな、これだけは分かるぜ。そんなもんじゃ、憧れは止められねえんだ………!!
ちなみにこの方法を作る(作った)と嫁に報告したら「ITゴリラ」との評価を得ました。
ウホォーウホウホー!!!(キーボードを叩くゴリラ)
つくってみよう
今回は以下のものを使います。
Google Apps Script (GAS)
GmailのAPIを使って特定のメールを検索&LINE通知を送信する処理を実装します。
LINE MessagingAPI
LINEに通知を送るためのAPIサービスです。
あらかじめGoogleドライブなどにGASの保存場所を用意しておくとスムーズですね。
APIトークンなどのクレデンシャルを保存しておく用にパスワードマネージャーのVaultを作っておくのもベネです。
LINE Messaging APIの利用準備
2025年に従来の通知サービスであるLINE Notifyのサービス終了が予告されているので、代替となるLINE Messaging APIの準備を行います。
ざっくり以下の手順で準備を進めていきます。
LINE公式アカウントの作成
LINE Official Account Managerにアクセスし、通知メッセージ用のLINE公式アカウントを作成します。
公式アカウントの各種設定とメッセージ送信のためのAPIアクセスを有効化します。
LINEのAPIアクセストークン発行
LINE Developerにアクセスし、APIアクセストークンを発行します。
通知対象グループの作成
LINEアプリ上で通知を受け取るためのグループを作成します。
作成した公式アカウントをグループに招待し、公式アカウントから通知メッセージを流します。
Webhook設定
LINE Developersの管理画面でWebhook URLを設定し、グループIDを取得するためのスクリプトのURLを指定します。
グループID取得用GASのデプロイ
LINEグループに投稿されたWebhookからトリガーされ、投稿イベント内のJSONを解析してグループIDを取得するGASをデプロイしておきます。
公式アカウントから何らかのメッセージを投稿し、グループIDをあらかじめ取得し、控えておきます。
LINEのグループIDを取得してスプシに吐き出すスクリプトはこちら。
/**
* LINEグループを取得する処理
*/
function doPost(e) {
var events = JSON.parse(e.postData.contents).events;
events.forEach(function(event) {
if (event.type === 'message' && event.source.type === 'group') {
var groupId = event.source.groupId;
// スプレッドシートに記録
var sheet = SpreadsheetApp.openById('スプシのID').getActiveSheet();
sheet.appendRow([new Date(), groupId]);
}
});
return ContentService.createTextOutput(JSON.stringify({ 'content': 'post received' }))
.setMimeType(ContentService.MimeType.JSON);
}
一時的にWebアプリとしてデプロイしておきます。
実際に通知を送信するためには送信対象のLINEグループIDの情報が必要となるのですが、グループIDはグループ参加やグループへのメッセージ送信時などの、何らかのイベント発生時にしか情報取得できません。(管理画面などから確認する手段が無い)
そのため、1回グループIDを取得するためのスクリプトをデプロイし、Webhookで情報をキャッチするという処理を組む必要があります。
なんかすごい面倒ですが、1回IDを取得してしまえばこっちのものです。
詳しい設定手順はこちらの記事をものすごく参考にさせていただきました。感謝!
GASの実装と実行トリガーの設定
次に、GASでの実装と実行トリガーの設定ですね。
GASスクリプトの作成
GmailのAPIを利用して条件に一致するメールを検索するコードを記述します。
LINE Messaging APIに通知を送るためのHTTPリクエストを作成します。
実行トリガーの設定
GASのスクリプトエディタで「時計」アイコンをクリックし、トリガーを設定します。
作成したファンクションに対して、任意のサイクルで実行するトリガーを設定します。
通知を送るスクリプトはこちら。
/**
* 定期的サイクルでメールをチェックしてLINEグループに送信する処理
* 送信先:家族グループLINE
* 送信内容:認証通知メール転送
*/
function checkNotify() {
// スクリプトプロパティからグループIDとアクセストークンを取得
const scriptProperties = PropertiesService.getScriptProperties();
const groupId = scriptProperties.getProperty("LINE_GROUP_ID");
const accessToken = scriptProperties.getProperty("LINE_ACCESS_TOKEN");
if (!groupId || !accessToken) {
Logger.log("グループIDまたはアクセストークンが設定されていません。");
return;
}
// Gmailで指定した条件に合致するメールを検索(1日以内に受信)
// * 条件は適宜変更してください。
const searchQuery = 'subject:(XXXX 認証) newer_than:1d';
const threads = GmailApp.search(searchQuery);
if (threads.length === 0) {
Logger.log("該当するメールはありません。");
return;
}
// 最新のメールスレッドを取得
const messages = threads[0].getMessages();
const latestMessage = messages[messages.length - 1];
const subject = latestMessage.getSubject();
// const body = latestMessage.getPlainBody();
// LINEに通知するメッセージ
const notificationMessage = `認証メールアラートがあります。\n\n件名: ${subject}\n\n金融機関との連携設定をすぐにチェックしてください!\nhttps://XXXX.YYY\n\n※毎日12時に定期実行しています。`;
// LINEに通知
sendLineMessage(groupId, accessToken, notificationMessage);
}
メールを受信したら着火する仕組みはGmailAPIには存在しないので、スケジュールトリガーにして定時実行にします。
メール受信をトリガーにしたい場合は、もうおとなしくZapierとかを使いましょう。
私の場合はユースケース的に定時実行でぜんぜんOKなのでこれで設定しちゃいます。
おわりに
実装時のコードとこの記事は、もうGPTさんに作ってもらいました。

コードは正直自分で書くより奇麗ですね…🫠
ちょっとしたものはぜんぜんこれで十分クオリティ、普通に動きましたし、数箇所手直しするだけでOKでした。
記事もあらかじめ過去の記事を食べさせた上で「お前は鬼無里餅衛門になるのだ…」「ちがう…もっと面白みを足せ…」ってプロンプトを投げて生成してもらったのですが、学習が足りなかったかプロンプトが甘かったか「なんか違うなぁ」というトーンになりました。
まだまだトンチキ具合は人間の方が上ですね!!
…そこしか勝てるところが無い………。
2025年はもっとAIさんと仲良くなる年にしようと思います!