VBA で kintone からレコード取得し json 変換する例です。
json 変換に、cJobject ライブラリを使用します。
だいぶ期間が空きましたが、前回 VBA で JSON 変換する cJobject ライブラリの続きです。
環境
Windows 10 Pro
Excel 2016
cjobject ライブラリの準備
cJobject の機能を使うには、下記からexcel ファイルをダウンロードします。
ダウンロードページ で、Data Manipulation を展開すると、最後にvanillacJobject.xlsm があります。
今回は、ダウンロードしたファイルに、VBA IDE で、Module を追加して処理を記述します。
kintone REST API レコード取得
レコード取得方法は、第2回 Excelとkintoneを連携させよう とほとんど同じです。
ただし、例とXMLHTTP オブジェクトのバージョンが違っていたので、変更しました。
Dim objHttpReq As XMLHTTP60 ' XMLHTTP オブジェクト
ログイン認証のBase64変換
cJobject ライブラリに、Base64Encode関数があるので、それを使います。
Dim strAuthorization As String ' Authorization
strAuthorization = Base64Encode("USER:PASS")
レスポンス情報を json 変換
JSONParse 関数でレスポンス情報を、cjobject に変換できます。
Dim resp As cJobject ' json data
Dim records As cJobject ' json data
...
Set resp = JSONParse(strJSON)
Set records = resp.child("records")
レコード内の項目値を取り出す
レコードからユーザー選択項目を取り出します。
Dim strTemp As String
For Each record In records.children
Dim users As cJobject
Dim user As cJobject
Set users = record.child("ユーザー選択").child("value")
strTemp = ""
If users.children.Count > 0 Then
' ユーザーの1番目
Debug.Print "ユーザー選択(1) " & users.child(1).child("name").value
' 全ユーザー
For Each user In users.children
If strTemp <> "" Then
strTemp = strTemp & ", "
End If
strTemp = strTemp & user.child("code").value & ":" & user.child("name").value
Next user
Debug.Print "ユーザー選択: " & strTemp
End If
Next record
Access shortcut
cJobject では、下記の JavaScript のような、書き方で、項目の値を取得できます。
Console.log("Access shortcut: ", records[0]["ユーザー選択"].value[0].code;
cJobject の Access shortcut 機能
Debug.Print "Access shortcut: " & records.child("1.ユーザー選択.value.1.code").value
VBA コード全体
Sub kintoneGetTest1()
'--------------------------------------------------------------------
' 変数定義
'--------------------------------------------------------------------
Dim objHttpReq As XMLHTTP60 ' XMLHTTP オブジェクト
Dim strJSON As String ' レスポンスで受け取るJSONデータ
Dim strURL As String ' アクセス先URL
Dim strQuery As String ' 検索文字列
Dim strAuthorization As String ' Authorization
strAuthorization = Base64Encode("USER:PASS")
'------------------------------------------------------------------
' 検索文字付きURLを作成する
'------------------------------------------------------------------
strQuery = "ユーザー選択 in ( ""Alex2013"" )"
strQuery = URL_Encode(strQuery)
strURL = "https://<サブドメイン>.cybozu.com/k/v1/records.json?&app=846&query=" & strQuery
'------------------------------------------------------------------
' XMLHTTP オブジェクトを生成する
'------------------------------------------------------------------
Set objHttpReq = CreateObject("MSXML2.XMLHTTP")
objHttpReq.Open "GET", strURL, False
'------------------------------------------------------------------
' XMLHTTP のリクエストヘッダーを指定する
'------------------------------------------------------------------
' ログイン認証
objHttpReq.setRequestHeader "X-Cybozu-Authorization", strAuthorization
' Basic 認証
'objHttpReq.setRequestHeader "Authorization", "Basic " & <ベーシック認証情報>
'ドメイン名:ポート番号
objHttpReq.setRequestHeader "Host", "<サブドメイン>.cybozu.com" + ":443"
'キャッシュ対策(常にレスポンスが取得できる状態にする)
objHttpReq.setRequestHeader "If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT"
'------------------------------------------------------------------
' リクエストを送信する
'------------------------------------------------------------------
objHttpReq.send (Null)
'------------------------------------------------------------------
' レスポンスを取得する
'------------------------------------------------------------------
'レスポンス情報を変数に格納する
Dim resp As cJobject ' json data
Dim records As cJobject ' json data
Dim record As cJobject ' json data
strJSON = objHttpReq.responseText
'Debug.Print "resp: " & strJSON
Set resp = JSONParse(strJSON)
Set records = resp.child("records")
Dim strTemp As String
For Each record In records.children
Dim users As cJobject
Dim user As cJobject
Set users = record.child("ユーザー選択").child("value")
strTemp = ""
If users.children.Count > 0 Then
' ユーザーの1番目
Debug.Print "ユーザー選択(1) " & users.child(1).child("name").value
' 全ユーザー
For Each user In users.children
If strTemp <> "" Then
strTemp = strTemp & ", "
End If
strTemp = strTemp & user.child("code").value & ":" & user.child("name").value
Next user
Debug.Print "ユーザー選択: " & strTemp
End If
Next record
Debug.Print
Debug.Print "Access shortcut: " & records.child("1.ユーザー選択.value.1.code").value
End Sub
'--------------------------------------
'URLエンコード用関数
'--------------------------------------
Function URL_Encode(ByVal strOrg As String) As String
Dim d As Object
Dim elm As Object
strOrg = Replace(strOrg, "\", "\\")
strOrg = Replace(strOrg, "'", "\'")
Set d = CreateObject("htmlfile")
Set elm = d.createElement("span")
elm.setAttribute "id", "result"
d.appendChild elm
d.parentWindow.execScript "document.getElementById('result').innerText = encodeURIComponent('" & strOrg & "');", "JScript"
URL_Encode = elm.innerText
End Function
実行結果
イミディエイトウィンドウ
ユーザー選択(1) Alex2013
ユーザー選択: Alex2013:Alex2013, Alex2014:Alex2014
Access shortcut: Alex2013
関連
VBA で kintone レコードを取得し json 変換
VBA で kintone ユーザー情報を取得し json 変換
VBA で kintone 新規レコード作成、json 文字列変換