0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

クレジットカード利用額をGASで集計して通知する

Last updated at Posted at 2025-08-24

困りごと

クレジットカードのアプリで現在の利用金額を確認するものの、反映が遅いため、家計の管理が難しくなっていました。本当に反映が遅い。確定までの処理云々だろうと理由はわかるものの、日々の管理では困ります。今まさに目の前にあるデザートを買ってよいのかの判断に使用したいのです。
現状、決済の取り消しなどはあまり発生しないので、速報ベースでの把握を実現したくGASでの実装を行いました。

前提

クレジットカードを利用すると毎回同じ形式でメールが届く。
今回はこんなメールが届く想定です。

ご利用頂きありがとうございます。�
ご家族会員さまのカードご利用内容をお知らせいたします。�
◇利用日:2025/08/20 10:42
◇利用先:Visa加盟店�
◇利用取引:買物�
◇利用金額:1,351.00JPY

通知メールは多くが multipart/alternative(text/plain と text/html の両方)で届きます。
私たちが普段目にしているのはHTMLの方ですね。
後続の処理では正規表現で情報を抜き出したいので、text/plainの方で情報を確認するようにしましょう。
Outlookなどでは”メッセージをプレーンテキストで表示”とすると見れるようです。

手順

  1. SpreadSheetに以下のイメージでheaderを作成する
    A:日時 B:店名 C:金額 D:金額(数値)
    2025/07/28 ◇利用先:Visa加盟店 ◇利用金額:500.00JPY 500
    2025/08/01 ◇利用先:Visa加盟店 ◇利用金額:1,341.00JPY 1,341
  2. SpreadSheetのF1セルに以下の式を追加
    • =SUMPRODUCT((YEAR(A2:A)=YEAR(TODAY())) * (MONTH(A2:A)=MONTH(TODAY())) * (D2:D))
    • 当月の金額だけをSUMするということをやっているだけです
  3. Gmailにフィルタを作って、特定メールを自動でラベル付け
    • ラベル作成
      • Gmail左サイドバー最下部「もっと見る」→「新しいラベルを作成」
      • ラベル名は今回は「食費」と「累計済み」としました。2つ作ってください。
    • フィルタ作成
      • 右上 ⚙ →「すべての設定を表示」→「フィルタとブロック中のアドレス」→「新しいフィルタを作成」
      • 送信元・件名・本文キーワードなどで条件を指定
      • 「フィルタを作成」→「ラベルを適用する」で 食費 を選択
  4. 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時に現在の利用金額をメールに送るようにしています。これで便利になりました!

0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?