💰

GASとZaimを連携して情報を取得する

2024/01/05に公開

はじめに

遅ればせながら家計簿管理の自動化をこれからやっていこうと思いたち[1]、二番煎じにも程がある GAS \times Zaim API の組み合わせによる家計情報の自動取得に取り組んでみたいと思います。普段は Zaim の自動連携でアプリからは不便なく情報を見れるのですが、それを少し加工した形で管理してみたいという気持ちになったので自動化に取り組んでみようと思った次第です。

環境構築の手順

GAS を実行したときに Zaim に連携している口座情報などを取得することを目標として取り組みました。大まかには以下の手順で情報を取得することができます。

  1. GAS にて取得用アプリケーションを作成し、デプロイする[2]
  2. Zaim アプリケーションを作成
  3. GAS にて取得用アプリケーションを実行 --> 情報の取得

各手順の詳細

GAS(デプロイ)

Google App Script(GAS)は様々な使用用途が可能な Google が提供しているサービスで、スプレッドシートやその他サービスなどと連携したりすることができます。将来的に今回作成した仕掛けを LINE などから参照したかったため[3]、Zaim から情報を取得するために GAS を使用することとしました。
情報の取得には GAS のデプロイが必要となります。GAS におけるデプロイとは、作成したスクリプト(アプリ、ツールの実装)を外部から実行するための URL を作成することを指します。

今回は、GitHubのサンプルを参考にして GAS を作成しました。Google github のサンプルは Twitter の情報取得用サンプルなので、こちらを Zaim 用に修正します。

  • 各種エンドポイントを zaim のものに変更
  • methodget に変更

が今回サンプルを使用するに当たって必要な修正でした。また、CONSUMER_KEYCONSUMER_SECRET は(ニワトリ卵なのですが)次の工程の Zaim アプリケーションの作成時に生成される情報です。そのためデプロイとアプリケーション作成の画面を何度か行き来することとなります。

var CONSUMER_KEY = '.........';
var CONSUMER_SECRET = '.........';

/**
 * Authorizes and makes a request to the Twitter API.
 */
function run() {
  var service = getService_();
  if (service.hasAccess()) {
    var url = 'https://api.zaim.net/v2/home/money';
    var response = service.fetch(url, {
      method: 'get'
    });
    var result = JSON.parse(response.getContentText());
    Logger.log(JSON.stringify(result, null, 2));
  } else {
    var authorizationUrl = service.authorize();
    Logger.log('Open the following URL and re-run the script: %s',
        authorizationUrl);
  }
} 

/**
 * Reset the authorization state, so that it can be re-tested.
 */
function reset() {
  var service = getService_();
  service.reset();
}

/**
 * Configures the service.
 */
function getService_() {
  return OAuth1.createService('Twitter')
      // Set the endpoint URLs.
      .setAccessTokenUrl('https://api.zaim.net/v2/auth/access')
      .setRequestTokenUrl('https://api.zaim.net/v2/auth/request')
      .setAuthorizationUrl('https://auth.zaim.net/users/auth')

      // Set the consumer key and secret.
      .setConsumerKey(CONSUMER_KEY)
      .setConsumerSecret(CONSUMER_SECRET)

      // Set the name of the callback function in the script referenced
      // above that should be invoked to complete the OAuth flow.
      .setCallbackFunction('authCallback')
  
      // Using a cache will reduce the need to read from 
      // the property store and may increase performance.
      .setCache(CacheService.getUserCache())

      // Set the property store where authorized tokens should be persisted.
      .setPropertyStore(PropertiesService.getUserProperties());
}

/**
 * Handles the OAuth callback.
 */
function authCallback(request) {
  var service = getService_();
  var authorized = service.handleCallback(request);
  if (authorized) {
    return HtmlService.createHtmlOutput('Success!');
  } else {
    return HtmlService.createHtmlOutput('Denied');
  }
}

また、Zaim API を使用するためには、OAuth1.0a 認証が必要となるのですが[4]。GAS のための OAuth1 ライブラリとして

を使用することができ、README に従ってセットアップを行います。


OAuth1 ライブラリの追加

以上の設定が終わったタイミングで右上の「デプロイ」を押します。ウェブアプリケーションを選択、アクセスできるユーザーとして「全員」を選択してデプロイを押します。

Zaim

ここ2年ほどずっとお世話になっている家計簿アプリで[5]、UI が他のサービスよりも自分好みだったりします。

新しいアプリケーションを追加

Zaim の情報を取得するためには、アプリケーションを作成する必要があります。

ホーム画面の「新しいアプリケーションを追加」を選択後、各情報を入力します。このとき、サービス種とサービスのURLは以下に示した通りに設定しないとうまく動作しませんでしたのでご注意ください。

  • 名称:任意
  • サービス種:ブラウザアプリ
  • 概要:任意
  • 組織:任意
  • サービスのURL:GASのデプロイURL
  • アクセスレベル:任意
  • アイコン画像:任意

GAS(実行)

GASのデプロイとZaim アプリケーションの作成が終われば、いよいよ GAS を実行して情報を取得することができます。

  • 実行する関数として「run」を選択、実行

  • すると実行ログに「Open the following URL and re-run the script: https://....」というメッセージが出るのでコピーしてアクセスします --> 「ログインして許可」を実行

  • 認証されるので、再度 GAS の画面に戻り、「run」を実行すると情報が取得できます

感想

以上で Zaim と GAS を連携して情報を取得することができたので、この下地を元に LINE への連携や各種情報整形などに取り組んでみたいと思います。

参考情報

脚注
  1. 新年になると何か新しいことをしたくなりますね...。 ↩︎

  2. デプロイまで一旦完了させ、Zaim アプリケーション作成時に「サービスのURL」に転記する必要がある ↩︎

  3. LINE BOT と GAS の連携方法の情報も多く見受けられたので、何も考えず GAS を使用しました。 ↩︎

  4. OAuth2.0 とは単なるバージョン違いというだけではないようです。 ↩︎

  5. 有料会員になりました ↩︎

GitHubで編集を提案

Discussion