VBA で kintone の新規レコードオブジェクトを作成し json 文字列に変換する例です。
json 変換に、cJobject ライブラリを使用します。
Access shortcut 機能で、項目値の設定が簡単にできます。
With params.child("record")
.add "文字列__1行.value", "テスト"
End With
cjobject ライブラリの準備
cJobject の機能を使うには、下記からexcel ファイルをダウンロードします。
ダウンロードページ で、Data Manipulation を展開すると、最後にvanillacJobject.xlsm があります。
今回は、ダウンロードしたファイルに、VBA IDE で、Module を追加して処理を記述します。
cjobject の使い方
How to use cJobject にサンプルがあります。
オブジェクトと配列を組み立てています。
With だらけですね。
Public Sub testcJobject1()
Dim job As cJobject
Set job = New cJobject
With job
.init Nothing, "our first cJobject"
With .add("bill", "founder")
With .add("kids")
With .AddArray
.add , "mary"
.add , "janet"
End With
End With
End With
End With
Debug.Print job.Serialize
Debug.Print job.formatData
End Sub
サンプル実行結果
Serialize で、文字列に変換してくれます。
{"our first cJobject":{"bill":{"kids":["mary","janet" ]}}}
kintone 新規レコード登録用オブジェクト作成
サンプルを応用して、kintone 新規レコード登録用のオブジェクトを作成します。
項目やテーブルの行数が多いと、With だらけです。
value が配列、サブテーブルの例を入れましたので、他の項目も同様に設定出来ると思います。
Public Sub createRecordParams1()
Dim params As cJobject
Set params = New cJobject
With params
.init Nothing
With .add("app", "123")
End With
With .add("record")
With .add("文字列__1行")
With .add("value", "テスト")
End With
End With
With .add("チェックボックス")
With .add("value")
With .addArray
.add , "sample1"
.add , "sample2"
End With
End With
End With
With .add("Table")
With .add("value")
With .addArray
With .add
With .add("value")
With .add("テーブル文字列")
With .add("value", "テスト1")
End With
End With
With .add("ユーザー選択")
With .add("value")
With .addArray
With .add
With .add("code")
.add , "test11"
End With
End With
With .add
With .add("code")
.add , "test12"
End With
End With
End With
End With
End With
End With
End With
With .add
With .add("value")
With .add("テーブル文字列")
With .add("value", "テスト2")
End With
End With
With .add("ユーザー選択")
With .add("value")
With .addArray
With .add
With .add("code")
.add , "test21"
End With
End With
With .add
With .add("code")
.add , "test22"
End With
End With
End With
End With
End With
End With
End With
End With
End With
End With
End With
End With
Debug.Print params.serialize
End Sub
実行結果
イミディエイトウィンドウの表示です。
{"app":"123","record":{"文字列__1行":{"value":"テスト"},"チェックボックス":{"value":["sample1","sample2" ]},"Table":{"value":[{"value":{"テーブル文字列":{"value":"テスト1"},"ユーザー選択":{"value":[{"code":"test11"},{"code":"test12"} ]}}},{"value":{"テーブル文字列":{"value":"テスト2"},"ユーザー選択":{"value":[{"code":"test21"},{"code":"test22"} ]}}} ]}}}
見やすいように整形します。
問題ないようです。
{
"app": "123",
"record":
{
"文字列__1行":
{
"value": "テスト"
},
"チェックボックス":
{
"value": ["sample1", "sample2"]
},
"Table": {
"value": [
{
"value":
{
"テーブル文字列":
{
"value": "テスト1"
},
"ユーザー選択": {
"value": [
{ "code": "test11" },
{ "code": "test12" }
]
}
}
},
{
"value": {
"テーブル文字列":
{
"value": "テスト2"
},
"ユーザー選択": {
"value": [
{ "code": "test21" },
{ "code": "test22" }
]
}
}
}
]
}
}
}
レコードの項目値へのアクセス
child("キー") : キーを指定して、子cJobject を取得します。
child("キー.キー") : Access shortcut キーを指定して、子cJobject を取得します。
children(1) : index を指定して、配列およびオブジェクトの 子cJobject を取得します。
' 項目値の取得
Debug.Print "文字列__1行: " & params.child("record").child("文字列__1行").child("value").value
' 項目値の取得 Access shortcuts
Debug.Print "Access shortcuts: " & params.child("record.文字列__1行.value").value
' 項目値の取得 children
Debug.Print "children: " & params.children(2).children(1).children(1).value
Debug.Print
' サブテーブル項目値の取得
Debug.Print "テーブル文字列: " & params.child("record").child("Table").child("value").child(1).child("value").child("テーブル文字列").child("value").value
' サブテーブル項目値の取得 Access shortcuts
Debug.Print "Access shortcuts: " & params.child("record.Table.value.1.value.テーブル文字列.value").value
実行結果
文字列__1行: テスト
Access shortcuts: テスト
children: テスト
テーブル文字列: テスト1
Access shortcuts: テスト1
Shortcut版 新規レコード登録用オブジェクト作成
cJobject 追加時も、Shortcut 機能が使えます。
kintone で、よくある 項目.value の構造が少し簡単に記述できます。
With .add("文字列__1行.value", "テスト")
これで、コード量を少し減らすことができます。
実行結果は、同じです。
ただし、この記述方法については、いろいろ試した結果出来ることを見つけたものです。
いまのところ、本家サンプルに見つけられませんでした。
あと、直下に1オブジェクトの場合は、 With を省略出来ますので、簡単化します。
これで、だいぶコード量・階層が減って、見やすくなります。
Public Sub createRecordParams2()
Dim params As cJobject
Set params = New cJobject
With params
.init Nothing
.add "app", "123"
With .add("record")
.add "文字列__1行.value", "テスト"
With .add("チェックボックス.value").addArray
.add , "sample1"
.add , "sample2"
End With
With .add("Table.value").addArray
With .add.add("value")
.add "テーブル文字列.value", "テスト1"
With .add("ユーザー選択.value").addArray
.add.add "code", "test11"
.add.add "code", "test12"
End With
End With
With .add.add("value")
.add "テーブル文字列.value", "テスト2"
With .add("ユーザー選択.value").addArray
.add.add "code", "test21"
.add.add "code", "test22"
End With
End With
End With
End With
End With
Debug.Print params.serialize
End Sub
項目別のレコード設定
項目毎に設定する処理です。
cJobject の必要な階層のオブジェクトを取得して、設定できます。
Public Sub createRecordParams3()
Dim params As cJobject, record As cJobject, table As cJobject
Set params = New cJobject
With params
.init Nothing
.add "app", "123"
.add "record"
End With
With params.child("record")
.add "文字列__1行.value", "テスト"
End With
Set record = params.child("record")
With record.add("チェックボックス.value").addArray
.add , "sample1"
.add , "sample2"
End With
record.add("Table.value").addArray
Set table = record.child("Table.value")
With table
With .add.add("value")
.add "テーブル文字列.value", "テスト1"
With .add("ユーザー選択.value").addArray
.add.add "code", "test11"
.add.add "code", "test12"
End With
End With
With .add.add("value")
.add "テーブル文字列.value", "テスト2"
With .add("ユーザー選択.value").addArray
.add.add "code", "test21"
.add.add "code", "test22"
End With
End With
End With
Debug.Print params.serialize
End Sub
関連
VBA で kintone レコードを取得し json 変換
VBA で kintone ユーザー情報を取得し json 変換
VBA で kintone 新規レコード作成、json 文字列変換