今回はGoogle Apps Script(以下GAS)を使ってBASEのAPIにアクセスし、「items/edit(商品編集)」と「orders(注文情報一覧取得)」を操作する方法をそれぞれ解説していきます。
ちなみにGASはJavaScriptベースの書き方らしい。
items/editのAPI仕様
まず対象のAPI仕様はこちら。
こちらの要求を行うためには「write_items」のスコープが必要になります。
アプリ申請の際に以下の項目にチェックを入れていればOKです。
アクセス先のURLはドメインの後ろに「/1/items/edit」を追加した
https://api.thebase.in/1/items/edit
になります。
指定できるパラメータ(編集できる項目)は以下の通り。
項目名 | 説明 |
---|---|
item_id | 商品ID (必須) |
title | 商品名 (任意) |
detail | 商品説明(任意) |
plice | 価格(任意) |
stock | 在庫数(任意) |
visible | 表示:1、非表示:0(任意) |
list_order | 表示順(任意) |
identifier | 商品コード(任意) |
variation_id[0] | バリエーションID(任意 ※バリエーションの更新を行う場合は必須) |
variation[0] | バリエーションの種類(任意) |
variation_stock[0] | バリエーションの在庫数(任意) |
variation_identifier[0] | バリエーションの商品コード(任意) |
項目数が多く一見すると面倒に見えますが、商品ID以外は任意なので特定の項目のみの修正であればシンプルに記述する事ができます。
items/editのソースコード
スクリプトエディタ上での記述は以下の様になります。
function ItemEdit(accessToken){ var data = {}; data["item_id"] = "A123456789"; data["price"] = "1000"; var header = {}; header["Authorization"] = "Bearer " + accessToken; var params ={}; options["method"] = "post"; options["headers"] = header; options["payload"] = data; var response = UrlFetchApp.fetch("https://api.thebase.in/1/items/edit", params); }
どこからともなく出てきた「accessToken」という値を引数として受け取る所から始まっていますが・・・今回アクセストークンの取得に関する処理は記述しませんので、詳しくは以下Pythonの記事を参考にして下さい。
上記のコードは、「A123456789」というIDの商品の価格を「1000」に設定するというリクエストを送信しています。
直前のAPI仕様の説明でも書きましたが、必須項目はIDだけですので、特定の項目のみの変更の場合はだいぶシンプルに書くことができます。
最終的に「UrlFetchApp.fetch()」という関数でリクエストを送信し、json形式のレスポンスを受け取り「response」に格納しているという流れです。
var params ={}; options["method"] = "post"; options["headers"] = header; options["payload"] = data;
「fetch()」の引数のparamsに上記の値を設定していますが、
method はリクエスト方法(post/get)、
headers はヘッダー情報、
payload はパラメータをそれぞれ指しています。
これらの名称は予め指定されている名称ですので、名前を変えたりすると動作しません。ちなみに他の指定可能な項目としては「contentType」なんかもあります。
その他詳細については以下のGoogle Apps Scriptのページで解説されていますので、そちらを参照して下さい。
仮にリクエストの送信に失敗場合は以下の様なjsonデータが返ってきます。
{ "error":"invalid_request", "error_description":"アクセストークンが無効です。" }
jsonデータそのままの形式では扱えないので、以下の様に「JSON.parse()」でjavascriptオブジェクトに変換します。
var response = UrlFetchApp.fetch("https://api.thebase.in/1/items/edit", params); var json = JSON.parse(response.getContentText()); return json["error_description"];
すると、上記の様に「json[“error_description”]」と記述する事で「error_description」の文字列を取り出すことが出来る様になります。
ちなみに書き方は、[]で囲んだ
json[“error_description”]
の形でも、ピリオド繋ぎの
json.error_description
でもどちらでもOKです。
ordersのAPI仕様
続けてordersの解説。APIの仕様はこちら。
こちらの要求を行うためには「read_orders」のスコープが必要になります。
アプリ申請の際に以下の項目にチェックを入れていればOKです。
アクセス先のURLはドメインの後ろに「/1/orders」を追加した
https://api.thebase.in/1/orders
になります。
ordersで指定できるパラメータは以下の通り。
項目名 | 説明 |
start_ordered | 注文日時はじめ yyyy-mm-dd または yyyy-mm-dd hh:mm:ss (任意) |
end_ordered | 注文日時おわり yyyy-mm-dd または yyyy-mm-dd hh:mm:ss (任意) |
limit | リミット (任意 デフォルト: 20, MAX: 100) |
offset | オフセット (任意 デフォルト: 0) |
注意点としては、一回のデータ取得では最大100件の注文情報しか取得出来ない所です。
100件を超える様なデータを扱いたい場合は、offsetの値を100ずつ加算させながらループを回していく感じになります。
ordersのソースコード
ordersにリクエストを飛ばし、返ってきた注文情報一覧を配列として返す処理は以下の様な形になります。
function GetOrders(accessToken, startTime, endTime){ var header = {}; header["Authorization"] = "Bearer " + accessToken; var params ={}; params["method"] = "get"; params["headers"] = header; var url = "https://api.thebase.in/1/orders"; url = url + "?start_ordered=" + startTime; url = url + "&end_ordered=" + endTime; url = url + "&limit=100"; var response = UrlFetchApp.fetch(url, params); var json = JSON.parse(response.getContentText()); var orders = json.orders; return orders; }
items/editでは「payload」に追加したパラメータ要素が、こちらではURLに記述している事に気付いたでしょうか。
呼び方はリクエストパラメータ?URLパラメータ?まぁどちらでも良いと思いますが、これはmethodが「get」になっているためにこの様な渡し方になっています。
仮にpayloadにパラメータを追加して送信しても”エラーにはなりません”。が、当然payloadの指定は無視されるので意味はありません。
『エラーにならない』
というのが地味にやっかいで、見かけ上は正常に値が返って来ているので、パッと見で間違いに気付かない事があります。postとgetを意識せずに進めていると、「payloadに指定したパラメータが反映されていない!」と後になって気付くという状況になる可能性があるので注意して下さい。(私はこれが原因でだいぶハマりました・・・)
ordersのjsonは以下の様な形式で返ってきます。
{ "orders":[ { "unique_key":"154D88A39E454289", "ordered":1396419762, --- 省略 --- }, { "unique_key":"9CD3594222D78673", "ordered":1392345522, --- 省略 --- } ] }
ですので、「json.orders」として取り出したオブジェクトは配列として扱う事ができます。
後はforループで回すなり、orders[0]の用にインデックス指定で操作できますね。
例えば、
orders[0].unique_key
とすれば1番目の注文のユニークキーを取得する事ができます。
「注文のユニークキーって?」
という部分に疑問は残ると思いますが、ここはBASE側の仕様なので詳しくはBASEのAPI仕様を参照して下さい。この時点ではまだ”何を注文したか”という所の情報までは取得できていません。このユニークキーを用いて更にリクエストを飛ばす必要があるので、その内容はまた別の機会に解説していきます。
後あんまり関係無いですが、上のjsonデータに「ordered」というデータが含まれていますが、これは”注文日時”を表しています。
条件指定する時は「yyyy-mm-dd」の文字列形式で指定させる割に返ってくる値は秒数値なんですよね。まぁ使わないから別に良いんですけど、「どうせなら統一しろよ」って思ったり。
という事で今回はここまで。