コルネの進捗や備忘録が記されたなにか

進捗や成果物や備忘録てきななにかを雑に更新していきます。

Power Automateの連続した承認で承認履歴を取得する


スポンサードリンク

はじめに

Power Automateの承認アクションで「連続した承認」という多段階承認オプションが追加されました。

こちらの使い方に関しては以下ブログをご覧ください。

koruneko.hatenablog.com

さて、こちらの連続した承認ですが1つのアクションで多段階承認が完結できるメリットがある反面、承認状況を都度SharePoint ListやDataverseなどのデータソースに書きだして承認statusやコメントを確認する術がありません。

今回は多段階承認で承認処理中の承認の承認状況を取得/参照する方法をまとめます。

承認処理を取得する

そもそも承認データはどこにあるのか

Power Automateで承認アクションを実行すると、「Flow 承認」(msdyn_flow_flowapproval)と「承認」(msdyn_flow_approval)テーブルにそれぞれレコードが作成されます。

そして各ステップでの承認結果は「承認応答」(msdyn_flow_approvalresponse)に作成されます。

これらのデータを参照することで対象の承認の承認状況を確認することができます。
今回確認対象となるのは、

  • Flow 承認
  • 承認応答

の2点です。

「Flow 承認」では、対象の承認の承認状態と「承認応答」で対象の承認を特定するための情報が格納されています。
「承認応答」では、各ステップでの承認状況とコメントを取得することができます。

承認者だれ?という状況はざっと見た限り見つけられませんでした、、、
どこに入ってるんだ?

=====2024/10/29 追記=====
ゆりみーさんに承認者の取得方法を教えていただきました。
承認者は「承認応答」テーブルの「所有者」列に含まれています。

完全に見逃していた。。。

承認応答を特定するための仕組みづくり

どのフローで実行されたのか特定する

まず特定できるようにしないといけないのは、対象のフローのどの実行で実行された承認なのか?
ですね。

厳密にいうとまず取得したいのはどのフローで実行された承認アクションを追いたいのか?ですが、これはフロー作成時に取得可能なので置いておきます。

対して、対象のフローのどの実行で実行された承認なのか?はフローを実行するまでわかりません。
従って、これを取得するためのアクションを組み込みます。

対象のフローのどの実行で実行された承認なのか?は実行IDなどで特定できます。
これは workflow 関数で取得できます。

@{workflow()?['run']?['name']}

workflow 関数についてはこちらをご確認ください。

learn.microsoft.com

こちらをDataverseなどのデータソースに格納します。
* 承認状況の参照先がDataverseなので今回はDataverseを利用する想定で作成します。

こちらは「Flow 承認」の「フロー実行順序 ID」(msdyn_flow_flowapproval_flowrunsequenceid)と一致させることができます。

このアクションの後(直後でなくともOK)で承認アクションを実行します。

「承認応答」を特定するための一意識別子の取得

「承認応答」テーブルにはフロー実行時で得られる情報だけではレコードを特定できるような情報は入っていません。

従って、「応答承認」テーブルでどのレコードが今回みたい承認履歴なのかを判断するためにもう一工夫必要というわけです。

「応答承認」テーブルで承認を特定するには「Flow 承認」のレコードIDが必要です。
これを取得しましょう。

「Flow 承認」のレコードIDを取得したいので、トリガーは「Flow 承認」でレコードが作成されたときになりますね。

こちらは特定のフローが実行されたときだけの実行でよいので、トリガー条件を設定しておきましょう。

@equals(triggerOutputs()?['body/msdyn_flow_flowapproval_flowname'], '<flow name>')

こちらに設定する は以下アクションを対象のフローで実行することで取得可能です。

@{workflow()?['name']}

続いて「Flow 承認」のレコードIDを追記するレコードを特定します。

先ほど @{workflow()?['run']?['name']} を新規作成したレコードが更新対象となりますね。
特定のためにODataクエリを記載します。

new_flowid eq '@{triggerOutputs()?['body/msdyn_flow_flowapproval_flowrunsequenceid']}'

"new_flowid" の箇所は各自の作成したフィールド名に置き換えてください。

最後に対象の行を更新して「Flow 承認」のレコードIDを設定します。

行ID

@{outputs('行を一覧にする')?['body/value']?[0]?['new_approvehistoryid']}

設定するレコードID

@{triggerOutputs()?['body/msdyn_flow_flowapprovalid']}

これでフローの履歴を取得する準備ができました。
あとはPower AppsやPower Automateで「承認応答」テーブルから情報を引っ張ってくるだけですね。

ちなみにここまでわかっていれば、「承認ステップ」や「承認依頼」テーブルからも情報を取得できるようになっています。

Power Appsで承認状況を表示してみる

超簡単ですが、こんな感じでPower Appsで承認履歴を取得してみます。

まずどの承認を対象にしたいのか特定するためのギャラリーなどを用意します。
こちらに設定するのは自身で作成したテーブルですね。

承認の終了有無は以下式で取得可能です。

LookUp('Flow 承認', 'フロー実行順序 ID' = Gallery1.Selected.flowId, ステータス)

対象の承認応答はこちらの式で取得可能です。
承認のステップ順で並び替えたいので、「ステップ番号」(msdyn_flow_approvalresponse_stepnumber)でソートしています。

SortByColumns(Filter(承認応答, '承認 ID インデックス' = Gallery1.Selected.ApprovalKey), "msdyn_flow_approvalresponse_stepnumber")

これでアプリから多段階承認の情報を取得できます。
また、この方法を使えば多段階承認だけでなく通常の承認でもいちいちデータを保持せずとも参照できますね。(管理者目線でいうとデータ容量の節約になります。結構大事)

1つ検証が必要な点としては、これらのテーブルにはデータは何日間保存されるのかですね。
有識者いたら教えてくださいーーーー
Teamsの承認アプリでは承認履歴結構長い間みれるはずなので多分気にしなくていいんじゃないかな?と思いますが(そうなるとデータ容量的には気にしてかないとですね)

もし保持期間が許容できない期間であった場合はPower Automateで転記することになることになるかと思います。
その場合は「承認応答」でレコードが作成されたときをトリガーにしてフロー組んであげる必要がありますね。

おわりに

参考までに今回利用したDataverseのリファレンスも置いておきます。

learn.microsoft.com

learn.microsoft.com


スポンサードリンク