

パワークエリで、kintoneのAPIを利用する処理を作成しました。  
基本的な処理はうまくいったのですが、APIにPOSTするデータにダブルクオーテーションが  
入っているとエラーが発生します。

ダブルクオーテーションの利用自体は問題ないAPIなので、  
おそらくエスケープ処理がうまくいっていないのではと考えています。

■実際の処理部分

[code]

    requestBody = "{""app"": " & app_id &  ",""size"": 500,""query"": """ & query & """ " & fields & "}",  
    
[/code]

上記にある **query** の部分に、APIに対するクエリを格納しています。  
例えば

[code]

    日付  >= LAST_MONTH() 
    
[/code]

といったダブルクオーテーションを使わない内容は問題なく動作します。  
一方で

[code]

    作成年月日 >= "2023-05-01"
    
[/code]

とダブルクオーテーションを利用すると  
不正なjson文字列です、とエラーが発生します。

[code]

    作成年月日 >= ""2023-05-01""
    作成年月日 >= \\"2023-05-01\\"
    作成年月日 >= \\""2023-05-01\\""
    
[/code]

など思いつくものを試していますが、動作しませんでした。

もし原因がわかるかたいましたらよろしくお願いします。


CC BY-SA 4.0
2023-10-30T09:11:47.267
96622
2023-11-01T09:30:47.250
26236
question
excel
ダブルクオーテーションのエスケープ処理が原因によるエラー解決方法


`query = "作成年月日 >= \""2023-05-01\""",`のように、`\""`と書き換えることで解決しないでしょうか？  
※Kintoneは使っていないので一般的なJSONをPOSTする観点での回答です。

検証のため、下記のサンプルコードを実行してローカルサーバにPOSTされたBodyを確認してみました。

**サンプルコード**

[code]

    let
        //query = "日付  >= LAST_MONTH()",           // 1.OK
        //query = "作成年月日 >= \\"2023-05-01\\"",   // 2.NG
        //query = "作成年月日 >= ""2023-05-01""",     // 3.構文NG
        //query = "作成年月日 >= \\""2023-05-01\\""", // 4.構文NG
        query = "作成年月日 >= \""2023-05-01\""",     // 5.OK
        body = "{""query"":""" & query & """}",
        //以下、動作用のどうでもいいコード
        ソース = Csv.Document(Web.Contents("http://127.0.0.1:8080/", [Content=Text.ToBinary(body)]),[Delimiter=",", Columns=1, Encoding=932, QuoteStyle=QuoteStyle.None]),
        変更された型 = Table.TransformColumnTypes(ソース,{{"Column1", type text}})
    in
        変更された型
    
[/code]

`query`変数をコメント1から5まで書き換えてそれぞれ実行した結果、Bodyとしてサーバに渡された値などは下記のようになりました。

  1. `{"query":"日付 >= LAST_MONTH()"}`
  2. コンパイルエラー「Expression.SyntaxError: トークン ',' が必要です。」
  3. `{"query":"作成年月日 >= "2023-05-01""}`
  4. `{"query":"作成年月日 >= \\"2023-05-01\\""}`
  5. `{"query":"作成年月日 >= \"2023-05-01\""}`

2.は内部のダブルクォーテーションがエスケープできていないのでコード上でシンタックスエラーが発生します。  
3.と4.はBodyとして渡されたJSON内部のダブルクォーテーションがエスケープできていませんので、無効なJSONになります。  
1.と5.ならば、Bodyとして渡されたJSONは有効な構文です。


CC BY-SA 4.0
2023-11-01T06:09:49.063
96639
2023-11-01T06:09:49.063
9820
96622
answer


PowerQueryの[テキストリテラル](https://learn.microsoft.com/ja-jp/powerquery-m/m-spec-
lexical-structure#text-literals)での`"`のエスケープは`""`と重ねることです。つまり、`作成年月日 >=
"2023-05-01"` という文字列を作りたい場合は

[code]

    query = "作成年月日 >= ""2023-05-01"""
    
[/code]

と書きます。

次にJSON文字列の作成ですが、[`Json.FromValue`関数](https://learn.microsoft.com/ja-
jp/powerquery-m/json-
fromvalue)を使うべきです。JSON文字列ためにどうエスケープすべきかは`Json.FromValue`関数がいい感じに仕上げてくれるので、オブジェクト構造と値に注力できます。  
各変数には期待する値が格納されている前提で`{"app":app_id,"size":500,"query":query}`というディクショナリ形式のJSON文字列を作りたい場合はrecord型を使って

[code]

    requestBody = Json.FromValue([app = app_id, size = 500, query = query])
    
[/code]

と書けます。


CC BY-SA 4.0
2023-11-01T09:22:58.603
96643
2023-11-01T09:30:47.250
2023-11-01T09:30:47.250
4236
4236
96622
answer