2024.03.24 さっそく改善!
はじめに
Power Automateには承認機能が存在します。
Teams
とOutlook
で申請に対する承認・否認、コメントの付与ができ、簡単なワークフローの構築が実現できます。
Udemy
やKindle
、Web
上にも承認ワークフローの例が豊富に出てくるので、実装までの道のりはそう遠くないです。
■ Udemyおすすめ
■ Kindleおすすめ
Microsoft learnにも例があるので、ステップバイステップで本格的なワークフローの構築も目指せます。
動的な承認段階への対応
ワークフローを作成する中で、 承認段階が固定的ではないと対応が難しい、この点に課題感を感じていました。
多段階への対応を実装するにも、非常にPower Automateフローが冗長になる傾向を感じています。
実際の業務を想定すると、ワークフローを要するシーンは多く、承認の段階・対象者も、かなり動的な属性を持ちます。
そこで今回は、Power Apps
・Power Automate
による承認ワークフローを作成する中で、動的な承認段階に対応するワークフローの作成にトライしてみました。
構造
今回は単一のファイルを添付して、指定の対象者に承認を要求するワークフローの実現を目指しました。
- Power Appsで
タイトル
、詳細
とファイルを添付
、ギャラリー コントロール
を利用し、承認を要求する対象者を指定する画面を作成- ギャラリー コントロールで承認を要求する人を必要な人数分、自由に設定できるようにする
- Power Appsで承認を要求する人達をJSON関数で、オブジェクトを格納した配列にし、
Power Automate
に渡す - Power Automateで
JSONの解析
アクションを用いて、文字列を配列として評価しなおす -
Do until
と同じ要領でFor each
を実現する- 繰り返し処理を継続し続けることを判定するためのBoolean変数を用意する
-
Boolean
がTrue
の間は承認アクションを繰り返す、一度でもfalse
になった場合は、以後は処理を実行しない - 承認履歴は
項目を作成する
アクションでSharePoint Lists
に蓄積する
今回作成する仕組みの中で、承認を要求する人数が複数人にわたる要件には沿っていません。
エラー対応も含めていないため、参考程度に見ていただければ幸いです。
SharePoint Lists
SharePoint Lists
は二つ設けました。
- 申請別の結果・詳細・添付ファイルを取りまとめるリスト
- 承認結果を承認担当者別に全て記録するリスト
■ 申請別の結果・詳細・添付ファイルを取りまとめるリスト
こちらは主にPower Apps
のSubmitForm関数で申請を記録し、Power Automate
で承認結果に応じて、列を更新していくリストになります。
列 | 種類 | 備考 |
---|---|---|
ワークフローID | 1 行テキスト | 申請用のユニーク値 |
タイトル | 1 行テキスト | 申請タイトルとして使用 |
詳細 | 複数行テキスト | 申請の詳細用に使用 |
申請者 | ユーザーまたはグループ | 申請者を登録 - 登録者列とイコール |
申請日時 | 日付と時刻 | - 登録日時列とイコール |
現担当者 | ユーザーまたはグループ | 承認要求を判断している現担当者 |
承認担当者 | ユーザーまたはグループ | 承認要求を依頼される予定の人全て |
ステータス | 選択肢 |
対応中 ・終了
|
結果 | 選択肢 |
未対応 ・承認 ・否認 ・対応待ち
|
■ 承認結果を承認担当者別に全て記録するリスト
承認結果を判断した履歴を蓄積するリストです。
前述のリストとワークフローID
で同じ値を保ちます。
列 | 種類 | 備考 |
---|---|---|
ステップ | 数値 | 何番目の承認段階か数値で表現 |
タイトル | 1 行テキスト | 申請タイトルとして同じ値 |
ワークフローID | 1 行テキスト | 申請用のユニーク値 |
コメント | 複数行テキスト | 承認者のコメントの記録 |
結果 | 選択肢 | 承認担当者の結果を記録 |
一次承認
、最終承認
のような書き方は一旦無視しています。
どこかで置き換えをするなりで、実運用の場合は対応が必要です。
Power Apps - 承認の要求画面
承認を要求する画面のみ作成しています。
コントロール
■ Workflow(画面の名前)
- ScreenContainer
- HeaderContainer - ヘッダー
-
- Header - ヘッダーコントロール
-
- BottomContainer - ボディ
- SidebarContainer
- formTitle
- Form - フォーム
- MainContainer
- rootTitle
- galRoot - 承認要求を出す対象者
Items: colStep
- icoPlus - 承認要求を出す人を増やすためのアイコン
-Image: If(!IsBlank(cmbPerson.Selected),Office365ユーザー.UserPhotoV2(cmbPerson.Selected.Email),SampleImage)
- badgeIndex - 何段階目の承認か示すバッジ
- cmbPerson - 承認担当の選択
- imgPerson - 承認担当の顔写真
- shpBorder - 罫線 - conFooter - フッター
- btnSubmit - 申請実行ボタン
- SidebarContainer
- HeaderContainer - ヘッダー
承認要求を設定するギャラリー コントロール
には、数値のみのコレクションを設定しています。
初期化は画面のOnVisible
で実行
ClearCollect(colStep,{Step:1});
フォーム
画像のとおりですが、非表示で一意の値を制御するワークフローID
用のカードコントロールを配置しています。
Default
に下記の関数を設定します。
以前
```plaintext:Default "WF-" & Text(Last(フォームのデータソース).ID + 1,"0000") ```SharePoint Listsの内部のID
列を使ってユニーク値を保ちます。Update
はSelf.Default
。
上記をやめ、SubmitForm関数を実行時に工夫する方法へ変えました
SubmitForm関数 + Power Automate実行
アップデート!
Form.LastSubmit.ID
の活用を採用しています!
LastSubmit – 任意のサーバーが生成したフィールドを含む、最後に正常に送信されたレコード。
このプロパティは 編集フォーム コントロールのみに適用されます。
一意の番号を持つ ID フィールドなどの、データ ソースが任意のフィールドを自動的に生成または計算する場合、SubmitForm が正常に実行された後、LastSubmit プロパティにはこの新しい値があるようになります。
このプロパティの値は OnSuccess 式で利用できます。
btnSubmit
のOnSelect
プロパティに下記の関数を設定します。
// 1. 申請用のコレクションのクリア
Clear(colWorkflow);
// 2. フォームの値を先に取得
UpdateContext(
{
Title: valueTitle.Value,
Details:valueDetails.Value
}
);
// 3. ギャラリーコントロールの値を申請用のコレクションに格納
ForAll(galRoot.AllItems,
Collect(colWorkflow,
{
Step:Value(badgeIndex.Content),
Claims:cmbPerson.Selected.Email,
Name:cmbPerson.Selected.DisplayName
}
);
);
// 4. フォームをSubmit
SubmitForm(Form);
// 5. Power Automateの実行
DynamicWorkflow.Run(
JSON(colWorkflow),
Title,
Details,
Form.LastSubmit.ID,
"WF-" & Text(Form.LastSubmit.ID,"0000")
);
// 6. 通知
Notify("承認ワークフローを実行しました。",NotificationType.Information);
// 7. リセット
NewForm(Form);ClearCollect(colStep,{Step:1});
JSON関数によってテーブルをJSONに変換し、配列をPower Automateに(文字列で)渡すことができます。
複数回の実験結果ですが、
- SubmitForm関数
- Power Automate実行
上記で処理の順序は保たれるので、ワークフローID
を使い、SubmitForm関数で登録したSharePoint Listsの項目を後程取得します。
Form.LastSubmit.ID
を活用し、SubmitForm関数で追加された値を正確に取得するための工夫を追加しました。
Twitterのアドバイスに感謝!
承認画面イメージ
余談になりますが、承認画面は
- Teams
- Outlook
- Power Automate(モバイル)
といった複数の画面で承認が実行されます。
結果も同期されることが素晴らしいです。
添付ファイルがダントツで見やすいです。通知が若干遅い。
■ Power Automateモバイル
めくら判に最適です
Power Automate
1. 変数の初期化など
Power Appsから受け取る値を増やしました
2024.03.24
-
bool
は後ほど登場するFor each
用の処理判定
- 添付ファイルをまとめて追加できるように空配列を準備
JSON の解析
は、文字列として受け取ったJSONを再評価します。これにより配列としてPower Appsから受け取った値を取得できます
{
"type": "array",
"items": {
"type": "object",
"properties": {
"Claims": {
"type": "string"
},
"Name": {
"type": "string"
},
"Step": {
"type": "integer"
}
},
"required": [
"Claims",
"Name",
"Step"
]
}
}
手軽に配列を取得できる手段として重宝します。
-
選択
は項目の更新
アクションで複数人の選択した承認担当者を設定するために実行しているアクションです
2. SubmitForm関数で登録された値の取得、進捗状況の更新
- Teamsで表示する承認の履歴を確認するためのMarkdownを設定します
## 詳細
@{triggerBody()['text_2']}
## 承認状態
|承認No.|担当者|結果|コメント
|---|---|---|---
- 項目の更新で
ステータスの更新
と承認担当者の更新
をします- 申請者、申請日時は登録日時を書き写しているたいして意味のない行為です
- 添付ファイル コンテンツを取得し、承認の添付用に値を取得します
-
Apply to each
で配列変数に添付ファイルを格納します- これにより複数ファイルの添付に対応できます
{
"name": @{items('Apply_to_each')?['DisplayName']},
"content": @{body('添付ファイルのコンテンツの取得')}
}
3. 【ここから繰り返し処理】
-
bool
がtrue
の間だけ繰り返します。はいの場合
のみに処理が格納されます -
項目の更新
で承認担当者
とステータス
を現在の値に設定します
4. 承認ログの記録、承認を待機
-
■ 承認結果を承認担当者別に全て記録するリスト
に担当者と承認段階の数値を設定します
- 承認を作成して承認に移ります
下記に対応しました✨
選択
で上のアレイを作成して、設定したほうが早そうですね👆
5. 承認結果の反映
- 担当者別に結果をログに反映します
否認
の場合、bool
をfalse
に設定し、繰り返し処理から実質的に抜け出します
For each
で繰り返しを行っていることから、無限ループに陥らないところがミソです
|@{items('For_each')['Step']}|@{items('For_each')['Name']}|@{body('開始して承認を待機')?['outcome']}|@{body('開始して承認を待機')['responses'][0]?['comments']}
回答者が単一である場合を想定した設定です。複数人に求める場合、コメントの値を結合するなど処理が別途必要になります。
6. 最終結果の反映
■ 申請別の結果・詳細・添付ファイルを取りまとめるリスト
に結果を記録します。
おわりに
ワークフローは奥が深い領域です。
しかしながらMicrosoft 365
のライセンスの範囲内で、このような機能が作れることは本当に魅力的です!
本当にPower Apps/Power Automate Love!
制限事項には目を通してご利用ください!