0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Qiita100万記事感謝祭!記事投稿キャンペーン開催のお知らせ

【GAS】直近で使ったクレカの金額をボタンひとつで取得したい!

Last updated at Posted at 2025-01-11

作成しようとした経緯

毎週金曜日になったらクレカアプリを開いて、先週の土曜日からその日まで使った支出を入力して、取り込んで(取り込むシステムは作成済み。気が向いたらあげます。)って作業が億劫すぎて、自動でできるいい方法がないか模索してました。

そのため今回はクレカの使用履歴をボタンひとつでスプシに反映させるまでの処理を紹介します。

案1

MoneyForwardと連携して、APIかなんかで取得できるか?
→無料だとAPIを使えない模様(調べた限り。。)なためボツ。

案2

クレカのサイトからPDFかCSVデータとしてダウンロードする。
→金額が確定してからじゃないとダウンロード出来ない。今回は直近の使用履歴が知りたいためボツ。

案3

クレカを使う毎にメールがくるからそれを使う。
→クレカ情報も必要ないし、良いのでは?

と言うことで案3を採用。

簡単なシーケンス図

image.png

具体的なやり方

①クレカの使用履歴をGmailに届くように設定

これは各クレカによって異なるので、それぞれで設定をお願いします。

②Gmailでラベルを作成する

デスクトップの左のバーのラベル右側にある「+」ボタンを押下して、ラベルを2種類作成する

  1. メールが来たばかりの未処理ラベル(仮に「unprocessed」ラベルとします。)
  2. スプシに取り込んで処理済みラベル(こちらは「processed」ラベルとします。)
    image.png

③いよいよGASでコードを書いていく

function write(){
  // 書き込むシートを取得、アクティブシートを取得しているが任意のシートでOK
  let sheet = SpreadsheetApp.getActive().getActiveSheet();

  // ヘッダーを設定
  var headers = ['Date', 'Price', 'Store'];
  sheet.appendRow(headers);

  // 「未処理」ラベルのメールを取得
  let gmail = getGmail();

  // 要素数分appendRowメソッドを呼び出して最終行に書き込む繰り返し処理を実行
  gmail.forEach(info => sheet.appendRow(info));

  // 確認したメールはアーカイブラベルに変更
  changeLabel();
}

function getGmail() {
  // Gmail取得ここから
  // Gmailのラベルからマッチするメールを一覧化
  let query = 'label:unprocessed';
  let threads = GmailApp.search(query);

  let gmailInfo = new Array();  
  
  //一覧化したメールの件数分繰り返し 
  threads.forEach(function(thread) {

    // スレッド内のメール一覧を取得
    let messages = thread.getMessages();
    
    // メールを一つずつ取り出す
    for(message of messages) {
      // メール本文
      let plainBody = message.getPlainBody();

      // 以下のマッチする箇所を取得するので、それぞれメールに合う形に設定してください。
      // ご利用日時
      let date = plainBody.match(/【ご利用日時\(日本時間\)】 (.*)/);

      // ご利用金額
      let price = plainBody.match(/【ご利用金額】 (.*)円/);
      
      // ご利用先
      let store = plainBody.match(/【ご利用先】 (.*)/);

      //各メール情報を組みとした二次元配列として格納
      gmailInfo.push([date[1],price[1],store[1]]);
    }
  });
    return(gmailInfo); 
}

function changeLabel() {
  let query = 'label:unprocessed';
  let threads = GmailApp.search(query);

  // 新しいラベル
  let processed = "processed";
  var newLabel = GmailApp.getUserLabelByName(processed);
  
  // ラベルがなければ作成する
  if (!newLabel) {
    newLabel = GmailApp.createLabel(processed);
  }

  // 新しいラベルを付ける
  for (var i = 0; i < threads.length; i++) {
    newLabel.addToThread(threads[i]);
  }

  // 現在のラベル
  let unprocessed = "unprocessed";
  var nowLabel = GmailApp.getUserLabelByName(unprocessed);

  // 現在のラベルを外す
  for (var i = 0; i < threads.length; i++) {
    nowLabel.removeFromThread(threads[i]);
  }
  return;
}

④動作確認

  1. スプレッドシートに取得ボタンを作成して、writeメソッドと紐付けます。
    image.png
  2. クレカで支払いをしたら、メールが来てることを確認。
  3. 「取得」ボタンを押下して、データが取得できていればOKです。

最後に

今回はメールからデータを取得する方法でしたので、次回はZaimと連携して、データを取得する方法をご紹介できたらなと思います。
もっとシンプルにできるとか、こうしたらいいのでは?等ございましたら、コメントお願いします!
良ければいいねお願いします!

参考先

以下のサイトを参考に作成しました。ありがとうございます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?