Gmailに届いた楽天PAY利用通知から、家計簿へ自動反映

楽天PAYで毎日のように家計簿をつけていますが、支払ってから家計簿に入力するの面倒ですよね…???

  • 指定時間ごとにGmailフォルダを見て、24時間以内に届いた「楽天PAY利用通知」の情報をGoogleスプレッドシートへ自動反映

を生成AIに助けを借りて実装しました。
利用通知の情報は

  • 支払日
  • 支払先
  • 金額

の3つなので、今回はこれだけ取得できるようにします。

雑に以下のようなプロンプトをChatGPTに投げたところ

以下のようなフローを実現したい。

  1. 楽天PAYからGmail宛てに「楽天PAY通知メール」が届く
  2. 届いたGmailから、以下の情報を取得
    • 支払日
    • 支払先
    • 金額
  3. 指定のGoogleスプレッドシートにある「家計簿」に情報を追加する

僕はプログラミング初心者なので、難しい言葉は使わず(使っても解説して)、ステップバイステップで、僕が作業出来るまで確認しながら教えてください。

以下の手順で進めていきましょう。難しい言葉が出てきたら横に注釈を入れますので、ひとつずつ確認しながら進めてください。


1. スプレッドシートの準備

  1. Google ドライブを開き、新しいスプレッドシートを作成します。
  2. シート名を「家計簿」とか分かりやすい名前に変更。
  3. 1 行目に見出しを入ります。たとえば:
    • A列:支払日
    • B列:支払先
    • C列:金額

これで、GAS(Google Apps Script)から書き込む準備ができました。


2. Google Apps Script を開く

  1. スプレッドシートのメニューから 拡張機能 > Apps Script をクリック。
  2. 別タブでスクリプト編集画面が開きます。

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. 実行テスト

  1. スクリプト画面の ▶(実行)ボタンをクリック。
  2. 初回は Google への認証画面が出ますので、指示に従って許可してください。
  3. 実行後、スプレッドシートを開いて新しい行が追加されているか確認しましょう。

5. 自動化(トリガー設定)

このままだと手動で実行する必要があるので、定期的に動くよう設定します。

  1. Apps Script エディタの左側メニューから「時計マーク(トリガー)」をクリック。
  2. 右下の「トリガーを追加」をクリック。
  3. 設定画面で:
    • 実行する関数を importRakutenPay
    • イベントのソースを「時間主導型」
    • タイプを「1時間ごと」など好みで選択
  4. 保存をクリック。

これで、1時間ごとに自動でメールをチェックし、スプレッドシートに追記してくれます。


完了!

上記で、楽天PAYの通知メールを受け取る → 必要情報を抜き出す → シートに書き込む、が自動化されます。
動作がおかしいときは、

  • トリガーの実行ログを見てエラー内容を確認
  • 正規表現のパターン(/支払日[::]…/)を実際のメール本文に合わせて微調整

などを試してみてくださいね。何か分からない部分があれば、また教えてください!

のように届いた。

まずは

1. スプレッドシートの準備

  1. Google ドライブを開き、新しいスプレッドシートを作成します。
  2. シート名を「家計簿」とか分かりやすい名前に変更。
  3. 1 行目に見出しを入ります。たとえば:
    • A列:支払日
    • B列:支払先
    • C列:金額

これで、GAS(Google Apps Script)から書き込む準備ができました。

言う通りにやってみます。

  1. Googleドライブを開く(https://drive.google.com/drive/home
  2. この「+新規」から、「Googleスプレットシート」を選択
  3. 開いた!!→の「表」は×で消しちゃお。
    A1セル、B1セル、C1セルにそれぞれ支払日、支払先、金額と入力

2. Google Apps Script を開く

  1. スプレッドシートのメニューから 拡張機能 > Apps Script をクリック。
  2. 別タブでスクリプト編集画面が開きます。
  1. 拡張機能から、Apps Script をクリック

  2. これがコード入力画面!!

    最初から書いてある
    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();
});
}
  1. 先ほどから開いているコード入力画面に思いっきりコピペし、同画面上部にある「実行」ボタンをクリック
  2. 承認を要求されるので、「権限を確認」する。
  3. その後の画面で、Googleスプレットシートを開いているアカウントを選択
  4. アクセス権限にすべてチェックし、「続行」
  5. スプレッドシートに戻り、出来たか確認!!!(サンプルのデータなので下記画像は気にしないで…)

    もし何かうまくいかなかったら、生成AIに「上手く行かなかったんだけど」と言えば、なんとか解決してくれる(経験済)

