どうも。つじけ(tsujikenzo)です。この連載では 「会計freeeAPIを使って残高確認表を作成しよう」 について全7回でお送りします。今日は5回目で 「取引を取得(収入/支出)しよう」 をお届けします。
前回のおさらい
前回は、「事業所IDを取得しよう」 ということで、実際にHTTPリクエストをリクエストURLに送信しました。
HTTPリクエストが成功すると、HTTPレスポンスとして、responseを受け取ることを確認しましたね。
今回は、GETの復習として 「取引(収入/支出)を取得しよう」 をお届けします。
取引(収入/支出)一覧の取得
事業所一覧の取得と同様に、取引(収入/支出)一覧も取得できます。
「取得」ですので、HTTPリクエストの種類は「GET」です。復習しましょう。
リファレンスの確認
[取引(収入/支出)一覧]をクリックします。
Responses(レスポンス)を確認します。HTTPリクエストが成功すると、このようなJSONが返ってきます。
プロパティ[deals]は、配列の要素に {取引(収入/支出)n} を格納しているようです。
{"deals":[
{取引(収入/支出)1},
{取引(収入/支出)2},
{取引(収入/支出)3}
]
}
リクエストURLの作成
リクエストURLを作成します。Partners(パラメーター)の[Try it out]をクリックします。
事業所IDを入力します。
取引の検索対象の[開始日]と[終了日]を入力します。yyyy-mm-dd形式ですのでお間違えなく。
パラメーターの入力が終わったら[Excute]をクリックします。
画面をスクロールすると、[Request URL](リクエストURL)が生成されています。
HTTPリクエストを送信
前回の復習です。HTTPリクエストをリクエストURLに送信してみましょう。
/**
* 取引(収入/支出)一覧を取得する関数
*
* @param none
* @return none
*/
function getMyDeals() {
//freeeAPIのサービスからアクセストークンを取得
const accessToken = getService().getAccessToken();
//HTTPリクエストを送る時に必要なパラメーター
const params = {
"method" : "get",
"headers" : {"Authorization":"Bearer " + accessToken}
};
//リクエストURL
const requestUrl = 'https://api.freee.co.jp/api/1/deals?company_id=3195480&start_issue_date=2021-05-01&end_issue_date=2021-05-31';
//HTTPリクエストをリクエストURLに送信する
const response = UrlFetchApp.fetch(requestUrl, params);
//レスポンスの中身を閲覧する
Logger.log(response);
}
実行ログを確認すると、(件数が多くて表示できていませんが)レスポンスとしてJSONを受け取っています。
HTTPレスポンスの確認
レスポンスをJSONオブジェクトに変換するメソッドは、こちらでした。
//responseをJSONオブジェクトに変換する
JSON.parse(response);
responseをJSON.parse()メソッドでオブジェクトに変換します。
//HTTPリクエストをリクエストURLに送信する
const response = UrlFetchApp.fetch(requestUrl, params);
//レスポンスの中身を閲覧する
// Logger.log(response);
//JSONオブジェクトに変換
const jsonObj = JSON.parse(response);
オブジェクトですので、プロパティのブラケット記法で要素にアクセスできます。
//JSONオブジェクトに変換
const jsonObj = JSON.parse(response);
//取引(収入/支出)の配列を取得する
const deals = jsonObj['deals'];
console.log(deals); // [{取引(収入/支出)1},{取引(収入/支出)2},{取引(収入/支出)3}]
実行ログを確認してみましょう。dealsにはこのように、配列で取引(収入/支出)が格納されています。
データの加工
取得した配列は、最終的に2次元配列としてスプレッドシートに貼り付けますが、配列の要素数を合わせるなど、データの加工 が必要です。
たとえば、取引(収入/支出)の中には、複数の取引が含まれる取引 があります。
通常の取引(収入/支出)とはプロパティの数が異なりますので、データの加工が必要です。
イメージとしては、下記のような「要素に配列が含まれている配列」の加工です。
//元の配列
['a','b',[1,2,3]]
//加工後の配列
['a','b',1]
['a','b',2]
['a','b',3]
いろいろな書き方があると思いますが、私はこのような関数を作成しました。
/**
* 1つの取引(収入/支出)オブジェクトを渡すと、全ての2次元配列を返すサブ関数
*
* @param {object} 1つの取引(収入/支出)オブジェクト
* @return {object} 2次元配列
* ※【注意】55行目のpush()、56行目のマジックナンバーは会計freeeでプロパティの仕様変更があると動かなくなる ※
*/
function getFullArray_(deal) {
//最上層のプロパティを格納
const upperProperties = Object.values(deal);
//detailsプロパティを格納
const details = deal['details'];
const detailsArray = details.map(detail => Object.values(detail));
//paymentプロパティを格納
const payments = deal['payments'];
//deal['payments']プロパティが無い場合、paymentsArrayを作る
let paymentsArray;
try {
paymentsArray = payments.map(payment => Object.values(payment)).flat();
} catch{
upperProperties.push(''); //配列の要素数を合わせる為
paymentsArray = ["id", "date", "from_walletable_type", "from_walletable_id", "amount"];
}
//detailsプロパティを基点に、fullArrayを整形
const fullArray = detailsArray.map(detail => {
return [...upperProperties, ...detail, ...paymentsArray];
}
);
return fullArray;
}
先ほど変数に格納した[deals]は、map()メソッドで2次元配列化します。
//全ての項目を2次元配列化する(サブ関数を使用)
const values = deals.map(deal => getFullArray_(deal)).flat();
スプレッドシートへの貼り付け
完成したコードがこちらです。
/**
* 取引(収入/支出)一覧をスプレッドシートへ出力する関数
*
* @param none
* @return none
*/
function getMyDeals() {
//freeeAPIのサービスからアクセストークンを取得
const accessToken = getService().getAccessToken();
//HTTPリクエストを送る時に必要なパラメーター
const params = {
"method": "get",
"headers": { "Authorization": "Bearer " + accessToken }
};
//リクエストURL
const requestUrl = 'https://api.freee.co.jp/api/1/deals?company_id=3195480&start_issue_date=2021-05-01&end_issue_date=2021-05-31';
//HTTPリクエストをリクエストURLに送信する
const response = UrlFetchApp.fetch(requestUrl, params);
//レスポンスの中身を閲覧する
// Logger.log(response);
//JSONオブジェクトに変換
const jsonObj = JSON.parse(response);
//取引(収入/支出)の配列を取得する
const deals = jsonObj['deals'];
//全ての項目を2次元配列化する(サブ関数を使用)
const values = deals.map(deal => getFullArray_(deal)).flat();
//スプレッドシートシートへ出力
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート1');
sheet.getRange(1,1,values.length, values[0].length).setValues(values);
}
getMyDeals()を実行すると、このようにスプレッドシートに出力できていれば成功です。
まとめ
以上で、「取引(収入/支出)を取得しよう」 ということで、GETのおさらいと、レスポンスを受け取ったあとのデータの加工をお届けしました。
2次元配列の要素数を揃えるために、パズルを解くようなコーディングが発生しますが、条件分岐などを一つ一つクリアしていけば問題ありません。
また、今回はできるだけプロパティの値をベタ書きしないようにしましたが、deals[‘id’]や、deals[‘details’]のように、値を直接書いても問題ありません。
仕様変更があるさいは、会計freeeからもアナウンスが出ますので、ご安心ください。
次回は、「取引(収入/支出)を登録しよう」 をお届けします。
この連載の目次
[GAS]会計freeeAPIを使って残高確認表を作成しよう
1. [GAS][会計freee]連載の概要と準備運動
2. [GAS][会計freee]アプリとアクセストークンを準備する
3. [GAS][会計freee]会計freeeAPIを操作する
4. [GAS][会計freee]事業所IDを取得しよう
5. [GAS][会計freee]取引(収入/支出)を取得しよう
6. [GAS][会計freee]取引(収入/支出)を登録しよう
7. [GAS][会計freee]残高確認表を作成しよう