困りごと
クレジットカードのアプリで現在の利用金額を確認するものの、反映が遅いため、家計の管理が難しくなっていました。本当に反映が遅い。確定までの処理云々だろうと理由はわかるものの、日々の管理では困ります。今まさに目の前にあるデザートを買ってよいのかの判断に使用したいのです。
現状、決済の取り消しなどはあまり発生しないので、速報ベースでの把握を実現したくGASでの実装を行いました。
前提
クレジットカードを利用すると毎回同じ形式でメールが届く。
今回はこんなメールが届く想定です。
ご利用頂きありがとうございます。�
ご家族会員さまのカードご利用内容をお知らせいたします。�
◇利用日:2025/08/20 10:42
◇利用先:Visa加盟店�
◇利用取引:買物�
◇利用金額:1,351.00JPY
通知メールは多くが multipart/alternative(text/plain と text/html の両方)で届きます。
私たちが普段目にしているのはHTMLの方ですね。
後続の処理では正規表現で情報を抜き出したいので、text/plainの方で情報を確認するようにしましょう。
Outlookなどでは”メッセージをプレーンテキストで表示”とすると見れるようです。
手順
- SpreadSheetに以下のイメージでheaderを作成する
A:日時 B:店名 C:金額 D:金額(数値) 2025/07/28 ◇利用先:Visa加盟店 ◇利用金額:500.00JPY 500 2025/08/01 ◇利用先:Visa加盟店 ◇利用金額:1,341.00JPY 1,341 - SpreadSheetのF1セルに以下の式を追加
- =SUMPRODUCT((YEAR(A2:A)=YEAR(TODAY())) * (MONTH(A2:A)=MONTH(TODAY())) * (D2:D))
- 当月の金額だけをSUMするということをやっているだけです
- Gmailにフィルタを作って、特定メールを自動でラベル付け
- ラベル作成
- Gmail左サイドバー最下部「もっと見る」→「新しいラベルを作成」
- ラベル名は今回は「食費」と「累計済み」としました。2つ作ってください。
- フィルタ作成
- 右上 ⚙ →「すべての設定を表示」→「フィルタとブロック中のアドレス」→「新しいフィルタを作成」
- 送信元・件名・本文キーワードなどで条件を指定
- 「フィルタを作成」→「ラベルを適用する」で 食費 を選択
- ラベル作成
- Apps Script(GAS)実装
- スプレッドシート上で「拡張機能 → Apps Script」→ 保存
- トリガー設定:Apps Script 画面左「トリガー(時計アイコン)」→「トリガーを追加」
calc_cumulative_price_from_use_notice_email.gs
function myFunction() {
// 検索条件に該当するスレッド一覧を取得
var threads = GmailApp.search('label:食費 -label:累計済み');
// スレッドを一つずつ取り出す
threads.forEach(function(thread) {
// スレッド内のメール一覧を取得
var messages = thread.getMessages();
// メールを一つずつ取り出す
messages.forEach(function(message) {
//メール受領日の取得
var date = message.getDate();
// メール本文
var plainBody = message.getPlainBody();
// 店舗
var store = plainBody.match(/◇利用先:.+/);
// 利用金額
var price = plainBody.match(/◇利用金額:(.+)(円|JPY)/);
var price2 = price[1];
// 書き込むシートを取得
var sheet = SpreadsheetApp.getActive().getSheetByName('シート1');
// 最終行を取得
var lastRow = sheet.getLastRow() + 1;
// セルを取得して値を転記
sheet.getRange(lastRow, 1).setValue(date);
sheet.getRange(lastRow, 2).setValue(store);
sheet.getRange(lastRow, 3).setValue(price);
sheet.getRange(lastRow, 4).setValue(price2);
// 受領日の昇順に並べ替え
var narabekae = sheet.getRange('A2:J');
narabekae.sort({column: 1, ascending: true})
});
// スレッドに転記済みラベルを付ける
var label = GmailApp.getUserLabelByName('累計済み');
thread.addLabel(label);
});
// メールを送信
var sheet = SpreadsheetApp.getActive().getSheetByName('シート1');
var amount = sheet.getRange('F1').getValue();
MailApp.sendEmail({
to: 'xxxxxxxx@gmail.com, xxxxxxxx@gmail.com',
subject: '今月の食費使用状況',
body: '今月の食費は、現在' + amount + '円使用しています。'
});
}
備考
GASは実行回数に制限があるため留意が必要です。
メールのR/W 20,000回/日
トリガー 20
私は毎日12時に現在の利用金額をメールに送るようにしています。これで便利になりました!