LoginSignup
0
0

More than 3 years have passed since last update.

cJobjectでkintoneのデータをExcelシートに一括転記

Posted at

はじめに

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はアプリ番号を入れる。

vba
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
vba
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トークンを変数に代入する。

vba
aipToken = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
3.XMLHTTPオブジェクトの生成
vba
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アプリ上に存在しなかった場合はエラー処理。

vba
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を末尾に加える。

vba
Worksheets("Form").Range("P3").value = resp.child("records").child(1).child("Address1").child("value").value

kintoneアプリ内に作成した入力用テーブルの項目にアクセスするには長い記述が必要でした。
ここではkintoneアプリの入力用テーブル"TableA1"のフィールド"DescriptionA_1"のデータにアクセスして変数代入します。

vba
Worksheets("Form").Range("J9").value = resp.child("records").child(1).child("TableA1").child("value").child(1).child("value").child("DescriptionA_1").child("value").value

おわりに

なさそうで意外にある、なし寄りのありな需要だと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0