かずきち。の日記

サーバサイドエンジニアのつぶやき

金融機関の入金・出金・引き落としデータを自動記録スクリプトを書く

MoneyForwardやZaimの家計簿アプリは便利

家計簿アプリで自動連携できるので便利なのですが…

f:id:kazukichi_0914:20210921132236p:plain

1年前以上のデータを参照するには…プレミアムじゃないとできないらしいのです。
プレミアムってことは月額課金500円です。
いやー口座の残高管理で500円とられるのは嫌です。

言い方を変えれば、1年以内のデータなら見放題なので、有料のデータになる前に他の媒体に書き出してしまえば無料で使えます。

f:id:kazukichi_0914:20210904173322g:plain

お金を管理するためにお金を払うっていうのはどうなのって思っています。
そんなわけでスクリプトを書きました。

気をつけたこと

f:id:kazukichi_0914:20210904173812g:plain

無料サービスのいけないところは「無料」だけれど「PR」の広告を打ち込んでくる。

こんなデータは要らないわけですね!

こういうデータはゴミデータなので弾かないといけません。
無料だとYouTubeも広告が入るし、無料だとAmazonも送料を取ってきます。

でも良心的なので広告には、「(PR)」と書いてあります。

ウェブで広告を出すときはスポンサーリンク、広告などの表示を出して誤クリックを減らさないと広告のクリック単価が下がりますからね。
でも逆に言えば「moneyforward」かつ「PR文字」が含まれないメールは良いメールです!
さくさくっと書いていきます。

昨日から今日の間に発生したきい有取引を抽出→もしあればカレンダー転機

function moneyforward() {
  var date = new Date(); //現在日時のDateオブジェクトを作る

  var today = Utilities.formatDate(date, 'JST', 'yyyy/MM/dd');
  //Logger.log(today); //2021/9/04

  date.setDate(date.getDate() - 1);
  Logger.log(date);
  var yesterday = Utilities.formatDate(date, 'JST', 'yyyy/MM/dd');
  Logger.log(yesterday);    //createAllDayEventでカレンダーへイベントを登録

  const query = 'アラートメール label:moneyforward -PR after:'+yesterday;
  //const query = 'アラートメール カード引き落とし label:moneyforward -PR';
  Logger.log(query);

  const start = 0;
  const max = 10;
 
  const threads = GmailApp.search(query, start, max);
  const messagesForThreads = GmailApp.getMessagesForThreads(threads);
 
  for(const messages of messagesForThreads){
    Logger.log(messages[0].getDate());
    Logger.log(messages[0].getSubject());
    //Logger.log(messages[0].getPlainBody());
    Logger.log(messages[0].getBody());

    title = messages[0].getSubject();

    //登録するカレンダーIDを呼び出してeventへ格納
    var calendar = CalendarApp.getCalendarById('***************************@group.calendar.google.com');

    //createAllDayEventでカレンダーへイベントを登録
    calendar.createAllDayEvent(title,date);
  } 
}

何をやっているか解説するとJSTの現在時刻を取得して、昨日から今日までに時発生した金融取引を抜きます。
そして

const query = 'アラートメール label:moneyforward -PR after:'+yesterday;


moneyforwardのラベルが入っていて、でもPRラベルを含まず、昨日から今日に発生した金融取引を抜きます。
これで価値ある金融取引データが抜けます。
定期的に銀行に行って記帳をしなくていいので楽ですね。
強いていうと連携口座に上限があるのがネックです。

想像できることはだいたい実現できる

Admin ADK
AnalyticsReport API
Area 120 table API
BigQueut API
DriveAPI
Drive Activity API
Enterprise Lisense Manager API
Gmail API
GoogleAnalytics Data API
Google Calender API
Google Classroom API
Google Docs API
Google Sheets API
Google Slide API
Google WorkplaceReseller API
Group Migration API
Group Setting API
Mirror
PeopleAPI
TagManager API
Tasks API
YouTube Analytics API
Youtube Data API v3
YouTube Partner

Googleのほぼすべてのサービスは自動化ができますので…
もしも弱小サービスでAPI提供していないというものでもGoogleに落とし込めればほぼ自動化できます。

自動化したらスコープには気をつけたい

スコープという概念は自動化する上で理解しなければいけません。
機械にはどこまで自動化していいかを決める範囲があります。
それをスコープといいます。

f:id:kazukichi_0914:20210904181044g:plain

f:id:kazukichi_0914:20210904181055g:plain

iPhoneしかり、Googleしかり、facebookしかり…
きちんと個人情報にアクセスする際には「個人情報にアクセスするけどいい?」「通知をオンにするけどいい?」
って聞いてきます。

ソフトをインストールするときも

f:id:kazukichi_0914:20210904181316g:plain

どこのフォルダをホームにしますか?アプリケーションによる通知を許可しますか?って聞いてくれています。
なのに日本人はだいたいこの説明をかっ飛ばして全部「はい」にするので、パソコンが壊れたと言います。


引用:
docs.oracle.com

自分が会社の情シスだったりすると、社員が全部「はい」とかにするので、ここは「いいえ」にしてくださいなどと指示したりをします。

金融機関のアクセスだったり、Googleへのアクセスの情報を渡して危なくないの?

もちろん危険なので、

myaccount.google.com
引用:
https://myaccount.google.com/permissions?continue=https%3A%2F%2Fmyaccount.google.com%2Fdata-and-privacy

ときどきプライバシー設定を見直す必要があります。
時々変なアプリにGmail送信のフルアクセスを与えていたなんてこともありますかね。

せっかくなのでTwitterサードパーティーセッションも紹介しましょう

f:id:kazukichi_0914:20210904183135g:plain
引用:https://twitter.com/settings/connected_apps

Twitterにも第三者からのアカウントアクセスができます。
そしてどんなアプリにアクセス権や認証権限があるかが確認できます。

いろんなサイトでIDとパスワードを覚えるのが嫌なので、Twitter認証やLINE認証を使うわけです。
OpenIDを利用しているわけです。

qiita.com
引用:
https://qiita.com/TakahikoKawasaki/items/498ca08bbfcc341691fe

昔はパスワードがいっぱいで管理できないということもありましたが、OpenIDを使えば管理コストを抑えられます。