Google Apps Scriptからクレカ利用の内容をslackに通知するようにした

概要

我が家でクレカを家族カードにしているんですが、お互いに利用状況を見たいよねという課題感があって、zapierで gmail で対象のメールが来たら通知するようにしていました。

これが本文がまるまる転送されるので厳しいという課題があって、ちょうどなんか不具合で転送されなくなったので「書くか…」となったので書いてみました。

ちなみにビフォー

携帯のファーストビューで金額までたどりつかない。厳しい。これが一通。

段取り

やりたいことはだいたい

  • Google Apps Script(以下GAS)を使い始める
  • testでslack通知部分だけ書いてみる
  • GASをつかって特定文字列でメールを検索する
  • 範囲は前日一日分
  • 内容を通知しやすい形に整形する
  • slackに通知する

こんな感じです。

GASを使い始める

使い始めを検索したらここにとりあえずアクセスしておけとのこと。

https://chrome.google.com/webstore/detail/google-apps-script/eoieeedlomnegifmaghhjnghhmcldobl?hl=ja

slackに通知してみる

事前にslackでincoming web hookのURLは取得しておいてください。

function myFunction() {
  var username = 'クレカお知らせさん';  // 通知時に表示されるユーザー名
  var icon = ':credit_card:';  // 通知時に表示されるアイコン
  var message = 'test';  // 投稿メッセージ
  var webhook_url = '<incoming webhook url>';
  var jsonData =
  {
     "username" : username,
     "icon_emoji": icon,
     "text" : message
  };
  var payload = JSON.stringify(jsonData);
  var options =
  {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : payload
  };
  UrlFetchApp.fetch(webhook_url, options);
}

既に使用されている人のコードを参考に書いてみた。

なんかうまくいってそう。

ちなみにログは Logger.log('message')とかで出るんですが、どこで見ていいか最初わからず迷う。

ここにあった。

最終的なコード

前日のメールをとってきて正規表現で強引に引っ張ってきて投げるというパワープレイです。

function notifyUsingCardFromGmail() {
  var username = 'クレカお知らせさん';  // 通知時に表示されるユーザー名
  var icon = ':credit_card:';  // 通知時に表示されるアイコン
  var webhook_url = '<WEBHOOK_URL>';
  // Search Gmail
  var targetDate =  Moment.moment().subtract(1, 'days').format('YYYY/MM/DD');
  var searchWord = 'subject:(カード利用のお知らせ -速報)  after:' + targetDate;
  var threads = GmailApp.search(searchWord); //条件にマッチしたスレッドを取得
  var messages = GmailApp.getMessagesForThreads(threads); //スレッドからメールを取得する
  for (var i = 0; i < messages.length; i++) {
    var body = messages[i][0].getPlainBody()
    var matchDate = body.match(/■利用日:.{1,}/);
    var matchShop = body.match(/■利用先:.{1,}/);
    var matchPayMethod = body.match(/支払方法:.{1,}/);
    var matchPrice = body.match(/■利用金額:.{1,}/);
    // Notify Slack
    var jsonData =
    {
      "username" : username,
      "icon_emoji": icon,
      "text" : matchDate + ':' + matchShop + '/' + matchPrice + '/' + matchPayMethod
    };
    var payload = JSON.stringify(jsonData);
    var options =
    {
      "method" : "post",
      "contentType" : "application/json",
      "payload" : payload
    };
    UrlFetchApp.fetch(webhook_url, options);
  }
}

こんな感じに通知されます。

よいよい。7日分入ってますね。

あとは、定期実行をしかけるだけ。編集画面の時計マークを押すと追加ができてこんな感じで設定しています。

Google Apps Script 便利でした。いままで何故使ってこなかったのか。