すぎ日記 育児 , 生活 ,仕事 など

アラサー 男 育休中

Google Apps Script で Gメールの楽天カード利用明細を スプレッドシート に出力してみた

やりたいこと

Gメールに送られてくるクレジットカード( 楽天カード ) の利用明細から、利用日や金額を拾い自動でスプレッドシートに転記したい。
ちなみにメールはこんな感じです。

できたこと

こんな感じに、できました!

Apps Script で実行すると...

 

 

スプレッドシートに利用明細のデータが出力された!
※「■利用日:」ごと取れてしまいますが、一旦ここで妥協しました。。
青い四角はちょっと情報を隠したかっただけです。

ソース

ソースはこのような感じです。
拙いコードで恐縮です。。。

function myFunction() {
  
    let query = 'subject:カード利用のお知らせ(本人ご利用分) -subject:【速報版】 after:2022/10/1 before: 2022/10/15';
    //メールの内容をスプレッドシートに出力
    outputGmail(query);
}

function outputGmail(query) {

  //Gmailの履歴からマッチするメール全てを取得
  let threads = GmailApp.search(query);

  //取得した件数分繰り返し 
  threads.forEach(function(thread) {

    // スレッド内のメール一覧を取得
    let messages = thread.getMessages();
    
    // メールを一つずつ取り出す
    messages.forEach(function(message) {

      // gmailの内容格納用の配列
      let gmailInfo = new Array();  

      //スプレッドシート書き込みデータを格納する配列
      let t_gmailInfo = new Array();

      // メール本文を取得
      let plainBody = message.getPlainBody();     
      
   // 各項目の値を取得 let dates = plainBody.match(/■利用日:(.*)/g); Logger.log(dates); let riyousaki = plainBody.match(/■利用先:(.*)/g); let amounts = plainBody.match(/■利用金額:(.*)/g); gmailInfo.push(dates,riyousaki,amounts); Logger.log(gmailInfo) //列数分繰り返し for(let col = 0;col < gmailInfo[0].length;col++){ t_gmailInfo.push([]);//保存する列を作成      //行数分繰り返し for(let row = 0;row < gmailInfo.length;row++){ t_gmailInfo[col].push(gmailInfo[row][col]) //転置後配列にはn×1のデータを格納していくイメージ } } Logger.log("転置後:" + t_gmailInfo) //要素ごとにappendRowメソッドを呼び出して最終行に書き込む繰り返し処理 t_gmailInfo.forEach(function(info){ Logger.log("info:" + info) let sheet = SpreadsheetApp.getActive().getActiveSheet(); sheet.appendRow(info); }) }) }) }

処理の流れ

処理の流れは次のような感じです。

・GmailApp.searchメソッドでカード利用メールをごっそり取得
・matchメソッドで利用日、利用先、利用金額を取得
・取得したデータをn行×3列の配列にする
・グーグルスプレッドシートに出力

・GmailApp.searchメソッドでカード利用メールをごっそり取得

件名と日付を指定しています。
楽天カードの利用明細メールには速報版のメールもあります。こちらを拾ってしまうとデータ項目数の違いによりエラーになってしまうため、除外するようにしています。

・matchメソッドで利用日、利用先、利用金額を取得

メール1件ごとに、HTMLではなくテキストで取得したメールの本文から利用日、利用先、利用金額を検索し、それぞれ配列に格納します。
それぞれの項目について複数個データがあるため、オプション g を指定することで、条件と一致する全てのデータを取得しています
(例えば上のメール例の画面では、利用日列には10/15というデータが3つあります。テキスト版だと「■利用日:2022/10/15」というように記載されているので、「■利用日:」で始まる部分を抽出しました。)

これ、let dates = plainBody.match(/■利用日:(.*)/g);
と書くだけでdatesの中身が

のようになるのですね~。便利!
riyousakiとamountsの中身はそれぞれこのような感じになります。



・取得したデータをn行×3列の配列にする

利用日、利用先、利用金額を一旦 gmailInfo という配列に格納します。  
gmailInfo.push(dates,riyousaki,amounts);
で3つの配列をがっちゃんこする感じです。
gmailInfoの中身↓



さらに、利用日、利用先、利用金額のデータが、それぞれ縦方向に並ぶようにするために、行と列を入れ替えます。
t_gmailInfoの中身はこのような感じになります。

・グーグルスプレッドシートに出力

appendRowメソッドを使って t_gmailInfo をスプレッドシートに出力します。

終わりに

いろいろ調べて、なんとかGoogle Apps Script でカード利用明細からグーグルスプレッドシートに自動で転記することができました!
詳しい方々がいろいろブログなどに書いてくれているのを見ながらにも関わらず、結構苦労しました、、、
あとプログラミングめっちゃ勉強になりました。一応IT系(コード書かない)の仕事をしているのですが、PG力なさすぎてやべーと思いながらやっていました。
また何かやりたいことを見つけて軽いプログラミングをしてみたいな~と思います。