Google スプレッドシートと Apps Script で仕入先を一括登録する(KantanBiz API 連携)

Excel やスプレッドシートに溜まった仕入先リストを、手で KantanBiz に入れ直すのは手間がかかります。
この記事では Google スプレッドシート と Google Apps Script を使い、REST API へ行ごとに登録する手順をまとめます。プログラミングに不慣れな方でも、手順どおりに進めれば再現できるように書いています。


こんな人向け

  • KantanBiz で 仕入先マスタを API 経由で登録したい
  • スプレッドシートを正にして、そこから一括反映したい
  • 自社サーバやシェルスクリプトは使わず、Google だけで完結させたい

事前にそろえるもの

次の 3 点が分かっている必要があります。

  1. KantanBiz のベース URL(例: https://(あなたの環境のドメイン)
  2. API 用のアクセストークン(プロフィールの「API アクセストークン」で発行する Bearer トークンなど)
  3. オフィス ID(API では X-Tenant-Id ヘッダに整数で指定する値)

また、REST API の利用は オフィス側のプラン条件があります。利用できない場合は API が 403 を返すことがあるので、そのときはプランや権限をご確認ください。


全体の考え方

KantanBiz の仕入先 API は 1 件ずつ登録する設計です。
「一括アップロード用の専用ボタン」ではなく、スプレッドシートの行をループし、行ごとに HTTP の POST を送るイメージです。

  • リクエスト先: (ベースURL)/api/v1/suppliers
  • ヘッダ: Authorization: Bearer(トークン)X-Tenant-Id:(オフィスID)
  • 本文: JSON。必須は会社名 company_name。そのほかは任意です。

手順 1: スプレッドシートを用意する

  1. 新しい Google スプレッドシートを作成します。
  2. 1 行目をヘッダ行にします。最低限、次の列があると動かしやすいです。
    • company_name(必須。会社名)
  3. 必要に応じて、次のような列を追加できます(列名は API のフィールド名に合わせます)。
    • contact_nameemailphonewebsite
    • postal_codeprefecturecityaddress
    • memocategory など
  4. 2 行目以降に、登録したい仕入先データを入力します。

手順 2: Apps Script を開く

  1. メニューから 「拡張機能」→「Apps Script」 を選びます。
  2. 表示されたエディタに、次のスクリプトを貼り付けます(既存の function myFunction() { ... } は置き換えてかまいません)。

手順 3: スクリプトの内容(コピー用)

次のコードは、初回だけ URL・トークン・オフィス ID をスクリプトのプロパティに保存し、アクティブなシートのデータ行を順に POST する例です。
実行後、api_result 列に HTTP ステータスと応答の先頭が書き込まれます。

/**
 * 初回のみ: BASE_URL / TOKEN / TENANT_ID をスクリプトプロパティに保存
 * エディタで runSetup を選んで実行し、承認してください。
 */
function runSetup() {
  PropertiesService.getScriptProperties().setProperties({
    KANTAN_BASE_URL: 'https://あなたのドメイン',
    KANTAN_TOKEN: 'あなたのBearerトークン',
    KANTAN_TENANT_ID: '123',
  });
}

/** メニューに「仕入先を一括登録」を追加 */
function onOpen() {
  SpreadsheetApp.getUi()
    .createMenu('KantanBiz')
    .addItem('仕入先を一括登録', 'importSuppliersFromSheet')
    .addToUi();
}

/** 2行目〜を読み、API に POST */
function importSuppliersFromSheet() {
  var props = PropertiesService.getScriptProperties();
  var baseUrl = props.getProperty('KANTAN_BASE_URL');
  var token = props.getProperty('KANTAN_TOKEN');
  var tenantId = props.getProperty('KANTAN_TENANT_ID');

  if (!baseUrl || !token || !tenantId) {
    SpreadsheetApp.getUi().alert('先に runSetup で接続情報を保存してください。');
    return;
  }

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var values = sheet.getDataRange().getValues();
  if (values.length < 2) {
    SpreadsheetApp.getUi().alert('ヘッダとデータ行が必要です。');
    return;
  }

  var headers = values[0].map(function (h) { return String(h).trim(); });
  var companyCol = headers.indexOf('company_name');
  if (companyCol === -1) {
    SpreadsheetApp.getUi().alert('1行目に company_name 列が必要です。');
    return;
  }

  var resultCol = headers.indexOf('api_result');
  if (resultCol === -1) {
    resultCol = headers.length;
    sheet.getRange(1, resultCol + 1).setValue('api_result');
  }

  var url = baseUrl.replace(/\/$/, '') + '/api/v1/suppliers';

  for (var r = 1; r < values.length; r++) {
    var row = values[r];
    if (!String(row[companyCol] || '').trim()) continue;

    var payload = {};
    for (var c = 0; c < headers.length; c++) {
      var key = headers[c];
      if (!key || key === 'api_result') continue;
      var v = row[c];
      if (v !== '' && v !== null && v !== undefined) payload[key] = v;
    }

    var options = {
      method: 'post',
      contentType: 'application/json',
      headers: {
        Authorization: 'Bearer ' + token,
        'X-Tenant-Id': tenantId,
        Accept: 'application/json',
      },
      payload: JSON.stringify(payload),
      muteHttpExceptions: true,
    };

    var statusText = '';
    try {
      var res = UrlFetchApp.fetch(url, options);
      statusText = res.getResponseCode() + ' ' + res.getContentText().slice(0, 500);
    } catch (e) {
      statusText = 'ERROR ' + e.message;
    }
    sheet.getRange(r + 1, resultCol + 1).setValue(statusText);
    Utilities.sleep(200);
  }

  SpreadsheetApp.getUi().alert('完了しました。api_result 列を確認してください。');
}

runSetup 内のドメイン・トークン・オフィス ID は、必ず自分の値に書き換えてください。


手順 4: 初回の承認と実行

  1. Apps Script エディタで、関数プルダウンから runSetup を選び、実行します。
  2. 「承認が必要です」と出たら、画面の指示に従い、自分の Google アカウントでこのスクリプトを許可します。
  3. 実行が成功したら、エディタに残したままのトークンを削除するか、ダミー文字に差し替えるなど、秘密情報をリポジトリや共有しやすい場所に長く置かない運用を推奨します(値はスクリプトプロパティに残ります)。
  4. スプレッドシートに戻り、再読み込みします。メニューに 「KantanBiz」→「仕入先を一括登録」 が増えているので、それを実行します。

結果の見方

  • api_result 列に、HTTP のステータスコードと応答本文の一部が入ります。
  • 登録に成功した場合、多くの環境では 201 が返ります。
  • 403 のときは、トークン・オフィス ID・プラン条件などを疑ってください。
  • 400 でテナント関連のメッセージが出る場合は、X-Tenant-Id が正しいか確認してください。

セキュリティについて

  • API トークンはパスワードと同様に扱い、スプレッドシートのセルにそのまま書かない方が安全です。
  • スクリプトの編集権限を持つ人は、プロパティに保存した値にアクセスできる可能性があるため、信頼できる範囲で権限を管理してください。
  • 連携が終わったら、不要なトークンは KantanBiz 側で削除するとよいです。

まとめ

  • KantanBiz の仕入先は API で 1 件ずつ登録する形です。
  • Google スプレッドシート + Apps Script で、表の行をループして同じ POST を繰り返せば、実質的な「一括登録」ができます。
  • ヘッダ行の列名を API のフィールド名に合わせるのがコツです。

社内の運用に合わせて、列を増やしたり、エラー行だけ再実行するロジックを足したりする余地はあります。まずは少ない行数で試し、api_result を確認しながら本番データに広げるのがおすすめです。


免責・注意: 画面仕様や API の利用条件はサービスのアップデートで変わることがあります。最新は公式の案内や管理画面の説明をご確認ください。


\フォローする/

KantanBiz アカウント作成

アカウントを登録すると「30日間お試し」が開始され、すぐに全機能を利用できます。
  • X

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です