会計freee×GASで取引先別の月次貸借対照表データを取得してみる

# この投稿の目的
- 前回、以下の記事で月次推移表の投稿をしてみましたが、PLのみかつ補助科目がないレベルでの投稿でした。
　https://qiita.com/Kirin8210/items/ba5bd7aed19411b0c4b8
- 現実に試算表から業務管理とかするときは、特にBSでは取引先別の補助科目（タグ）情報を取得してやるのが一般的っぽいので、取引先のBSを取得するコードをGASで書いてみます。
- 月次は予実とかで使ったり、監査法人提出するくらいの使途しかない気もしますが一応。二期比較であれば、@kabanyasuのコチラがおすすめ：https://qiita.com/kabanyasu/items/eef45e56d88be7e3ad37
- 相変わらずホリデープログラマなので、汚いところとかありましたらご容赦下さい。

# 前提
- 言語はGAS、データの取得＆保存先はGoogle Spreadsheetとします。
- 認証のところは、前回に引き続き省略します。最近、とてもわかり易いブログを見つけたので、コチラご参照いただき、認証したあとで実行して下さい。
　https://moripro.net/freee-gas-api/

# コード

## スプレッドシートに転記する処理


```javascript
function setToSheet() {
    //会計月の指定。御社の会計月の開始・終了を考慮して設定して下さい。
    var fiscalMonth = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
    //各月のBSを取得
    var monthlyFs = fiscalMonth.map(function (month) {return getItemArray(month);});
  
    //BSの配列を３次元→２次元に削減
    var list = monthlyFs.reduce(function (prev, post) {
        prev.push.apply(prev, post);
        return prev;
    });
  
    //シートに転記
    var ss = SpreadsheetApp.getActiveSpreadSheet();
    var bsSheet = ss.getSheetByName('BS');
    bsSheet.getRange(2, 1, list.length, list[0].length).setValues(list);
}
```

## 取引先データ、合計勘定データを分けて配列に格納する処理

```javascript
//取引先情報の有無（仮払・仮受消費税は取引先持っていない）と、合計勘定か否かにより抽出分岐をかける
function getItemArray(month) {  
  //合計勘定=Falseなら個別科目のデータを、Trueならカテゴリデータを返す
  var data = getBs(month).map(function(account){
    if (account.partners) {
      //取引先のある科目の場合は、partnerオブジェクトの中にID名称、金額があるので、それを取得してくる。
      //break_down_displayの指定をitemやsectionとした場合は、item(s), section(s)に変える点に注意
      var arr = account.partners.map(function(partner){
        return [
          currentYear,
          month,
          account.account_item_id,
          account.account_item_name,
          partner.name,
          partner.closing_balance
        ];
      });
      return arr;
      
    //仮払・仮受消費税はaccount_item_idはあるが取引先はない
    }else if (!account.total_line){
      return [[
        currentYear,
        month,
        account.account_item_id,
        account.account_item_name,
        null,
        account.closing_balance
      ]];

    //合計勘定の場合  
    }else{
      return [[
        currentYear,
        month,
        account.account_category_id,
        account.account_category_name,
        "合計勘定",
        account.closing_balance
      ]];
    }
  });
  
  //次元削減して返す
  var reducedArray = data.reduce(function (prev, post) {
    prev.push.apply(prev, post);
    return prev;
  });
  
  return reducedArray;
}
```

## BSを取得してくる処理（開始月、終了月を引数に取る）

```javascript
//BSを取得してくる
function getBs(month) {
    //トークン取得
    var freeApp = getService();
    var accessToken = freeApp.getAccessToken();
  
    //取得情報のパラメータ指定。
    //最後のbreakdown_display_typeの指定をitemに変えれば品目別、sectionにすれば部門別にも取得可能
    var url = 'https://api.freee.co.jp/api/1/';
    var targetItem = 'reports/trial_bs?';
    var companyId = 'company_id=' + "事業所IDを数値で入力";
    var fiscalYear = '&fiscal_year=' + "会計年度を数値で入力";
    var startMonth = '&start_month=' + month;
    var endMonth = '&end_month=' + month;
    var breakdown = '&breakdown_display_type=' + 'partner';
  
    //url結合
    url += targetItem + companyId + fiscalYear + startMonth + endMonth + breakdown;
  
    //option, headers
    var options = {
        'method': 'get',
        'headers': {
            'Authorization': 'Bearer ' + accessToken
        }
    };
    //取得したデータをJsonParseしてバランスの部分だけ取得
    var res = UrlFetchApp.fetch(url, options).getContentText();
    var resBs = JSON.parse(res).trial_bs.balances;
    return resBs;
}

```

freeeのデモ用実行環境だと取引先ちゃんとついてなかったのであれだけど、データ整形して後日更新してみる。

# 終わりに
- ひとまずデータはちゃんと取れた。
- 2ブロック目のmapのところはこれじゃあんまり高階関数使った意味なさげだから、もうちょい研究。
- PLも、urlとresponseの一部を(trial_bsからtrial_plに)書き換えたら全く同じように取得可能。汎用性高い