はじめに
1年以上前の案件がQiita下書きに残っていた。
忘れかけてたけど思い出しながら記録に残します。
開発環境
Excel (Office365)
背景
kintoneは帳票機能が弱い。
エクセル管理をやめてkintoneアプリで管理できるみたいなこと言うけど
帳票機能が貧弱過ぎて結局kintoneアプリのデータをエクセルに移して帳票するっていう需要があった。
cJobjectとは
kintoneアプリのデータ(json)をエクセルデータに変換するのがcJobjectライブラリです。
jsonデータはそのままではエクセルデータには変換できない。
事前に必要なこと
- kintone APIを生成しておく。
- kintoneアプリ番号を調べておく。
kintoneの各パーツ(テキスト入力やラジオボタンなど)に対してちゃんと命名しておく。適当にやると後で分からなくなりがち。
-
内容
この順序で実施すればうまくいくはず。
1.クエリ生成
2.APIトークン情報
3.XMLHTTPオブジェクトの生成
4.リクエストを送信/レスポンスを取得
5.エクセルシートに入力
1.クエリ生成
1行目:エクセルのB3セルに入力されたクライアントNoを変数に代入する。
2行目:クライアントNoをキーにしてクエリを生成します。
3行目:URLエンコードします。
4行目:URLエンコードを使用してリクエストURLを生成します。
https://xxxx はテナント名を入れて、app=99はアプリ番号を入れる。
str = Worksheets("Form").Range("B3").value
strQuery = "Client_No = " & str & ""
strQuery = URL_Encode(strQuery)
strURL = "https://xxxx.cybozu.com/k/v1/records.json?&app=99&query=" & strQuery
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
2.APIトークン情報
kintoneで作成したAPIトークンを変数に代入する。
aipToken = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
3.XMLHTTPオブジェクトの生成
Set objHttpReq = CreateObject("MSXML2.XMLHTTP")
objHttpReq.Open "GET", strURL, False
objHttpReq.setRequestHeader "X-Cybozu-API-Token", aipToken
objHttpReq.setRequestHeader "Host", "xxxx.cybozu.com" + ":443"
objHttpReq.setRequestHeader "If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT"
4.リクエストを送信/レスポンスを取得
エクセルB3セルに入力した、クライアントNoのレコードデータが配列変数strJSONに格納される。
クライアントNoがkintoneアプリ上に存在しなかった場合はエラー処理。
objHttpReq.send (Null)
strJSON = objHttpReq.responseText
Debug.Print strJSON
Set resp = JSONParse(strJSON)
If strJSON = "{""records"":[],""totalCount"":null}" Then
MsgBox "Client No: " & str & " is not found.", vbCritical
Exit Sub
End If
5.エクセルシートに入力
仮にクライアント情報の住所データであれば、下記のように指定すればOK。
変数"records"はkintoneアプリ内の指定のレコードデータ(全フィールド)が代入されています。
そのデータのAddress1のデータにアクセスするには.child(1).child("Address1").child("value").valueを末尾に加える。
Worksheets("Form").Range("P3").value = resp.child("records").child(1).child("Address1").child("value").value
kintoneアプリ内に作成した入力用テーブルの項目にアクセスするには長い記述が必要でした。
ここではkintoneアプリの入力用テーブル"TableA1"のフィールド"DescriptionA_1"のデータにアクセスして変数代入します。
Worksheets("Form").Range("J9").value = resp.child("records").child(1).child("TableA1").child("value").child(1).child("value").child("DescriptionA_1").child("value").value
おわりに
なさそうで意外にある、なし寄りのありな需要だと思います。