前回ショップへアクセスするための「アクセストークン」を取得しました。今回はこのアクセストークンを使って商品データにアクセスしたいと思います。
カラーミーショップAPIを叩いてみる
早速ExcelでVBエディタを起動し、以下のコードをコピーして下さい。
モジュールは適当な名前で構いません。
Option Explicit Const ACCESS_TOKEN = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" Const PRODUCT_CODE = "00000000" '指定した商品コードの情報を表示する' Public Sub main() Dim xhr As Object Dim objSC As Object 'Script Control' Dim strFunc As String '関数文字列' Dim strJSON As String 'JSONデータ(文字列)' 'JSON用の設定' Set objSC = CreateObject("ScriptControl") objSC.Language = "JScript" strFunc = "function jsonParse(s) { return eval('(' + s + ')'); }" objSC.AddCode strFunc Set xhr = CreateObject("MSXML2.ServerXMLHTTP.6.0") xhr.Open "GET", "https://api.shop-pro.jp/v1/products/" & _ PRODUCT_CODE & ".json", False xhr.setRequestHeader "Authorization", "Bearer " & ACCESS_TOKEN xhr.setRequestHeader "Content-Type", "application/json" xhr.send strJSON = xhr.responseText Debug.Print strJSON End Sub
「ACCESS_TOKEN」には前回取得したアクセストークンを入力。
「PRODUCT_CODE」には、あなたのショップに登録されている商品の”商品ID”を入力して下さい。商品検索画面などで確認できる、以下の場所に表示される番号です。
対象に設定するものはどの商品でも構いません。
商品データが正しく取得できた場合は、イミディエイトウィンドウに商品データが記載されたJSONデータが表示されています。
おめでとうございます!後はそのJSONコードをVBAで簡単に扱える様に整形するだけです!
・・・と言いたい所ですが、ここからが本当に面倒臭かったんです。私も1週間近くハマってしまい、一度はVBAで操作することを諦めていました。
JSONコードを解析してみる
まずはイミディエイトウィンドウに取得できたJSONコードを、メモ帳などに貼り付けてみましょう。
この様な感じの文字列データが取得できていると思います。
※商品説明等の長さによって文字量が変わります。また、全体を見せるために「右端で折り返す」設定を適用しています。
jsonコードを初めて見た方は何がどうなっているのかさっぱり分からないと思いますので、見やすい形に整形します。
いかがでしょうか。一部文字列はこちらの個人情報の関係で「*」に置き換えています。
それぞれの項目に何の値が設定されているのかがわかりやすくなったと思います。ここで取得できる項目と項目名については、カラーミーショップAPIの一覧ページに表示されている「GET /v1/products.json」をご覧下さい。
それでは何も手をつけていない今の状態で、jsonコードからそれぞれのデータ項目を取得できるかどうか試してみましょう。
先ほど実行したVBAの以下の部分を、
xhr.send strJSON = xhr.responseText Debug.Print strJSON End Sub
次のコードに置き換えて下さい。(赤色の部分を追加、「Debug.Print」削除)
Public Sub main() Dim xhr As Object Dim objSC As Object 'Script Control' Dim strFunc As String '関数文字列' Dim strJSON As String 'JSONデータ(文字列)' Dim objJSON As Object …(省略)… xhr.send strJSON = xhr.responseText Set objJSON = objSC.CodeObject.jsonParse(strJSON) Msgbox objJSON.product.id End Sub
置き換えが終わったら早速実行してみましょう。
A:Set objJSON = objSC.CodeObject.jsonParse(strJSON)
B:Msgbox objJSON.product.id
上記A,Bのコードのどちらかで必ずエラーが発生すると思います。Aでエラーとなった場合は原因が幾つかあるのですが、説明が長くなるので別記事として書きたいと思います。
Bでエラーとなった場合の原因は一つです。「objJSON」以下の指定したキー値が、環境的に使用できないものだった。ということです。
何言ってるのか分かりづらいですね(笑)
今回のケースで言うと「product」部分がエラーの原因です。コードの書き方が悪い訳ではなく、単純に「product」というキー名称が原因でエラーとなっています。
環境に依存する可能性はありますが、他にも「type」、「name」、「value」といったキー値も使用できません。
さぁ困りました。
カラーミーAPIがこのキー名称でデータを返している以上、ユーザー側はどうすることもできません。この段階で詰まったという人もいたのかなぁと作ってた時に思いました。まぁ私の場合はこの「product」というキー値が原因と分かるまでに暫く掛かりましたが・・・
調べてもVBAでカラーミーAPIを使ってる人の記事が無くて本当に困ってました。
キー値問題解決策
「product」が使えないなら名前を変えてあげればいいじゃない。
そうです。
「xhr.responseText」をstring型の「strJSON」に格納している事から分かる様に、JSONデータは元々ただの文字列です。文字列であるならキー値の名前もかんたんに修正できますよね。
今回は「Replace」を使用してキー値を修正します。誤って商品内容や他にキー値まで変更してしまわない様、十分注意しましょう。
それでは以下の部分の処理を、
xhr.send strJSON = xhr.responseText Set objJSON = objSC.CodeObject.jsonParse(strJSON) Msgbox objJSON.product.id
次の形に修正してみましょう。
xhr.send strJSON = xhr.responseText strJSON = Replace(strJSON , """product""", """productdata""") Set objJSON = objSC.CodeObject.jsonParse(strJSON) Msgbox objJSON.productdata.id
「product」のキー値を「productdata」に変更することにより、問題無くデータの参照が行える様になりました。
これで現在の在庫数が取得できる様になりました。次回はこの在庫数を増減させたものをカラーミー側に反映させてみたいと思います。