【Square API】商品データをスプレッドシートから追加するGASの例

Square(スクエア)は、決済システム・業務管理・オンライン販売などを一元化して利用できるサービス。

Squareにはさまざまな種類のAPIがあり、管理している商品の情報はCatalog API で扱えます。

今回は、そのCatalog APIを、Google Apps Script (GAS)で利用して、スプレッドシートからSquareに新規商品データを追加する簡単な例となります。

また、GASの基本的な利用方法については、以下のリンク先参考にしてみてください。

スプレッドシートからSquareに新規商品データを追加する例

例では、Catalog APIを利用したGASを実行することにより、次のようなシートの情報から、Squareに新規商品データを自動で追加する例となります。

スプレッドシート画面の画像
スプレッドシートの画面。例では「商品名」「バリエーション」「商品番号」「価格」の商品データをSquareに追加します

Squareの商品画面では次のように新規商品が登録されます。

Squareの商品管理画面の画像
Squareの商品管理画面

例では、商品に「カテゴリー」や「税」の項目は追加していませんが、それらの情報も追加したい場合は、別途「カテゴリー」や「税」の項目を作成する必要があります。

複数の商品データを追加するCatalog APIについて

今回は、Catalog API の中で、複数の商品データを追加できるBatch upsert catalog objectsのエンドポイントを利用しています。

商品情報など、APIリクエストで送信するデータはJSONデータとなります。また、そのJSONの商品情報には商品のバリエーション情報を含みます。

JSONデータの形式など詳しくは文末の参考サイトを確認してみてください。

アクセストークンを取得

SquareのAPIを利用する際に必要となるProduction のAccess Token (アクセストークン)は、確認済みの前提としています。

アクセストークンの確認は、Square Developer で作成した「Application」画面内の「Production」タブから確認できます。

GASのコード

コードの例は以下となり、GASのエディタ画面に記述して実行します。

また、コード83行目のXXXXXXXXXXXX の箇所には、上記で確認したアクセストークンを入力します。

function myFunction(){

  // シートからデータを取得して並び替え
  const sheet = SpreadsheetApp.getActiveSheet();
  const values = sheet.getRange('A2:D5').getValues();
  values.sort();

  // 商品データを扱う変数を定義
  let items = []; // 商品の配列
  let item = ''; // 商品データ
  let prevName = ''; // 1つ前のループの商品名
  // 商品のバリエーションデータを扱う変数を定義
  let variations = []; // バリエーションの配列
  let variation = ''; // バリエーションデータ
  let itemVariations = []; // 商品データに追加したバリエーションの配列にアクセスするため

  // 商品データをオブジェクトデータに変換するループ
  for(let i = 0; i < values.length; i++) {

    // 取得したシートのデータから個別の値を変数にセット
    const name = values[i][0]; // 商品名
    const vname = values[i][1]; // バリエーション名
    const sku = values[i][2]; // 商品番号
    const amount = values[i][3]; // 価格

    // 現在と1つ前のループの商品名が異なる場合(新たな商品)
    if(name != prevName ){

      // 初回ループ以外の場合
      if(i != 0){
        // 商品の配列にデータを追加
        items.push(item);
        // バリエーションデータの配列を空にする
        variations = [];
      }

      // 商品データのオブジェクトに値を追加して変数にセット
      item = {
        "type": "ITEM",
        "id": "#" + name,
        "item_data": {
          "name": name,
          "variations": variations
        }
      }

      // 商品のバリエーションの配列にアクセスするため変数にセット
      itemVariations = item.item_data.variations;
    }

    // バリエーションデータのオブジェクトに値を追加して変数にセット
    variation =  {
      "type": "ITEM_VARIATION",
      "id": "#" + name + "_" + vname,
      "item_variation_data": {
        "item_id": "#" + name,
        "name": vname,
        "sku": sku,
        "pricing_type": "FIXED_PRICING",
        "price_money": {
          "amount": amount,
          "currency": "JPY"
        }
      }
    }

    // 商品のバリエーションの配列にデータを追加
    itemVariations.push(variation);

    // 現在のループの商品名を変数にセット
    prevName = name;
  }

  // 商品データの配列に最後のデータを追加
  items.push(item);


  // Catalog APIを利用して商品データを登録
  const objects = [{ "objects": items }];

  const headers = {
    'Square-Version' : '2021-11-17',
    'Authorization' : 'Bearer XXXXXXXXXXXX'
  };
  const uuid = Utilities.getUuid();
  const payload = {
    "idempotency_key": uuid,
    "batches": objects
  };

  const options = {
    'method' : 'post',
    'contentType' : 'application/json',
    'headers' : headers,
    'payload' : JSON.stringify(payload),
    'muteHttpExceptions' : true
  };

  const url = 'https://connect.squareup.com/v2/catalog/batch-upsert'
  const res = UrlFetchApp.fetch(url, options);
  const data = JSON.parse(res.getContentText());

  console.log(data);
}

