GAS×freeeAPI連携で、部門階層を一括作成する方法|スクリプト配布中!

こんにちは。ITライターのもり(@moripro3)です!

「GAS」と「クラウド会計ソフトfreeeのAPI」を使った自動化の記事をお届けしています。

過去の記事で、GAS × freeeAPI の連携で「データ取得」と「データ作成」の基本的な手順を紹介しました。

関連記事

こんにちは。ITライターのもり(@moripro3)です! 「GAS」と「クラウド会計ソフトfreeeのAPI」を使った自動化の記事をお届けしています。 前回の記事では、GASでfreeeAPIを使うための作業手順を紹介しました[…]

関連記事

こんにちは。ITライターのもり(@moripro3)です! 「GAS」と「クラウド会計ソフトfreeeのAPI」を使った自動化の記事をお届けしています。 前回の記事では、freeeAPIから取得したデータをスプレッドシートに出力[…]

 

会計freee の取引登録では、摘要に「部門」を付与できます。一定規模の企業では「部門の階層」を設定する(親部門の設定)ことで、より本格的な部門会計を行っているでしょう。

freeeのcsvインポート機能で部門の一括作成ができますが、2021年3月現在「部門階層の設定」は対応されていません。そこでこの記事では、GASとfreeeAPIで「部門を一括作成して、階層の設定をするスクリプト」を紹介します!

freeeで設定できる階層と子部門の数

freeeで設定できる階層の数は、利用プランによって異なります(freeeヘルプセンターより引用)

  • (法人)ベーシックプラン・(個人)プレミアムプランの場合
    設定できる階層は、2階層(親部門・子部門)です。
    ②1つの親部門(中間の親部門も含む)に対して設定できる子部門は、100までです。
  • (法人)プロフェッショナルプラン・エンタープライズプランの場合
    設定できる階層は、最大5階層です。
    ②1つの親部門(中間の親部門も含む)に対して設定できる子部門は、100までです。

freeeAPIで部門を作成する

それではfreeeAPI公式リファレンスを参照しながら、情報を確認していきましょう。

APIリクエストに関する情報を確認する

まず、メソッドとリクエストURLを確認します。

APIリクエストでデータ作成(登録)するときは、通常「POST メソッド」を使用します。

処理 メソッド
データの取得 GET
データの作成 POST
データの更新 PUT
データの削除 DELETE

 

部門作成の「リクエスト URL」は以下のとおりです。

  • ①APIエンドポイント(固定値) = https://api.freee.co.jp/
  • ②個別URL = /api/1/sections
  • ③パラメータ = なし

①+②+③を結合した文字列が、目的となるリクエストURLです。

https://api.freee.co.jp/api/1/sections

freeeAPIで部門階層を作成するポイント

親:営業本部 ー 子:営業第一部という階層を例にして考えてみましょう。

 

freeeAPI 公式リファレンスの「Request body」の欄の「Model」をクリックして、データ作成に必要な項目を確認します。

パラメータのなかにparent_id(親部門ID)という項目があります。子階層を作成するときは、リクエストボディのパラメータにparent_idを指定すればよいことがわかります。

ここでのポイントは、パラメータに指定する値が、親部門の「名前」ではなく「ID」であることです。子階層「営業第一部」の作成には、親部門「営業本部」の部門IDが必要というわけです。

ただし、freeeの画面上では部門IDを確認できないので、ひと工夫必要になります。

freeeAPIの「部門一覧の取得( /api/1/sections )」を使って部門IDを取得します。つまり、スクリプトは下記の2段構成となります。

  1. 【GET】親部門「営業本部」の部門IDを取得する
  2. 【POST】①の取得値を使用して子階層「営業第一部」を作成する

スプレッドシートに部門データを用意する

スプレッドシートに、作成する部門のデータを入力します。列は下記の5つを用意します。

  • 部門名
  • 親部門名
  • 正式名称
  • ショートカット1
  • ショートカット2

ここでは、下記のような5階層を作ります(部門の階層がわかりやすいよう色を付けています)

※2行目から順番に作成処理をしていくので、A列の部門を作成するときにはその親部門の作成が終わっている状態になるよう、上から順番にスプレッドシートに入力しましょう

スプレッドシートの1行分のデータを、このようなJSONデータの形式にしてfreeeAPIにPOSTすればよさそうですね。

