皆さんは家計簿をつけていますでしょうか?
私はもう何年も前からMoneytreeで収入と支出を管理しておりました。
Moneytree 家計簿より楽チン
Moneytree無料posted withアプリーチ
ご存じの通り、Moneytreeは銀行口座やクレジットカード、証券口座などから自動で明細を取得してくれて、自動で毎月の明細等を作成してくれるので非常に便利に使わせて頂いております。
Moneytreeで不満な所
そんなMoneytreeではありますが、幾つか不満点がありました。
- 現金、楽天ペイ、iD(チケットレストラン)の自動入力・更新が出来ない。
- (無料版を使っているために)明細のダウンロードができない。
1.については、現金を利用しても自動でMoneytreeが更新されるなんてことは当然無いので、手動入力が必要になります。また、楽天ペイについてもMoneytreeでは対応されておらず、これも手動入力が必要でした。更に、会社の福利厚生制度でチケットレストランというのを使っていて、実態はiDになるのですが、これもMoneytreeでは自動連係できないみたいでした・・・。
2.についてはダウンロードできなくても良いかなと最初は思っていましたが、FIREに向けて自分がどれだけお金を使っているのかを可視化しようとした際に、1年前の分までしか見れずにちょっと困っておりました。自分がどれだけお金を使っているのかがある程度正確に分からないと、FIREのためにどれだけ資産を増やせば良いのか分からなくなってしまうため、これはマズイというわけです。
そこで、自分で家計簿をつけよう!と思い始めたわけです。(念のため他にもアプリ等を探してみましたけど、私の不満点を無料で解消できるのは無さそうでした。)
家計簿を何で作るのか
そこで早速家計簿を作ってみると行きたいわけですが、まずは何で作るのかの検討が必要となりました。
とはいっても、これは簡単に決まりました。無料かつPCでもスマホでも簡単に入力・閲覧ができる手段として、Googleスプレッドシートで作成することとしました。
楽天ペイの連携はある程度自動化したい
さて、本記事の本題となります。
私は普段の買い物に結構な頻度で楽天ペイを使っております。楽天キャッシュからの利用としておくことで、楽天ポイントが貰えて良い感じですし、使えるお店も結構あるので重宝しております。
そんな楽天ペイではありますが、いかんせんMoneytreeには自動連係されないということで、これをまずはどげんかせんといかん!と思ったわけです。
なんか簡単で良い方法無いかな~と散歩中に考えていたところ、ふと思い付きました。毎回楽天ペイを利用すると”楽天ペイアプリご利用内容確認メール”というタイトルのメールが送られてくるなと。このメールから、ご利用日時、ご利用店舗、決済総額を抜き出してスプレッドシートに自動で書き出せば良いじゃん!と。
そこで、GmailからGoogleスプレッドシートへの転記する方法について調べてみたところ、以下の記事を見付けました。
とても素晴らしい記事でした!なんせ、私がやりたいことの8割くらいはこの記事で可能となります。
追加で自分で実装しないといけない部分としては、以下だけとなります。
- 楽天ペイからのメールに対してのみ処理するようにする
- そのメールから、ご利用日時、ご利用店舗、決済総額を抜き出す
実装
方針が決まったところで、早速実装していきます。
- Googleドライブを開き、家計簿用にGoogleスプレッドシートを新規作成し、”2024”と名前を付ける。(これは勿論、皆様のお好きな名前で問題ありません。)
- そのスプレッドシートを開き、”楽天ペイ”というシートを作成する。
- メニュー欄の”拡張機能”->”Apps Script”を選択して開く。
- エディタ画面で、後ほど記載する完成プログラムを入力する。
- トリガー画面に移動し、”トリガーを追加”ボタンを押下する。
- トリガーの追加画面では、以下の設定を行ってから、保存ボタンを押下する。
・イベントのソースを選択:時間主導型
・時間ベースのトリガーのタイプを選択:時間ベースのタイマー
・時間の感覚を選択(時間):12時間おき(ここは好きなのを選んでOK)
以上で完了となります。これで、12時間おきにメールを見に行ってくれて、該当するメールがあればスプレッドシートに転記してくれるようになりました。
完成プログラム
function myFunction() {
// 検索条件に該当するスレッド一覧を取得
var threads = GmailApp.search('subject:楽天ペイアプリご利用内容確認メール -label:処理済み');
// スレッドを1個づつ取り出す
threads.forEach(function(thread) {
// スレッド内のメール一覧を取得
var messages = thread.getMessages();
// 書き込むスプレッドシートを取得
var sheet = SpreadsheetApp.getActive().getSheetByName('楽天ペイ');
// メールを1個づつ取り出す
messages.forEach(function(message) {
// メール本文を取得
var plainBody = message.getPlainBody();
// 'ご利用日時'の取り出し
var indexForDate = plainBody.indexOf('ご利用日時');
var indexForDateLength = plainBody.slice(indexForDate).indexOf('(');
var date = plainBody.slice(indexForDate+7, indexForDate+indexForDateLength);
// 'ご利用店舗'の取り出し
var indexForStore = plainBody.indexOf('ご利用店舗');
var indexForStoreLength = plainBody.slice(indexForStore).indexOf('\n');
var store = plainBody.slice(indexForStore+7, indexForStore+indexForStoreLength);
// '決済総額'の場所を抽出しておく
var indexForPrice = plainBody.indexOf('決済総額');
var indexForPriceLength = plainBody.slice(indexForPrice).indexOf('円');
var price = plainBody.slice(indexForPrice+7, indexForPrice+indexForPriceLength);
// スプレッドシートの最終行を取得
var lastRow = sheet.getRange(sheet.getMaxRows(), 1).getNextDataCell(SpreadsheetApp.Direction.UP).getRow() + 1;
// スプレッドシートに書き込む
sheet.getRange(lastRow, 1).setValue(date);
sheet.getRange(lastRow, 2).setValue(store);
sheet.getRange(lastRow, 3).setValue(price);
});
// スレッドに処理済みラベルを付ける
var label = GmailApp.getUserLabelByName('処理済み');
thread.addLabel(label);
});
}
コメント