お世話になっております。
記事「第1回 Excelとkintoneを連携させよう」を参考に
VBAでkintoneAPIを利用し、フィールド「ユーザー選択」の値を取得したいのですが、
配列になっているからか、なかなかうまくいきません。
ご教示頂けないでしょうか。
Dim strURL As String
Dim strQuery As String
strQuery = “customer = “”ジョイゾー”””'フィールド「ユーザー選択」を取得したい
strQuery = URL_Encode(strQuery)
strURL = “https://(サブドメイン名).cybozu.com/k/v1/records.json?&app=43&query=” & strQuery
よろしくお願いします。
yado さん
json 変換に cjobject ライブラリを使った例を下記に上げました。
VBA で kintone レコードを取得し json 変換
cjobject ライブラリは、あまり使用例が無いのがネックですが、JSONLib より高機能で便利です。
ご参考になれば。
rex0220さん
お世話になっております。
リンクを参考にさせて頂き、「ユーザー選択」は取得することが出来ました。
しかし、通常のテーブルを取得することが出来なくなってしまいました。
ご教示頂けないでしょうか。
{“records”:[{
{“ユーザー選択”:{“type”:“USER_SELECT”,“value”:[{“code”:“user”,“name”:“ユーザー”}]},
“abc”:{“type”:“NUMBER”,“value”:“ABC”},
“def”:{“type”:“CHECK_BOX”,“value”:[“DEF”]}
}]}
やりたいこと
“abc”・"def"のそれぞれの"value"である、“ABC”・"DEF"を取得したい。
JSONLibでは取得出来たのですが、
2回apiリクエストを投げなければならないでしょうか。
よろしくお願いします。
切り貼りしただけですが、下記のようなコードで取得出来ると思います。
変数名やオブジェクトの階層は、調整してください。
Dim record as cJobject, defObj as cJobject
' 全レコード
For Each record In records.children
If record.child("ユーザー選択.value").children.Count > 0
Debug.Print "ユーザー選択: " & record.child("ユーザー選択.value.1.name").value
End If
Debug.Print "abc: " & record.child("abc.value").value
For Each defObj In record.child("def.value").children
Debug.Print "def: " & defObj.value
Next defObj
Next record
rex0220さん
お世話になっております。
無事、“ユーザー”・“ABC”・"DEF"の値を取得することが出来ました。
cJobjectの書き方にはコツが必要ですね。
リンクを参考に実装してみます。
ありがとうございました。
rex0220さん
お世話になっております。
/v1/user/organizationsのリクエストAPIを投げ、
organizationTitles > organizationの"id"・"Name"を取得しようとしたところ、
エラーが出てしまいました。うまく取得する方法をお教え頂けますでしょうか。
Dim resp As cJobject ’ json data
strJSON = objHttpReq.responseText
Set resp = JSONParse(strJSON)
Set records = resp.child(“organizationTitles”)
For Each Record In records.children
Dim orgID
Dim orgName
orgID = Record.child(“id.value”).value
orgName = Record.child(“name.value”).value
Next Record
また、取得したい"organization"は複数あります。
何度も申し訳ありません。
よろしくお願いします。
とりあえず、resp の中身をみましょう。
Debug,Print "resp: " & strJSON
レスポンスの例をみると、organizations になっています。
それにあわせましょう。
Set organizations = resp.child(“organizations”)
{
"organizations": [
{
"id": 5,
"name": "org1",
"code": "org1",
"parentCode": "org3",
"localName": "ln1",
"localNameLocale": "en",
"description": "desc1",
},
]
}
rex0220さん
お世話になっております。
上記の方法にて、取得することが出来ました、ありがとうございます。
別の質問なのですが、軽量化のため下記のようにidの絞り込みは出来ますか。
strQuery = 'idの絞り込みのクエリ
strURL = “https://(サブドメイン).cybozu.com/v1/organizations.json?” & strQuery
kintoneアプリ内だと出来ると思うのですが、外部からAPIを投げるとどうなのでしょうか。
ユーザーAPI ですので、kintoneアプリ内でも、外部でも同じです。
リクエストの例
ids[0]=1&ids[1]=2&ids[2]=3&offset=0&size=10
rex0220さん
お世話になっております。
ご教示頂きありがとうございます。
指定の仕方が誤っておりました。
失礼しました。
ちなみにですが、なぜcjobject ライブラリを使用したのでしょうか。
JSONLibよりcjobjectを使うメリットは何でしょうか。
(JSONLibだとサブテーブルが取れないから?)
今更お聞きしてますが、ライブラリは拘っておらず、今ふと思った次第です。
(サンプルコードは必要ありません)
今後のためにご教示頂けると大変嬉しいです。
以前、Excel で、kintone アプリのレコード取得&更新を行う開発案件があり、
その時 VBA の json ライブラリを調べて、cJobject を見つけました。
一番は、json を組み立てやすかったことだと思います。
record.文字列__1行.value = “テスト”; をVBA で組み立てると結構大変です。
cJobject だとそれらしく、設定できました。
With params.child(“record”)
.add “文字列__1行.value”, “テスト”
End With
rex0220さん
例えば、
record.文字列__1行.value = “テスト”;
と表現したいとすると、
JSONLibだとVBA で組み立てなければならないのに対し、
cJobject だとchild(“record”)で済むということですね。
jsonを使う機会が多いので、cJobjectライブラリはまた使うかもしれません。
お教えいただき、ありがとうございました。