const section = {
    company_id: 9999999, //事業所ID
    name: "営業第一部",
    long_name: "正式名称",
    shortcut1:"ショートカット1",
    shortcut2: "ショートカット2",
    parent_id: 123456//ここに親部門の部門IDを設定
}

 

部門階層を作成するスクリプト

スプレッドシートのデータから部門を一括作成するスクリプトです。createSections関数を実行します。

「GASでfreeeAPIを使うための作業手順を分かりやすく解説」で書いたfreeeAPI認証用のスクリプトを、同じプロジェクト内に記述しておく必要があります。
//エントリポイント
function createSections() {

  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('部門');
  const values = sheet.getDataRange().getValues();

  const company_id = "事業所IDを設定"; //事業所ID
  const access_token = getService().getAccessToken();

  let json;

  for (let i = 1; i < values.length; i++) {

    const parent_name = values[i][1];

    if (parent_name === "") { //親部門なし = 最上位の階層

      json = createJSON_(company_id, values[i], null);

    } else { //親部門あり

      //親部門IDを取得
      const parent_id = getParentID_(access_token, company_id, parent_name);

      if (parent_id !== "") {
        json = createJSON_(company_id, values[i], parent_id);
      } else {
        sheet.getRange(i + 1, 6).setValue(`親部門[${parent_name}]の登録がありません`);
      }

    }

    postSection_(access_token, json);

  }

}

/**
* 配列からJSONデータを作成する
*
* @param {Number} company_id 事業所ID
* @param {Object} array 1件分の配列
* @param {string} parent_id 親部門ID
* @return {Object} obj JSONデータ 
*/
function createJSON_(company_id, array, parent_id) {

  const obj = {
    company_id: company_id,
    name: array[0],
    long_name: array[2],
    shortcut1: array[3],
    shortcut2: array[4],
    parent_id: parent_id
  }

  for (let key in obj) {
    //値無しのキーを削除
    if (obj[key] == null || obj[key] === "") delete obj[key];
  }

  //オブジェクトをJSONデータに変換
  const json = JSON.stringify(obj);

  return json;

}

/**
 * 部門名から部門IDを返す
 * 
 * @param {string} access_token アクセストークン
 * @param {Number} company_id 事業所ID
 * @param {string} parent_name 親部門名
 * @return {string} parent_id 親部門ID
 */
function getParentID_(access_token, company_id, parent_name) {

  const url = `https://api.freee.co.jp/api/1/sections?company_id=${company_id}`;

  const params = {
    method: "get",
    headers: { "Authorization": "Bearer " + access_token }
  };

  const response = UrlFetchApp.fetch(url, params);

  const obj = JSON.parse(response).sections; //sectionプロパティを抜き出す

  let parent_id = "";
  for (let i in obj) {
    if (obj[i].name == parent_name) {
      parent_id = obj[i].id;
      break;
    }
  }

  return parent_id;

}

/**
* freeeAPIにPOSTリクエストして部門を作成する
*
* @param {string} アクセストークン
* @param {Object} リクエストボディ
*/
function postSection_(access_token, json) {

  const params = {
    method: "POST",
    contentType: "application/json",
    headers: { "Authorization": "Bearer " + access_token },
    payload: json,
    muteHttpExceptions: true //エラーが発生したらレスポンスに出力
  }

  const url = "https://api.freee.co.jp/api/1/sections";

  const response = UrlFetchApp.fetch(url, params);
  Logger.log(response);

  Utilities.sleep(500); //過度のアクセスを回避するため待機

}

 

実行結果

freeeの画面を確認します。スプレッドシートに用意した5つの階層を持つ部門が一括作成されました。

 

興味のある方は、GASのログ(freeeAPIからのレスポンス)も確認してみましょう。1件(1部門)作成完了するごとに、結果がログ出力されます。”parent_id” が親部門IDです。

 

【まとめ】部門マスタを一括作成して親子階層の設定をする

この記事では、freeeAPIを使用して部門階層を一括作成するスクリプトを紹介しました。csvインポート機能では対応されておらず手作業が必要な処理でも、このようにfreeeAPIで実現できる場合があるので便利です。

この記事で紹介したスクリプトをすぐに使えるスプレッドシートを配布しています。こちら(クリックするとスプレッドシートが開きます)からコピーしてお使いください。

請求書の受け取りはsweeepで自動化

【AI請求書処理】従来の請求書OCRでは対応できない非定型帳票や

自動会計仕訳も、sweeepなら対応可能!最短で即日導入、

面倒な設定不要。手軽に導入して請求業務を効率化。