5. 自動化(トリガー設定)

このままだと手動で実行する必要があるので、定期的に動くよう設定します。

  1. Apps Script エディタの左側メニューから「時計マーク(トリガー)」をクリック。
  2. 右下の「トリガーを追加」をクリック。
  3. 設定画面で:
    • 実行する関数を importRakutenPay
    • イベントのソースを「時間主導型」
    • タイプを「1時間ごと」など好みで選択
  4. 保存をクリック。

これで、1時間ごとに自動でメールをチェックし、スプレッドシートに追記してくれます

もうこの通り設定したら出来るはずです。(すみません、力尽きました…)

ちなみに、Googleスプレットシートをメインで使うアカウントと、楽天PAY通知が届くアカウントが別の場合も載せておきます。

方法①:Gmail フィルターで自動転送する

  1. B(受信専用アカウント)でログイン
  2. 右上の ⚙(設定)→ 「すべての設定を表示」
  3. 「メール転送と POP/IMAP」タブを開き、
    1. 「転送先アドレスを追加」 で A のメールアドレスを登録
    2. A 側に届く「確認コード」を B 側で入力して承認
  4. 「フィルターとブロック中のアドレス」タブで 「新しいフィルタを作成」
    • 件名に「ご利用内容確認メール」(または他のキーワード)を入力
    • 「フィルタを作成」→次の画面で 「転送する」 にチェック、プルダウンから A を選択
  5. 保存すると、B に届いた「楽天PAY通知メール」だけを自動で A に転送してくれます。

以降は、A のアカウントの GmailApp.search で転送されたメールを拾えば OK です。


方法②:Gmail の代理アクセス(メール委任)を使う

G Suite(Google Workspace)や普通の Gmail でも「アカウントを委任」すれば、A から B の受信トレイを開けるようになります。

  1. B にログイン → ⚙ → 「すべての設定を表示」
  2. 「アカウントとインポート」タブ → 「アカウントへのアクセスを許可:他のアカウントを追加」
  3. A のメールアドレスを入れて招待
  4. A に届く確認メールを承認

これで A の Gmail の左上アカウントアイコンから “B の受信トレイ” に切り替えられるようになります。
ただし Apps Script の GmailApp.search()スクリプト所有者のメールボックスしか見ない仕様なので、スクリプト実行中に「B のメール」を直接扱うには方法①の自動転送が確実です。


まとめ

  • 手軽さ重視 → 方法① の「フィルタ転送」がおすすめ
  • 手動で B の受信トレイを参照したい → 方法② の「メール委任」

設定後、A のスクリプトを動かせば、B 宛の楽天PAYメールを転送→A でキャッチ→スプレッドシートに追記、が自動化できます。
ご自身の運用に合わせてお試しください!

楽天PAYのAPIとかまともに調べるのもめんどくさかったので、メールから直接スプレッドシートへ転記するようにしました。

GASは無限に無料なわけでは無いですが、個人でこの程度使う分には無料のまま使える(はず)です。

ただ、これだと食費や交友費などの分類が出来ないので物足りません。

  • 想定される支払先に対する分類の表を用意し、それを参照して分類分けする
  • 支払先を生成AIに渡して分類分けしてもらい、それをスプレッドシートへ出力

このどちらかが良いかなぁと個人的に思っています。
なんとなく後者の方がカッコいいので、明日か明後日辺りに、LLMのAPIを使って実装してみたいと思います。

コメント

タイトルとURLをコピーしました