やったこと
Google APP Scriptでマネーフォワードからのメールを定期取得
LINE Notify APIを使用してメール本文をLINEに通知
なぜやるのか
- 不正利用やサービスの解約し忘れで意図せず引き落とされてないか怖い
- できるだけリアルタイムに通知を受け取りたい
- 複数のクレジットカードを使用しているので、それぞれの明細を把握するのは手間
- Gmail見る頻度低いので日常的に目に触れるLINEに通知したい
なぜGoogle APP Scriptか
- マネーフォワードにLINE通知機能はない
- IFTTTはLINE通知できるが、Gmailをアクション元に設定できない
- ZapierはGmailをアクション元に設定できるが、LINE通知できない
--> 仕方ないのでGoogle APP Scriptで書く
本題
Gmail側の設定で送信元メールアドレスがマネーフォワードのメールにラベルを付ける
ラベルを付けるとlabel:"ラベル名"で検索できるようになります。
LINE通知に必要なトークンを取得する
LINEに通知はLINE Notify APIを使用します。
以下の記事が分かりやすく説明されていました。
[超簡単]LINE notify を使ってみる
Google APP Scriptで直近30分間に受信したラベルのついたメールを取得してLINEに通知
以下のコードを書く。
var lineToken = "ラインのトークン"
var interval = 30
var label = "ラベル名(今回はmoney_forward)"
function fetchMoneyForwardMail() {
//取得間隔
var now = Math.floor(new Date().getTime() / 1000);
var time = now - (60 * interval);
var searchCond = '(label:' + label + ' after:' + time + ')';
var thread = GmailApp.search(searchCond);
var messages = GmailApp.getMessagesForThreads(thread);
var formattedMsgs = [];
for (var i = 0; i < messages.length; i++) {
formattedMsgs[i] = "\n【date】: " + messages[i].slice(-1)[0].getDate() +
"\n【Subject】: " + messages[i].slice(-1)[0].getSubject() +
"\n【Body】: \n" + messages[i].slice(-1)[0].getPlainBody().slice(0, 200);
return formattedMsgs;
}
}
function send_line(message) {
var payload = {
'message': message
};
var options = {
"method": "post",
"payload": payload,
"headers": {
"Authorization": "Bearer " + lineToken
}
};
UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);
}
function main() {
newMessages = fetchMoneyForwardMail()
if (newMessages && newMessages.length > 0 && newMessages.length < 50) {
for (var i = newMessages.length - 1; i >= 0; i--) {
Logger.log(newMessages[i])
send_line(newMessages[i])
}
}
}
Google APP Scriptの時間ベースイベントで上記処理を30分に一度実行する
以下のように設定します。
GASのスクリプトを指定した時間に自動で実行する方法
以上です!