商品を更新する場合

例のコードは新規商品を登録する例となるので、実行するたびSquareに商品が追加されます。

商品が登録済みの際には、データの追加ではなく更新をしたい場合は、商品登録時に生成されるidなどを、別のAPIで取得して利用する必要があります。

商品とバリエーションのidについて

商品とバリエーションのオブジェクトにあるidの値は、それぞれ一意の文字列を指定し、接頭辞に# を付けることで新規の商品・バリエーションを登録できます。

また、そのidの値は商品登録時にランダムの英数字に変換されます。APIで商品・バリエーションを更新したい場合には、idの値にその英数字を指定します。

バリエーションのterm_idについて

バリエーションのオブジェクトにあるterm_idの値には、紐付けたい商品のオブジェクトにあるidの値を指定します。

GASの説明

以下、上記コードの簡単な説明となります。

シートからデータを取得して商品名で並び替え

コード3行目からの次の箇所では、シートのA2:D5の範囲に入力したデータを取得して並び替えています。取得されるデータは2次元配列となり、その要素を商品名の順番で並び替えています。

  // シートからデータを取得して並び替え
  const sheet = SpreadsheetApp.getActiveSheet();
  const values = sheet.getRange('A2:D5').getValues();
  values.sort();

シートの範囲を取得する方法の詳細は、以下のリンク先を参考にしてみてください。

商品データをオブジェクトに変換

コード8行目からの次の箇所では、商品データをオブジェクトの形式にして配列にセットしています。

  // 商品データを扱う変数を定義
  let items = []; // 商品の配列
  let item = ''; // 商品データ
  let prevName = ''; // 1つ前のループの商品名
  // 商品のバリエーションデータを扱う変数を定義
  let variations = []; // バリエーションの配列
  let variation = ''; // バリエーションデータ
  let itemVariations = []; // 商品データに追加したバリエーションの配列にアクセスするため

  // 商品データをオブジェクトデータに変換するループ
  for(let i = 0; i < values.length; i++) {

    // 取得したシートのデータから個別の値を変数にセット
    const name = values[i][0]; // 商品名
    const vname = values[i][1]; // バリエーション名
    const sku = values[i][2]; // 商品番号
    const amount = values[i][3]; // 価格

    // 現在と1つ前のループの商品名が異なる場合(新たな商品)
    if(name != prevName ){

      // 初回ループ以外の場合
      if(i != 0){
        // 商品の配列にデータを追加
        items.push(item);
        // バリエーションデータの配列を空にする
        variations = [];
      }

      // 商品データのオブジェクトに値を追加して変数にセット
      item = {
        "type": "ITEM",
        "id": "#" + name,
        "item_data": {
          "name": name,
          "variations": variations
        }
      }

      // 商品のバリエーションの配列にアクセスするため変数にセット
      itemVariations = item.item_data.variations;
    }

    // バリエーションデータのオブジェクトに値を追加して変数にセット
    variation =  {
      "type": "ITEM_VARIATION",
      "id": "#" + name + "_" + vname,
      "item_variation_data": {
        "item_id": "#" + name,
        "name": vname,
        "sku": sku,
        "pricing_type": "FIXED_PRICING",
        "price_money": {
          "amount": amount,
          "currency": "JPY"
        }
      }
    }

    // 商品のバリエーションの配列にデータを追加
    itemVariations.push(variation);

    // 現在のループの商品名を変数にセット
    prevName = name;
  }

  // 商品データの配列に最後のデータを追加
  items.push(item);

Catalog APIを利用して商品データを登録

コード78行目からの次の箇所では、HTTP通信を行えるUrlFetchApp.fetchメソッドを利用して、Catalog API から商品データを登録しています。

また、XXXXXXXXXXXX の箇所には、確認したアクセストークンを入力します。

  // Catalog APIを利用して商品データを登録
  const objects = [{ "objects": items }];

  const headers = {
    'Square-Version' : '2021-11-17',
    'Authorization' : 'Bearer XXXXXXXXXXXX'
  };
  const uuid = Utilities.getUuid();
  const payload = {
    "idempotency_key": uuid,
    "batches": objects
  };

  const options = {
    'method' : 'post',
    'contentType' : 'application/json',
    'headers' : headers,
    'payload' : JSON.stringify(payload),
    'muteHttpExceptions' : true
  };

  const url = 'https://connect.squareup.com/v2/catalog/batch-upsert'
  const res = UrlFetchApp.fetch(url, options);
  const data = JSON.parse(res.getContentText());

  console.log(data);

参考サイトなど

コメント投稿コメント投稿欄を開く

コメントは項目欄(*は必須項目)を入力し、「コメントを送信」ボタンをクリックしてください。 (メールアドレスは公開されることはありません。コメントの公開は承認制となります。)

また、多忙によりコメントには返信できない場合があります。

Twitterで返信する場合はこちらから。