前回の記事で次のように書いた。

今は家計簿をつけるためにレシートから CSV ファイルを手入力して支出の管理をしているけど、これは時間の無駄だ。

これを解消する GAS (Google Apps Script) を作成したので、紹介しよう。

僕のメインバンクはソニー銀行である。ソニー銀行のキャッシュカードには Visa デビットカード機能がついている。そして、このデビットカードを使用すると明細がメールで通知される。メール本文には次のような内容が含まれている。

姓 名 さま

Sony Bank WALLET(Visaデビット)のご利用がありました。

  • ・カード利用日: 2021年04月25日
  • ・ご利用金額(※):1,000円
  • ・ご利用加盟店:AMAZON CO JP
  • ・承認番号: xxxxxxxx

これらを正規表現で抜き出してスプレッドシートに転記できればよい。具体的には次のような GAS を書いた。

var SearchString = "from:banking@sonybank.net Subject:[Sony Bank WALLET ]Visaデビットご利用のお知らせ -label:processed newer_than:1d";

function _createlabel(labelString) {
  labelDomain = GmailApp.getUserLabelByName(labelString);

  if (labelDomain === null) {
    labelDomain = GmailApp.createLabel(labelString);
  }

  return labelDomain;
}

function kakeiboSpreadsheet() {
  var myThreads = GmailApp.search(SearchString, 0, 5);
  var myMsgs = GmailApp.getMessagesForThreads(myThreads);

  for (var threadIndex = 0; threadIndex < myThreads.length; threadIndex++) {

    var mailBody = myMsgs[threadIndex][0].getPlainBody();

    var date      = mailBody.match(/・カード利用日:(.+)/)[1].trim();
    var amount    = mailBody.match(/・ご利用金額(※):(.+)/)[1].replace('円', '').replace(',', '');
    var shop      = mailBody.match(/・ご利用加盟店:(.+)/)[1].trim();

    Logger.log([date, amount, shop]);

    var objSheet = SpreadsheetApp.getActive().getSheetByName("Sheet1");
    objSheet.appendRow([date, amount, shop]);

    var LabelProceed = _createlabel("processed");
    myThreads[threadIndex].addLabel(LabelProceed);
  }
}

同じメールを誤って二重に処理しないように、"processed" というラベルを処理済みのメールには付加するようにした。

これは便利だ。もっと早く GAS を書いておけばよかった。