VBAでAPIを利用したクエリ検索方法について

お世話になっております。

記事「第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

 

 

VBA で kintone 新規レコード作成、json 文字列変換 レコードの項目値へのアクセス に、

項目や配列の値を取得する記述方法のパターンを書いていますので、参考になると思います。

 

 

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ライブラリはまた使うかもしれません。

お教えいただき、ありがとうございました。