会計freeeから、資金繰り表作成のために決済済み取引データを取得する

# この投稿の目的
- 資金繰り表を自動作成できたらいいなぁと前から思っていたので作ってみた。
- 表にしたり、資金繰り表項目に寄せたりするのはコーディングとは別の話なので割愛します。

# 方法
- 会計freeeの取引データ（※）一覧のうち、決済済みのものを抽出してスプレッドシートで加工。
- freeeでは銀行口座や現金以外にクレカデータも「口座」として抽出されるので、データ抽出後の集計加工時は留意が必要。
- 取引の一覧を抽出しただけでは、勘定科目・取引先・部門・品目はすべてIDで返ってきます。別途、取引先等の一覧を抽出してきて、IDと名称の紐付けをしておく必要があります。

（※）これを作るためにも、資金収支に絡む項目は、そもそものfreeeでの仕訳入力時にできるだけ振替伝票を使わないことが重要。
振替伝票で資金口座科目を使っているものを抽出すればできなくもないが、取引でフラグつけて抽出したほうが遥かに楽です。
日常の記帳において、振替伝票をできるだけ使わない（決算整理とかだけ）運用にするのがおすすめです。

# コード
## パラメータ設定

```javascript
//取得対象会社の事業所ID
var COMPANY_ID = 99999999; 

//スプレッドシート
var ss = SpreadsheetApp.getActiveSpreadsheet();

//クエリストリングで指定するパラメータ
var STATUS = 'settled'  //決済ステータス（決済済み）
var START_ISSUE_DATE = "2018-04-01"; //取得する取引の開始日
var LIMIT = 100; //ページあたりの取引件数
var ACCRUALS = 'with'; //債権債務行の取得有無（取得）
var offsets = Array.apply(null, Array(300)).map(function (_, i) {return i;}); //offset。何ページ抽出したらいいかわからないので、とりあえず３００暗い取得。Arrayの中のカッコを変えると操作可能
```

offsetのとり方が初心者過ぎてわからない。少なくとも書き方としては、claspとかでES6でかくともっと簡単っぽい。

```javascript
//ページネーション指定をclaspでES６でやるとき
const offset = [...Array(300).keys()];
```

## 取引データの取得
### スプレッドシートに転記（メインの処理）
本当はmapとかfilterでもっと簡単にできるっぽいけど、ひとまず動くものを作ってみた

```javascript
function getAllDeals() {
  //dealsの取得
  var dealset = offsets.map(function (offset) {
    return getDeals(offset * 100);
  });
  
  //データ格納する箱の作成。１行目にタイトル付与
  var rowDataList = [[
    "取引ID",
    "発生日",
    "収支区分",
    "取引先ID",
    "科目ID",
    "品目ID",
    "部門ID",
    "決済日",
    "口座種別",
    "口座ID",
    "金額"
  ]];
  
  //取引データをrowDataListに格納。取引明細があるのでforEachネストで取得
  dealset.forEach(function (deals) {
    deals.forEach(function (deal) {
      for (var i = 0; i < deal.details.length; i++) {
        rowDataList.push([
          deal.id,
          deal.issue_date,
          deal.type,
          deal.partner_id,
          deal.details[i].account_item_id,
          deal.details[i].item_id,
          deal.details[i].section_id,
          deal.payments[0].date,
          deal.payments[0].from_walletable_type,
          deal.payments[0].from_walletable_id,
          deal.details[i].amount
        ]);
      }
    });
  });
  
  var sheet = ss.getSheetByName("取引取得");
  sheet.clear();
  sheet.getRange(1, 1, rowDataList.length, rowDataList[0].length).setValues(rowDataList);
}
```

## APIから取引データを持ってきているところの処理
```javascript
function getDeals(offset) {
  //トークン取得
  var service = getService().getAccessToken();
  
  //URL指定
  var url = 'https://api.freee.co.jp/api/1/deals?';
  url += "company_id=" + COMPANY_ID;
  url += "&status=" + STATUS;
  url += "&start_issue_date=" + START_ISSUE?DATE;
  url += "&offset=" + offset;
  url += "&limit=" + LIMIT;
  url += "&accruals=" + ACCRUALS;
  
  //オプション
  var options = {
    "method": "get",
    "headers": {
      "Authorization": "Bearer " + accessToken
    }
  };
  
  //データ取得と格納
  var res = UrlFetchApp.fetch(url, options).getContentText();
  res = JSON.parse(res).deals;
  return res;
}
```

## 実行結果(getAllDeals);
取引はかなり多量になるので、かなり実行時間かかります（コードがだめなせいもあると思いますが。。。）
とりあえず、決済済み（資金収支のあった）の取引明細を取ってくることには成功。これだけだと取引先名称などがわからないので、別途取引先getするなどが必要。また、各口座の期末残高も別途取得必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388924/0ca120ab-fa67-f5ff-6753-3195d58501c7.png)