見出し画像

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

Zaimの情報を手元で加工したり年末収支予想とかが分かるウィジェットにしたいな~、ということでその過程を備忘録がてら残します。

初心者ゆえ色々詰まったので、誰かの参考になればうれしいです。



ZaimのAPI登録


Zaim developers に登録

ログイン

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

こんな感じで入力し、保存します。

詰まりポイント


ポイントはサービスのURL。後述しますが事前にWEBアプリをデプロイして、そのURLを記載する必要があるようです。ここですごく詰まりました。。

これでコンシューマ ID等々が入手できたので、続いてGASのセッティングに移ります。

GASのセッティング  

Google Apps Scriptエディタを開く

 Google Apps Scriptプロジェクトを開きます

OAuth1ライブラリを追加

以下のページにアクセス


script IDをコピー

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

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

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

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


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

  • スクリプトのプロパティを開く

    - メニューバーから「プロジェクトの設定」を選択します。

 

  • プロパティを追加

    - 「スクリプトプロパティ」セクションにて、「スクリプトプロパティを追加」ボタンをクリックします。

    - 名前と値のフィールドが表示されます。名前には**`CONSUMER_KEY`**、値には実際のConsumer Keyを入力します。

    - 同様にして、**`CONSUMER_SECRET`**とその値も追加します。

  • 保存

    - 設定が完了したら、「保存」ボタンをクリックして閉じます。


デプロイ

 Google Apps Scriptでウェブアプリケーションとして動作するスクリプト、特にOAuth認証を含むものを使用する場合、スクリプトを実行する前にウェブアプリケーションとしてデプロイしておく必要があります。これは、OAuth認証プロセス中に使用されるコールバックURLを生成するために必要です。

デプロイの手順

  • Google Apps Scriptエディタを開く

    - 作成したスクリプトを含むGoogle Apps Scriptプロジェクトを開きます。

  • ウェブアプリケーションとしてデプロイ

    - エディタの上部にある「デプロイ」メニューを選択し、「ウェブアプリケーションとして導入」を選びます。

  • デプロイ設定を行う

    - 新しいバージョンを作成し、アクセス権などの設定を行います。

    - 「更新」ボタンをクリックしてデプロイを完了させます。

  • コールバックURLを取得

    - デプロイが完了すると、ウェブアプリケーションのURLが表示されます。このURLが、OAuth認証プロセスでのコールバックURLとなります。

  • APIプロバイダの設定を更新

    - 取得したコールバックURLを、APIプロバイダ(この場合はZaim)のアプリケーション設定(サービスのURL)に登録します。


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() を使用して、特定のスプレッドシートを開きます。


まとめ


今回、スプレッドシートには出来ましたが、クレジットカード経由のデータはapiでは取得できないっぽいんですよね。。

pyzaimならできるらしい?ので、また挑戦してみます。

ではまた。


この記事が参加している募集

お金について考える

最後までお読みいただきありがとうございます。よろしければ「スキ」、「フォロー」していただけると嬉しいです。