VBAでカラーミーショップAPIを使って在庫更新してみた②


<前回の記事

前回ショップへアクセスするための「アクセストークン」を取得しました。今回はこのアクセストークンを使って商品データにアクセスしたいと思います。

カラーミーショップ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」に変更することにより、問題無くデータの参照が行える様になりました。

これで現在の在庫数が取得できる様になりました。次回はこの在庫数を増減させたものをカラーミー側に反映させてみたいと思います。

関連記事と広告

シェアする

  • このエントリーをはてなブックマークに追加

フォローする