VBAからKINTONEのレコード取得の際のクエリ

###KINTONEのデータをVBAで取得しエクセルで使用しようとするとエラーになる
KINTONEのデータをVBAで取得しエクセルで使用しようとしています。
クエリ部分でエラーになり、「入力内容が正しくありません。」とエラーになります。
コメントアウトしてある
Param = “app=” & AppId & “&query=limit 500”
では問題なく取得できました。

Param = “app=” & AppId & "&query=報告日 = ““2024-05-24"””
の際のリクエストURLは
https://xxxxx.cybozu.com/k/v1/records.json?app=214&query=報告日 = “2024-05-24”
となっています。
初歩的な質問で恐縮ですが、間違いをご教示いただければと思います。。。

実行したコードをコピー&ペーストしましょう


' サブドメインを保持
Dim SubDomain As String

' アプリIDを保持
Dim AppId As String

' APIトークンを保持
Dim ApiToken As String

Private Function KickWebService(ByVal Path As String, _
                                ByVal Param As String) As String
                                
    Dim Url As String
    Url = "https://" & SubDomain & ".cybozu.com/k/v1/" & Path & "?" & Param
    ' リクエストを送信する
    Debug.Print Url
    Dim http As Object
    Set http = CreateObject("MSXML2.XMLHTTP")
    With http
        ' GETで送信する
        .Open "GET", Url, False
        ' リクエストヘッダにAPIトークンを含める
        .setRequestHeader "X-Cybozu-API-Token", ApiToken
        .send
        KickWebService = .responseText
    End With
                                
End Function


Private Sub allDataGetCommandButton_Click()
    Dim DataWorksheet As Worksheet
    Set DataWorksheet = Worksheets("固定データ")
    SubDomain = DataWorksheet.Range("C4").Value
    AppId = DataWorksheet.Range("C5").Value
    ApiToken = DataWorksheet.Range("C6").Value
    
    Dim Row As Integer, Col As Integer
    Row = 10
    Col = 1
    
    Dim TargetMonth As String
    Dim Param As String
    

'    Param = "app=" & AppId & "&query=limit 500"
    Param = "app=" & AppId & "&query=報告日 = ""2024-05-24"""
    
    Dim Result As String
    Result = KickWebService("records.json", Param)
    
    If Left(Result, 1) <> "[" And Left(Result, 1) <> "{" Then
        Cells(Row, Col) = "取得できませんでした"
        Exit Sub
    End If
    
    Dim Json As Object
    Set Json = JsonConverter.ParseJson(Result)
    
    If Not Json.Exists("records") Then
        Cells(Row, Col) = Json("message")
        Exit Sub
    End If
    
    Dim Items As Variant, ItemCount As Integer
    Set Items = Json("records")
    ItemCount = Items.Count
   

    Dim Keys As Variant
    Keys = ActiveSheet.Range("A9:G9").Value

    Dim ColumnCount As Integer
    ColumnCount = UBound(Keys, 2)
    
    Dim ItemList As Variant
    ReDim ItemList(1 To ItemCount, 1 To ColumnCount)
   

    Dim Count As Integer
    For Count = 1 To ItemCount
        Dim Item As Object
        Set Item = Items(Count)
        ' 各列について処理する
        Dim Index As Integer
        For Index = 1 To ColumnCount
            Dim Key As String, Value As Variant
            Key = Keys(1, Index)
            ' 列名がキーに存在すればデータを取得する
            If Item.Exists(Key) Then
                Set Value = Item(Key)
                ItemList(Count, Index) = Value("value")
            Else
                ItemList(Count, Index) = "データなし"
            End If
        Next Index
    Next Count
    
    
    ' 配列をセルに書き込む
    Range(Cells(Row, Col), _
        Cells(Row + ItemCount - 1, Col + ColumnCount - 1)).Value = ItemList
    
      
    With Range(Cells(Row, Col), Cells(Row + ItemCount - 1, Col + ColumnCount - 1)).Borders
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With

End Sub

クエリーに日本語などが混じる場合は、クエリーにURLエンコードが必要です。

 Application.WorksheetFunction.EncodeURL(クエリー部分)

みたいな感じにするとどうでしょうか?

ご返信いただき有難うございます!

↓を追記し、関数の引数(パラメーター部分)をこちらに変更しました。

    Dim EncodeParam As String
    EncodeParam = Application.WorksheetFunction.EncodeURL(Param)

すると、今までと同じく「入力内容が正しくありません。」とエラーが出ました。
クエリーは以下のようになっています。
https://xxxxx.cybozu.com/k/v1/records.json?app%3D214%26query%3D報告日%20%3D%20"2024-05-24"
“2024-05-24”

度々申し訳ありませんが、どこがおかしいかご指摘いただく事は可能でしょうか。

なぜでしょうね?

?worksheetFunction.EncodeURL("報告日 = "“2024-05-24"”")
%E5%A0%B1%E5%91%8A%E6%97%A5%20%3D%20%222024-05-24%22

貼り付けていただいたURLは、


なぜか報告日という漢字が読めますね。貼り付けの段階で日本語に解釈されているのか?

お返事遅くなり大変失礼しました。
再度実行したところ、以下のようになりました!

https://xxxx.cybozu.com/k/v1/records.json?app%3D214%26query%3D%E5%A0%B1%E5%91%8A%E6%97%A5%20%3D%20%222024-05-24%22

ですがまだ、帰ってくるjsonが「入力内容が正しくありません。」となります。
何度も申し訳ありません。他に原因はありそうでしょうか。。。

Param = "app=" & AppId & "&query=%E5%A0%B1%E5%91%8A%E6%97%A5 = ""2024-05-02"""

「報告日」のみエンコードして直接クエリーを指定したところ、無事データが取得できました。
(試しにフィールドコードを英語にしたところ、すんなり取得できました。。。)
ご指摘いただきました箇所が原因と私もしっかり認識できたので、マクロ修正して対応したいと思います!
お忙しい中お知恵を貸していただき有難うございました。

手元の環境で動くのに、なぜなのかしらべてみたら、
コードに差異があるようです。

私は

https://exmaple.cybozu.com/k/v1/records.json?&totalCount=true&app=1&query=

の後ろのクエリー部分のみをURLエンコードしています。

質問者は、

Url = "https://" & SubDomain & ".cybozu.com/k/v1/" & Path & "?" & Param

としているためParam全体をURLエンコードしているようです。

https://xxxx.cybozu.com/k/v1/records.json?app%3D214%26query%3D%E5%A0%B1%E5%91%8A%E6%97%A5%20%3D%20%222024-05-24%22

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。