【Square API】商品データをスプレッドシートから追加するGASの例
Square(スクエア)は、決済システム・業務管理・オンライン販売などを一元化して利用できるサービス。
Squareにはさまざまな種類のAPIがあり、管理している商品の情報はCatalog API で扱えます。
今回は、そのCatalog APIを、Google Apps Script (GAS)で利用して、スプレッドシートからSquareに新規商品データを追加する簡単な例となります。
また、GASの基本的な利用方法については、以下のリンク先参考にしてみてください。
スプレッドシートからSquareに新規商品データを追加する例
例では、Catalog APIを利用したGASを実行することにより、次のようなシートの情報から、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);