いっぱいのメモ

GAS x freeeAPIライブラリはどんなコードで動いているのか?「全メモタグ取得」の巻

ノンプログラマー(ITを専門職としない人材)が、Google Apps Script(以下GAS)でfreee APIを簡単に操作するためのライブラリを作成しています。

ノンプログラマーのためのスキルアップ研究会(以下ノンプロ研)で受講したfreee API講座の内容をベースに作成しています。

マスタ項目取得のメソッドがどう動いているのか

前回、freee API操作の基本となる勘定科目・取引先・品目・部門・メモタグ・税区分などのマスタ項目をどうGAS x freeeAPIライブラリで取得するのかをご紹介しました。

ライブラリ導入後は、ごく数行の単純なコードでマスタ項目の取得ができてしまいますが、これが裏でどう動いているのか気になる方もいらっしゃるかもしれません。

ライブラリのコードは、GitHubで公開しているのですが、まだリファレンスの整備まで至っていません。

https://github.com/gamaylover/freeeAPI

またライブラリのコードは、クラス化に挑戦しているので、GAS初心者の段階で眺めてみてもちょっとよくわからないとなりそうです。

ということで今日はメモタグの取得を例に、ベタ打ちで同じ目的のコードを書くとどうなるかを紹介します。

マスタ項目が多数登録されている場合の鬼門はoffset

マスタ項目に限らず、freee APIから多数のデータを取得する時に初学者がつまづく点は、offsetパラメーターにあります。この話は前々回のブログにて紹介しました。

この時はさらっと触れただけですが、今回は実際にコードで実装していきたいと思います。

登録されているメモタグ全てを取得するコード

function demoGetAllTags() {

  /* なにわともあれアクセストークンと事業所ID */
  const accessToken = getService().getAccessToken();
  const company_id = *******; // 事業所ID

  /* パラメーター(≒絞り込み条件)を指定する */

  // 検索条件
  let start_update_date = '';
  let end_update_date = '';
  let limit = 3000;

  // メモタグオブジェクト一覧を格納する空の配列
  let aryTags = [];

  // メモタグ取得件数の上限以上のメモタグの登録がある場合にオフセット(ずらし)を行い全件を取得
  for (let offset = 0; offset === aryTags.length; offset += limit) {

    // ベースになるリクエストURL
    const baseURL = 'https://api.freee.co.jp/api/1/tags' + `?company_id=${company_id}`;

    // パラメーターに指定がある時だけリクエストURLのアドレスを追加
    let paramsURL = '';
    if (start_update_date) { paramsURL += `&start_update_date=${start_update_date}` }
    if (end_update_date) { paramsURL += `&end_update_date=${end_update_date}` }
    if (offset) { paramsURL += `&offset=${offset}` }
    if (limit) { paramsURL += `&limit=${limit}` }

    // ベースURLとパラメーターURLを結合してリクエストURLを完成
    const url = baseURL + paramsURL;

    // freee API GETリクエストのパラメーター
    const params = {
      headers: { 'Authorization': 'Bearer ' + accessToken },
      method: 'get'
    };

    // リクエストを送り戻り値をJSONオブジェクトに
    const response = UrlFetchApp.fetch(url, params).getContentText();
    const obj = JSON.parse(response);

    // 戻り値のJSONオブジェクトからtagsプロパティに格納されている各メモタグのオブジェクトを格納した配列を取得
    const ary = obj.tags;

    // concatメソッドで配列を結合
    aryTags = aryTags.concat(ary);
    
    // APIコールの短時間での集中を避けるスリープ処理
    Utilities.sleep(600);

  }
  console.log(aryTags);

}

GAS x freeeAPIライブラリのコードとは違う部分もあるのですが、同じ人間が書いているので概ね同じ考え方がベースになっています。

リクエストURLに追加するパラメーターURLは暗黙の型変換で

    // パラメーターに指定がある時だけリクエストURLのアドレスを追加
    let paramsURL = '';
    if (start_update_date) { paramsURL += `&start_update_date=${start_update_date}` }
    if (end_update_date) { paramsURL += `&end_update_date=${end_update_date}` }
    if (offset) { paramsURL += `&offset=${offset}` }
    if (limit) { paramsURL += `&limit=${limit}` }

freee API のリクエストURLは、パラメーターによる条件の指定がある時だけ &limit=100 のような文字列をURLに追加します。

逆に言えば、条件指定がない場合には何も追加してはいけないということで、例えば請求の開始日を指定しない場合に &start_issue_date= のような文字列をURLに加えるとエラーになります。

これを暗黙の型変換を利用したif文による条件分岐によって検索条件の有無を判定して、条件指定が有るときだけリクエストURLを上書きし、必要なリクエストURLを生成しています。

offsetによるずらしは、limitの数だけ足していく

もうひとつのポイントは、offsetパラメーターを使ったずらしです。

offset === aryTags.length が成立している、つまりずらしの数と取得できたレコード数が一致している間はこのループ処理が継続します。取得すべきレコードが無くなるまでループするとその時点のoffset > aryTags.length となりますので、その時点でループを終了させます。

メモタグ”オブジェクト”の配列が取得できました

これでメモタグオブジェクトを格納した配列が取得できました。これをどうスプレッドシートに展開するか…ですが、このメモタグオブジェクトは構造がシンプル(複数階層に分かれていない)ので、比較的手を付けやすいのではないでしょうか。

ここまでがGAS x freeeAPIライブラリのfreeeAPI.tags(accessToken, company_id).getAllTags()メソッドの中身です。

ライブラリでは、 このオブジェクトたちの値を二次元配列に変換して、スプレッドシートに書き込む処理を加えてgetTags2Sheet(sheetName)というメソッドも用意しています。

GASとfreee APIの基礎を学びたい場合はノンプロ研へ

これまでの説明やコードを見て、いまいちどうしてよいかわからない?という方は、ぜひ私も基礎からGASとfreee APIを学んだノンプロ研に参加して、講座を受講してみてください。

現在7月開講に向けての講座の仮申込(希望者一定数以上で開講決定)が受付中です!初心者向けのGAS + freee APIコースも仮申込受付中です!

タグ: ,
Share on:
Previous Post
いっぱいの手紙
freeeAPI

GAS x freeeAPIライブラリのトリセツ「定期的に届くメールからfreeeの取引を作成しよう!」その1 – 対象メールの絞り込み

Next Post
チェスのグランドマスター
freeeAPI

GAS x freeeAPIライブラリのトリセツ「勘定科目・取引先・メモタグの等マスタ項目をスプレッドシートに取得しよう」