本日も小ネタで恐縮です。どういうわけかお祭りシーズンはPowerAutomateで連日トラブルシューティングしていることが多い気がします。
Problem
PowerAutomateでワークフローを構築・運用。
あるとき、SharePointコネクターの「SharePointにHTTP要求を送信します」アクションでエラーが発生。
エラーメッセージはだいたい以下のような内容:
無効な JSON です。スコープ 'Object' にはコンマ文字 ',' が必要です。配列内の 2 つ以上の要素およびオブジェクトの 2 つ以上のプロパティはコンマで区切る必要があります。
Solution
当該アクションの「ボディ」欄に入力されているJSONの内容をチェック。
"{@...}"
というかんじで先行するアクション(ステップ)のデータを埋め込んでいる箇所があったら、それらのデータに"
が混入する可能性を検討(エラー時の処理対象データでだいたいわかる)。
可能性ありの場合は{@replace(..., '"', '\"')}
と手動でエスケープ処理を実装。
PowerAutomateのアクションの入力欄でJSONを記述できるものはいくつもある。
それらの入力欄で、とくにJSONもしくは文字列のみを受け付けるものについては、上記のような自前でのエスケープ処理の実装は不要なよう。とくに"
のエスケープしなくても自動でコンテキストを理解してエスケープ処理をしてくれる。
一方、「SharePointにHTTP要求を送信します」アクションはJSON以外にも例えばXMLのようなものも入力データとして想定しているためか、自動的なエスケープ処理は期待できず、必要に応じて自前で入力データの構文仕様に応じたエスケープ処理を実装する必要がある。
ところで、replace(..., '"', '\"')
という関数式は、これがJavaScriptだとするとちょっと違和感。
そもそも関数かメソッドかという違いもありますが、JavaScriptの場合 '...'.replace('"', '\\"')
という引数になるはず。
仮に'...'.replace('"', '\"')
という書き方をしてしまうと\"
の部分がただの"
と同義と解釈されてしまい、実質的にまったくエスケープ処理がされません。
しかしここはあくまでもPowerAutomateの式関数。エスケープ処理はreplace(..., '"', '\"')
という引数の指定になります。
データのやり取りにJSONが採用されていたり、Office ScriptsはTypeScriptのサブセットだったりと、周囲にJavaScript系のモノがあるからといって、式関数まで同類にしてはいけないということです。