タダケンのEnjoy Tech

楽しみながらラクに成果を上げる仕組みを考える

Google Apps Scriptでfreeeの取引データを取得してスプレッドシートに保存する方法

f:id:tadaken3:20170815174404p:plain こんにちは。
タダケン(@tadaken3)です。

前回は、freeeのAPIを利用するためにOauth2認証にそって、アクセストークンを取得する方法を解説しました。

tadaken3.hatenablog.jp

今回は、取得したアクセストークンを利用して、freeeの取引データをAPI経由で取得して、スプレッドシートに書き出してみます。アクセストークンさえ取得できれば、あとは簡単です。1

前回のおさらい

前回はアクセストークンを取得して、取得したアクセストークンを使って事業所のデータを取得し、ログに出力するところまで解説しました。

簡単におさらいしておくと

  1. alertAuthメソッドでfreeeの認証をおこなう
  2. getCompanyIdで認証後に取得したアクセストークンを利用し、事業所のデータを取得

という流れです。前回のコードはこちら。

//先程取得したAppID・Sceretを入力
var appId = "あなたのApp id";
var secret = "あなたのシークレット";

// 認証のエンドポイントとなるダイアログを表示します。
function alertAuth() {
  var service = getService();
  var authorizationUrl = service.getAuthorizationUrl();
  var template = HtmlService.createTemplate(
    '<a href="<?= authorizationUrl ?>" target="_blank">認証</a>. ' +
    '認証が完了したら再度操作を行ってください。');
  template.authorizationUrl = authorizationUrl;
  var page = template.evaluate();
  SpreadsheetApp.getUi().showModalDialog(page, "認証が必要です");
  Logger.log("認証が切れています");
}

//freeeAPIのサービスを取得
function getService() {
  return OAuth2.createService('freee')
      .setAuthorizationBaseUrl('https://secure.freee.co.jp/oauth/authorize')
      .setTokenUrl('https://api.freee.co.jp/oauth/token')
      .setClientId(appId)
      .setClientSecret(secret)
      .setCallbackFunction('authCallback')
      .setPropertyStore(PropertiesService.getUserProperties())
}

//認証コールバック
function authCallback(request) {
  var service = getService();
  var isAuthorized = service.handleCallback(request);
  if (isAuthorized) {
    return HtmlService.createHtmlOutput('認証に成功しました。タブを閉じてください。');
  } else {
    return HtmlService.createHtmlOutput('認証に失敗しました。タブを閉じてください。');
  }
}

//認証後、取得したアクセストークンを元にfreeeAPIからカンパニーIDを取得する
function getCompanyId() {
  var freeeApp = getService();
  var token = freeeApp.getAccessToken();
  var options =
   {
     "method"  : "get",
     "headers" : {"Authorization" : "Bearer "+ token}

   };
  var res = UrlFetchApp.fetch("https://api.freee.co.jp/api/1/companies",options);
  Logger.log(res)
}

以下はレスポンスの例になります。ログにこのようなデータが出力されているはずです。

{
  "company" : {
    "id" : 1,
    "name" : "freee事務所",
    "name_kana" : "フリージムショ",
    "display_name" : "freee事務所",
    "role" : "admin",
    "account_items" : [ ... ],
    "taxes" : [ ... ],
    "items" : [ ... ],
    "partners" : [ ... ]
  }
}

事業所のデータからカンパニーIDを取得する

次に、この事業所のデータからカンパニーIDを取り出します。カンパニーIDはfreeeの事業所識別するIDです。取引データを取得・追加するときに必要になってきます。2

JSON形式で保存されているので、getCompanyIdメソッドを以下のように書き換えます。

APIの詳細は以下もご覧ください。

freee APIドキュメント

function fetchFreee(url) {
  var freeeApp = getService();
  var token = freeeApp.getAccessToken();
  var options =
   {
     "method"  : "get",
     "headers" : {"Authorization" : "Bearer "+ token}

   };
  var json = UrlFetchApp.fetch(url,options).getContentText();
  var jsonData = JSON.parse(json);
  return jsonData
}

function getCompanyId() {
  var jsonData = fetchFreee("https://api.freee.co.jp/api/1/companies")
  var companyId = jsonData['companies']['0']['id'];
  return companyId
}

データを取得するたびにfreeeのAPIにアクセスするため、処理を抽象化して、fetchFreeeメソッドを追加しています。fetchFreeeはエンドポイントとなるURLを渡すことでJSONを返します。

取引一覧のデータを取得する

freeeでは、取引という概念で収入と支出を管理しています。発生日、支払期日、金額、支払残額、収入か支出か、決済口座などの情報が取引データを見るとわかります。

取引の一覧を取得すること、スプレッドシート上で収支の分析ができるようなります。

取引のAPIに関する情報はこちらをご覧ください。

freee APIドキュメント

今回は試しに取引発生日、収支のタイプ、金額、備考欄を取得してみます。 JSONがネストしているので注意してください。また、今後スプレッドシートでやり取りしやすいように二次元配列で値を返すようにしています。

function getSalesData() {
  var companyId = getCompanyId();
  var dealsData = fetchFreee("https://api.freee.co.jp/api/1/deals?company_id=" + companyId);
  
  //deals
  var dataCnt = dealsData["deals"].length;
  var arr = [];
  
  for(var i=0; i<dataCnt; i++){
    var issue_data   = dealsData["deals"][i]["issue_date"]
    var type         = dealsData["deals"][i]["type"]
    var amount       = dealsData["deals"][i]["amount"]
    var description  = dealsData["deals"][i]["details"][0]["description"]
    arr.push([issue_data, type, amount, description])
  }
  return arr
}

取得したデータをスプレッドシートに書き出す

最後に取得したデータをスプレッドシートに書き出すメソッドを追加します。dataというシートを事前に作成しておいてください。実行すると取得したfreeeの取引のデータが出力されます。

//detaというシートに取得したデータを書き出す。
function setDataToSheet(){
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getSheetByName('data'); 
  var arr = getSalesData()
  var lastRow = arr.length;
  var column = arr[0].length;
  Logger.log(arr)
  sheet.getRange(2,1,lastRow,column).setValues(arr);
}

ちょっと長くなってしまったので、すべてまとめたものはGistにおいておきます。

freee-get-deals.gs · GitHub

まとめ

今回はfreeeのAPIを使って

  1. カンパニーIDを取得
  2. 取引一覧のデータを取得
  3. 取得したデータをスプレッドシートに書き出す

上記の3つをおこなう方法を解説しました。freee自体で様々な指標を確認することはできるのですが、スプレッドシートに書き出すことで、自分自身で経営分析をいろいろな観点でできるようになります。

このブログについて

副業やプログラミングに関する記事を書いています。(ときどき、それ以外のことも) 読者登録してもらうと更新の励みになりますのでよろしくお願いいたします。


  1. freeeのAPIを利用するには、法人プランの場合、ライト、ビジネス、エンタープライズ。個人プランの場合はスターター、スタンダード、プレミアムのいずれかを利用している必要があります。

  2. アカウントに2つ以上事業所を登録している方は、操作したい事業所のカンパニーIDを取得しましょう。