Power Automate (旧 Microsoft Flow) で式を記述して実行した時、以下のようなエラーに遭遇することがある。
The template language expression '*' cannot be evaluated because property '*' doesn't exist, ...
特によく遭遇するのが、 HTTP トリガーでヘッダーを参照するときだ。
例えば、 Slack のイベント購読を HTTP トリガーで受ける時に、
triggerOutputs()['headers']['X-Slack-Retry-Reason']
のようにしてヘッダーの情報を参照しようとすると、 このヘッダが存在しない初回の実行時に上述のエラーが発生してしまう。
contains(triggerOutputs()['headers'], 'X-Slack-Retry-Reason')
のように、プロパティの有無のチェックの and 論理演算を加える方法 などが紹介されているが、実はもっと簡単な方法がある。
それは、 疑問符演算子 "?" を使うことだ。
(C# で言う Null 条件演算子 のようなもの)
これを使って、
triggerOutputs()['headers']?['X-Slack-Retry-Reason']
と記述すれば、
if(contains(triggerOutputs()['headers'], 'X-Slack-Retry-Reason'), triggerOutputs()['headers']['X-Slack-Retry-Reason'], null)
と等価になる。
各プロパティがオプショナルなものかどうかは、ヘルプを見ればある程度わかるものだが、メンバーアクセス演算子やインデクサー演算子を使う場合は、常に疑問符演算子を併せて使うのがよいのかもしれない。
Power Automate のドキュメント内の "条件付きの式を使用する" などのサンプルでも、常に疑問符演算子がつけられているので。
Power Automate のバックエンドは、 Azure Logic Apps となっているらしく、 式で使える 演算子 や 式関数 、そして 組み込みのトリガー などに関するリファレンスが、 Azure Logic Apps のドキュメントにしか存在しない。
また、 コネクタのリファレンス も、 Power Automate のドキュメントとは別になっている。
同じ情報が二重三重に書かれて内容に同期が取れないような状態になるよりはマシだが、欲しい情報が探しにくいのが辛いところだ。。。