前回の記事で次のように書いた。
今は家計簿をつけるためにレシートから 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 を書いておけばよかった。