[PowerAutomate]式の記法を理解する

はじめに

Power Automateでは、変数や前回からの出力結果を選択すると下図のようにラベルが設定される。(応答ID, Submission timeの部分)
これの内部がどうなっているの?を理解する。

関数の構成

ラベルをコピーしてテキストに張り付けると、どういった定義がされているか確認できる。
例えばSubmission timeであれば以下の通り。

@{outputs('応答の詳細を取得する')?['body/submitDate']}

関数の最小構成

@function_name(params)

関数の式埋め込み

@{function_name(params)}

関数と定数を混在させる場合、ココからココまで関数ですよということを認識できるように{}で囲う。

{}で囲わない場合、関数部分も文字列として扱われる。

(上がかっこあり、下がかっこなし)

アクションの出力参照(actions, outputs, body)

前のアクションの実行結果を参照できるのは、参照のための関数が用意されているからである。
参照する関数にはいくつか種類があるが、以下のコードは全て同じ結果になる。

//  actions
@{actions('<actionName>')['outputs/body']}

//  outputs: アクションの出力を参照 (actions()['outputs']の省略形)
@{outputs('<actionName>')['body']}
//  body : アクションの出力のbody要素を参照 (outputs()['body']の省略形)
body('<actionname>') 

// outputsと同値(非推奨)
actionOutputs('<actionName>')['body']
// bodyと同値(非推奨)
actionBody('<actionName>')

ただし、関数によってラベルの見た目が異なる。
マウス操作で「動的なコンテンツを追加」からラベルを追加した時に使用される関数は「outputs」であり、表示としても一番わかりやすい。

トリガーの出力を参照 (trigger, triggerOutputs, triggerBody)

トリガーの場合、専用の関数の用意がある。
actionNameの指定が不要なこと以外は、actionsoutputsbodyと同じである。

@{trigger()['outputs/body/resourceData/responseId']} 
@{triggerOutputs()['body/resourceData/responseId']}
@{triggerBody()['resourceData/responseId']}

ブラケット記法([])とドット記法 (.)

連想配列へアクセスをする方法は.を連携するドット記法と、[]で参照するブラケット記法がある。
これはPower Automate特有というよりはJSONとしての記法のルールである。

以下は全て同じ要素を参照するコードである。

@{trigger()['outputs/body/resourceData/responseId']}
@{trigger().outputs['body/resourceData/responseId']}
@{trigger().outputs.body['resourceData/responseId']}
@{trigger().outputs.body.resourceData['responseId']}
@{trigger().outputs.body.resourceData.responseId}

任意要素の参照 (?)

存在しない可能性のある要素へアクセスをする場合は直前に?を付けてあげる。

' ? あり → 要素が存在しない場合、エラーにならない
@{outputs('応答の詳細を取得する')?['body/notExistsElements']}

エラーにはならず、空白が返却される。

' ? なし → 要素が存在しない場合、エラーになる
@{outputs('応答の詳細を取得する')['body/notExistsElements']}

『body/notExistsElements』doesn’t exists. → そんな要素無いですよというメッセージが表示。