楽天PAYで毎日のように家計簿をつけていますが、支払ってから家計簿に入力するの面倒ですよね…???
- 指定時間ごとにGmailフォルダを見て、24時間以内に届いた「楽天PAY利用通知」の情報をGoogleスプレッドシートへ自動反映
を生成AIに助けを借りて実装しました。
利用通知の情報は
- 支払日
- 支払先
- 金額
の3つなので、今回はこれだけ取得できるようにします。
雑に以下のようなプロンプトをChatGPTに投げたところ
以下のようなフローを実現したい。
- 楽天PAYからGmail宛てに「楽天PAY通知メール」が届く
- 届いたGmailから、以下の情報を取得
- 支払日
- 支払先
- 金額
- 指定のGoogleスプレッドシートにある「家計簿」に情報を追加する
僕はプログラミング初心者なので、難しい言葉は使わず(使っても解説して)、ステップバイステップで、僕が作業出来るまで確認しながら教えてください。
以下の手順で進めていきましょう。難しい言葉が出てきたら横に注釈を入れますので、ひとつずつ確認しながら進めてください。
1. スプレッドシートの準備
- Google ドライブを開き、新しいスプレッドシートを作成します。
- シート名を「家計簿」とか分かりやすい名前に変更。
- 1 行目に見出しを入ります。たとえば:
- A列:支払日
- B列:支払先
- C列:金額
これで、GAS(Google Apps Script)から書き込む準備ができました。
2. Google Apps Script を開く
- スプレッドシートのメニューから 拡張機能 > Apps Script をクリック。
- 別タブでスクリプト編集画面が開きます。
3. コードを貼り付けて解説
スクリプト画面の Code.gs
(デフォルトで開いているファイル)に、以下を丸ごと貼り付けてください。
function importRakutenPay() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('シート1');
// 直近24時間かつ受信トレイに残っているメールだけを検索
const threads = GmailApp.search(
'subject:楽天ペイアプリご利用内容確認メール newer_than:24h in:inbox'
);
threads.forEach(thread => {
thread.getMessages().forEach(msg => {
const body = msg.getPlainBody(); // プレーンテキストで取得
// メール例に合わせてパターン修正
const dateMatch = body.match(/ご利用日時\s*([0-9]{4}\/[0-9]{1,2}\/[0-9]{1,2})/);
const shopMatch = body.match(/ご利用店舗\s*([^\n]+)/);
const amountMatch= body.match(/決済総額\s*¥?([\d,]+)/);
if (dateMatch && shopMatch && amountMatch) {
const payDate = dateMatch[1]; // "2025/03/15"
const payee = shopMatch[1].trim(); // "例:NewDays"
const amount = amountMatch[1].replace(/,/g, ''); // "162"
sheet.appendRow([payDate, payee, amount]);
}
});
// thread.moveToArchive(); // 必要ならアーカイブ
thread.moveToArchive();
});
}
わからないポイントの解説
- GmailApp.search(…):Gmail からメールを「検索」する命令です。
- match(/…/)(正規表現):本文の中から「支払日: YYYY/MM/DD」の形式を探してくれます。
- appendRow([…]):シートの最後に新しい行を書き込む命令です。
4. 実行テスト
- スクリプト画面の ▶(実行)ボタンをクリック。
- 初回は Google への認証画面が出ますので、指示に従って許可してください。
- 実行後、スプレッドシートを開いて新しい行が追加されているか確認しましょう。
5. 自動化(トリガー設定)
このままだと手動で実行する必要があるので、定期的に動くよう設定します。
- Apps Script エディタの左側メニューから「時計マーク(トリガー)」をクリック。
- 右下の「トリガーを追加」をクリック。
- 設定画面で:
- 実行する関数を
importRakutenPay
に - イベントのソースを「時間主導型」
- タイプを「1時間ごと」など好みで選択
- 実行する関数を
- 保存をクリック。
これで、1時間ごとに自動でメールをチェックし、スプレッドシートに追記してくれます。
完了!
上記で、楽天PAYの通知メールを受け取る → 必要情報を抜き出す → シートに書き込む、が自動化されます。
動作がおかしいときは、
- トリガーの実行ログを見てエラー内容を確認
- 正規表現のパターン(
/支払日[::]…/
)を実際のメール本文に合わせて微調整
などを試してみてくださいね。何か分からない部分があれば、また教えてください!
のように届いた。
まずは
1. スプレッドシートの準備
- Google ドライブを開き、新しいスプレッドシートを作成します。
- シート名を「家計簿」とか分かりやすい名前に変更。
- 1 行目に見出しを入ります。たとえば:
- A列:支払日
- B列:支払先
- C列:金額
これで、GAS(Google Apps Script)から書き込む準備ができました。
言う通りにやってみます。
- Googleドライブを開く(https://drive.google.com/drive/home)
- この「+新規」から、「Googleスプレットシート」を選択
- 開いた!!→の「表」は×で消しちゃお。
A1セル、B1セル、C1セルにそれぞれ支払日、支払先、金額と入力
2. Google Apps Script を開く
- スプレッドシートのメニューから 拡張機能 > Apps Script をクリック。
- 別タブでスクリプト編集画面が開きます。
- 拡張機能から、Apps Script をクリック
- これがコード入力画面!!
最初から書いてある
Function myFunction() {
}
↑この部分は不要なので削除しておく
3. コードを貼り付けて解説
スクリプト画面の
Code.gs
(デフォルトで開いているファイル)に、以下を丸ごと貼り付けてください。function importRakutenPay() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('シート1');
// 直近24時間かつ受信トレイに残っているメールだけを検索
const threads = GmailApp.search(
'subject:楽天ペイアプリご利用内容確認メール newer_than:24h in:inbox'
);
threads.forEach(thread => {
thread.getMessages().forEach(msg => {
const body = msg.getPlainBody(); // プレーンテキストで取得
// メール例に合わせてパターン修正
const dateMatch = body.match(/ご利用日時\s*([0-9]{4}\/[0-9]{1,2}\/[0-9]{1,2})/);
const shopMatch = body.match(/ご利用店舗\s*([^\n]+)/);
const amountMatch= body.match(/決済総額\s*¥?([\d,]+)/);
if (dateMatch && shopMatch && amountMatch) {
const payDate = dateMatch[1]; // "例:2025/03/15"
const payee = shopMatch[1].trim(); // "例:NewDays "
const amount = amountMatch[1].replace(/,/g, ''); // "162"
sheet.appendRow([payDate, payee, amount]);
}
});
// thread.moveToArchive(); // 必要ならアーカイブ
thread.moveToArchive();
});
}
- 先ほどから開いているコード入力画面に思いっきりコピペし、同画面上部にある「実行」ボタンをクリック
- 承認を要求されるので、「権限を確認」する。
- その後の画面で、Googleスプレットシートを開いているアカウントを選択
- その後の白い画面で、左下の「詳細」をクリック→「〇〇(安全ではないページ)に移動」をクリック
- アクセス権限にすべてチェックし、「続行」
- スプレッドシートに戻り、出来たか確認!!!(サンプルのデータなので下記画像は気にしないで…)
もし何かうまくいかなかったら、生成AIに「上手く行かなかったんだけど」と言えば、なんとか解決してくれる(経験済)
5. 自動化(トリガー設定)
このままだと手動で実行する必要があるので、定期的に動くよう設定します。
- Apps Script エディタの左側メニューから「時計マーク(トリガー)」をクリック。
- 右下の「トリガーを追加」をクリック。
- 設定画面で:
- 実行する関数を
importRakutenPay
に- イベントのソースを「時間主導型」
- タイプを「1時間ごと」など好みで選択
- 保存をクリック。
これで、1時間ごとに自動でメールをチェックし、スプレッドシートに追記してくれます
もうこの通り設定したら出来るはずです。(すみません、力尽きました…)
ちなみに、Googleスプレットシートをメインで使うアカウントと、楽天PAY通知が届くアカウントが別の場合も載せておきます。
方法①:Gmail フィルターで自動転送する
- B(受信専用アカウント)でログイン
- 右上の ⚙(設定)→ 「すべての設定を表示」
- 「メール転送と POP/IMAP」タブを開き、
- 「転送先アドレスを追加」 で A のメールアドレスを登録
- A 側に届く「確認コード」を B 側で入力して承認
- 「フィルターとブロック中のアドレス」タブで 「新しいフィルタを作成」
- 件名に「ご利用内容確認メール」(または他のキーワード)を入力
- 「フィルタを作成」→次の画面で 「転送する」 にチェック、プルダウンから A を選択
- 保存すると、B に届いた「楽天PAY通知メール」だけを自動で A に転送してくれます。
以降は、A のアカウントの GmailApp.search で転送されたメールを拾えば OK です。
方法②:Gmail の代理アクセス(メール委任)を使う
G Suite(Google Workspace)や普通の Gmail でも「アカウントを委任」すれば、A から B の受信トレイを開けるようになります。
- B にログイン → ⚙ → 「すべての設定を表示」
- 「アカウントとインポート」タブ → 「アカウントへのアクセスを許可:他のアカウントを追加」
- A のメールアドレスを入れて招待
- A に届く確認メールを承認
これで A の Gmail の左上アカウントアイコンから “B の受信トレイ” に切り替えられるようになります。
ただし Apps Script の GmailApp.search()
はスクリプト所有者のメールボックスしか見ない仕様なので、スクリプト実行中に「B のメール」を直接扱うには方法①の自動転送が確実です。
まとめ
- 手軽さ重視 → 方法① の「フィルタ転送」がおすすめ
- 手動で B の受信トレイを参照したい → 方法② の「メール委任」
設定後、A のスクリプトを動かせば、B 宛の楽天PAYメールを転送→A でキャッチ→スプレッドシートに追記、が自動化できます。
ご自身の運用に合わせてお試しください!
楽天PAYのAPIとかまともに調べるのもめんどくさかったので、メールから直接スプレッドシートへ転記するようにしました。
GASは無限に無料なわけでは無いですが、個人でこの程度使う分には無料のまま使える(はず)です。
ただ、これだと食費や交友費などの分類が出来ないので物足りません。
- 想定される支払先に対する分類の表を用意し、それを参照して分類分けする
- 支払先を生成AIに渡して分類分けしてもらい、それをスプレッドシートへ出力
このどちらかが良いかなぁと個人的に思っています。
なんとなく後者の方がカッコいいので、明日か明後日辺りに、LLMのAPIを使って実装してみたいと思います。
コメント