💰

【GAS】Zaim APIで家計情報をスプレッドシート化

2023/12/16に公開

目的

Zaimの情報を手元で加工したり年末収支予想とかが分かるウィジェットを作成したい。今回、まずはZaim APIからデータを取得して、スプレッドシートに出力しました。今後自分用のWEBアプリにしていく予定です。

備忘録として残しています。初心者ゆえ色々と詰まるポイントがありましたが、誰かの参考になれば幸いです。

ZaimのAPI登録

  1. Zaim developers に登録

  2. ログインし、新しいアプリケーションを追加

  3. 情報を入力し、保存

ポイント

  • サービスのURLは事前にWEBアプリをデプロイしておく必要があります。

GASのセッティング

  1. Google Apps Scriptエディタを開く
  2. Google Apps Scriptプロジェクトを開き、OAuth1ライブラリを追加

まず以下のURLにアクセスし、OAuth1ライブラリのスクリプトIDをコピー

Google Apps Scriptに戻り、メニューバーから「ライブラリ」を選択

先ほどのスクリプトIDを貼り付け、検索⇒追加

これでOAuth1ライブラリが追加できました。

続いてZaim apiのキー等をGoogle Apps Scriptのプロパティに設定していきます。

スクリプトのプロパティの設定

  1. メニューバーから「プロジェクトの設定」を選択

  2. 「スクリプトプロパティ」セクションで「スクリプトプロパティを追加」

  3. CONSUMER_KEYCONSUMER_SECRET を追加し、保存

デプロイ

Google Apps Scriptでウェブアプリケーションとして動作するスクリプトは、実行前にデプロイが必要です。

  1. Google Apps Scriptエディタを開き、プロジェクトを選択
  2. 「デプロイ」メニューから「ウェブアプリケーションとして導入」を選択
  3. 新しいバージョンを作成し、デプロイを完了
  4. コールバックURLを取得し、APIプロバイダの設定を更新

GASのコード

var SP = PropertiesService.getScriptProperties();
var CONSUMER_KEY = SP.getProperty("CONSUMER_KEY");//取得したコンシューマID
var CONSUMER_SECRET = SP.getProperty("CONSUMER_SECRET");//取得したコンシューマシークレット;
/**
 * Authorizes and makes a request to the Zaim API.
 */
function run() {
  var service = getService();// OAuthサービスを取得
	// サービスがアクセス権を持っているかどうかを確認
  if (service.hasAccess()) {
    var url = 'https://api.zaim.net/v2/home/money';

		// APIにGETリクエストを送信し、レスポンスを取得
    var response = service.fetch(url, {
      method: 'get'
    });

		// レスポンスからJSONデータを解析し、結果を取得
    var result = JSON.parse(response.getContentText());
    if (result && result.money) {
      writeToSpreadsheet(result.money); // JSONデータをスプレッドシートに書き込む関数を呼び出す
    }
  } else {
    var authorizationUrl = service.authorize();

		// アクセス権がない場合、認証URLを取得し、ログに出力
    Logger.log('次のURLを開いてZaimで認証したあと、再度スクリプトを実行してください。: %s',
        authorizationUrl);
  }
}

// JSONデータをスプレッドシートに書き込む関数
function writeToSpreadsheet(data) {
  var spreadsheet = SpreadsheetApp.create("Zaim Data"); // 新しいスプレッドシートを作成
  var sheet = spreadsheet.getActiveSheet();

  var headers = Object.keys(data[0]); // ヘッダー行(JSONのキーから取得)
  sheet.appendRow(headers);

  data.forEach(function(item) {
    var row = [];
    headers.forEach(function(header) {
      row.push(item[header]);
    });
    sheet.appendRow(row); // データ行を追加
  });
}

/**
 * 認証状態をリセットする関数。
 */
function reset() {
  var service = getService();// OAuthサービスを取得
  service.reset();// 認証状態をリセット
}

/**
 * OAuth認証用のサービスを設定し、返す関数。
 */
function getService() {
  return OAuth1.createService('Zaim')
      // OAuthエンドポイントのURLを設定
      .setAccessTokenUrl('https://api.zaim.net/v2/auth/access')
      .setRequestTokenUrl('https://api.zaim.net/v2/auth/request')
      .setAuthorizationUrl('https://auth.zaim.net/users/auth')

      // コンシューマキーとシークレットを設定
      .setConsumerKey(CONSUMER_KEY)
      .setConsumerSecret(CONSUMER_SECRET)

      // 認証が完了した際に呼び出されるコールバック関数を設定
      .setCallbackFunction('authCallback')

      // 認証情報を保存するプロパティストアを設定
      .setPropertyStore(PropertiesService.getUserProperties());
}

/**
 * OAuth認証のコールバックを処理する関数。
 */
function authCallback(request) {
  var service = getService();
  var authorized = service.handleCallback(request);

	// 認証が成功したかどうかをチェック
  if (authorized) {
    return HtmlService.createHtmlOutput('認証できました!このページを閉じて再びスクリプトを実行してください。');

  } else {
    return HtmlService.createHtmlOutput('認証に失敗');
  }
}

このコードでは、新しいスプレッドシートが作成され、データが書き込まれるようになっています。既存のスプレッドシートにデータを追加する場合は、SpreadsheetApp.create() の代わりに SpreadsheetApp.openById() または SpreadsheetApp.openByUrl() を使用します。

まとめ

今回、Zaim apiを用いて家計情報をスプレッドシートには出来ましたが、クレジットカード経由のデータはAPIでは取得できないようです。pyzaimを使えば可能かもしれませんので、また挑戦してみたいと思います。

ではまた。

Discussion