PowerApps, Power Automate, SharePointで承認ワークフローシステムを構築してみた備忘録

#Office 365 のライセンス有効活用、承認者がシステムにログインすることなくOutlookメールのみで承認フローを流す
Office 365 Business Premium, E1, E3などのライセンスで既に運用をしている場合、PowerAppsと関連するPower AutomateやOffice 365内での連携は無償でできることも多い。しかしながらCDS(Common Data Service)やSQL ServerなどOffice 365とは関係のないシステムと連携する場合PowerAppsの有償ライセンスを別途購入、ユーザーに付与しなければならない。 PowerAppsでOffice 365内でできることとして一例になるがSharePointやExcelを「データベース」として使うことができる。
詳細は https://memo.tyoshida.me/power-platform/powerapps/unofficial-powerapps-flow-license-chart/

#今回のワークフロー
フォーム入力（PowerApps）→　
ビジネスオーナ－承認/拒否（メール）※今回のフローでは「1人」の承認者が「1人」承認したら次に進む　→
ITセキュリティ担当承認/拒否（メール）※今回のフローでは「1人」の承認者が「1人」承認したら次に進む 　→　
IT作業者へ通知、作業終了入力（メール）→　
関係者へ一斉完了通知（メール）

#作成手順の例
SharePointリストまたはExcel Onlineで入出力したいデータのカラムを定義
（今回はSharePointを利用）　→
PowerApps でSharePoint（またはExcel）と連携させフィールド表示させ並び替え、表示サイズの調整を行う→
Power Automateでフローの定義（変数が無ければAsk in PowerAppsを活用）→
Power Appsで「Ask in PowerApps」変数引き渡しを設定

#ユーザー申請のPowerApps画面例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/5c875004-2e67-c423-2631-e386f1fa3752.png)

#第一承認フロー時のステータスとメール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/02b0aeac-ccf7-2192-61e0-a8ea6cffb4e7.png)

#第二承認フロー時のステータスとメール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/a704a117-f122-4c4e-39cc-39639c476d36.png)

#作業者作業中のステータスと作業完了時に押下するメール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/6434e651-17c3-95d1-48e2-eb797bff297d.png)

#作業完了後に関係者に通知するメール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/1c80269c-6825-70ec-da28-969ec215c1f6.png)

#データ変更履歴
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/0a0c34c2-c8e1-5719-106b-59c313edf1c8.png)

#必要ライセンス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/e1dbf0c9-e70c-4397-819d-25b20b2a2fe1.png)

#PowerAppsへのアクセス方法
・ブラウザ（初回のみアプリへの直接URLでアクセス必要）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/4166c16a-1619-f1e9-0669-606dedb931a9.png)

・PCのMicrosoftストアアプリ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/e4fe6c5e-f2fa-bd50-02d3-d66759783b7c.png)

・スマホアプリ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/04d63df3-5951-f9d3-adfb-823e69a0b266.png)

初回のみSharePointへの書き込み、メール送信するアカウントに関するアカウント紐づけが必要。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/da59d7cd-786d-b319-7ed8-b6ef151960b0.png)

#SharePointのリストをデータベースとして定義した設定例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/97ba644e-3910-c943-5a50-9bb957ba21de.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/f1bc800d-21e6-a471-9991-662840cc1413.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/017a4597-4698-8638-3016-25943a519944.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/fb5da879-14d8-4100-820a-b07a70aca8af.png)

#PowerAppsやSharePointは共有必要（削除権限はく奪）、ワークフローは共有しなくても動く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/b898cecb-18bb-30b5-f2f9-06a0ce881537.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/84c4f4d3-eda3-9e1c-c5b6-0237a1d24ecf.png)

#Teamsで共有する場合、プリロードオプションが便利
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/61db1eb2-a617-191f-7dcd-5f8f43f3e679.png)

#PowerAppsボタンのコーディング例
"Form2"が今回のPowerAppsのフォーム名の場合。
※※※NULLの受け渡しはエラーになるようなので、空白を受け渡ししています。
・初期時に画面を新規入力にInitialize、ClearボタンやSubmitボタン（Power Automateに変数受け渡しの例）・・・SubmitのときはSubmit後に直前に記録した内容をPower Automateに受け渡し、受け渡し完了後に新規入力画面を呼び出すという形にしている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/a282278e-bb7c-3296-5afb-726e5ae67592.png)

#Power Automateフロー例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/8c769523-149a-a43f-13ac-ce8088b1799b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/4332ea25-54eb-be4a-c729-4fcce4a2682f.png)

SharePointのレコードが特定できる場合、Created by Emailなど記録されているレコードの内容をメールに埋め込むことが可能です。
PowerAppsで入力した内容に加えSharePointの内容もメールに入れ込む例です。

#Power AutomateでAsk in Powerappsを選び変数を作成後、PowerApps側からその変数に対して値を受け渡しします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/a96e54c2-7709-7f11-f04b-66dd1773bace.png)

#2020/5/13 追記
複数の添付ファイルをSharePoint List にアップロードし
承認メールに全て自動添付させたい場合、添付ファイルがあるリストアイテムIDを特定、
その後、ファイル格納するArrayを宣言し、ファイルIdentifierを全件取得させる。
その後、ArrayにNameとContentBytesを格納させるがContentBytesはbase64(ファイルコンテンツ変数名)の計算式を使わないと上手くファイルが認識できなかった。
最後に承認メールのAttachmentsにArrayを指定すればファイルが全件添付される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/037aee4e-5be8-9304-f3ee-dca06eaf3837.png)

#2020/5/18追記
SharePointで必須か否か、PowerApps側で必須か否かどちらでも制御ができ、SharePoint側で制御するとPowerApps側で自動反映されることがわかったが、汎用性をもたせるにはデータベース側のSharePointではなくアプリ側のPowerAppsで制御させたほうがよさそうなことがわかった。特にドロップダウン形式の場合の選択値をどうするかとかとかあるアプリでは必須だが別のアプリでは任意にしたいといった対応がアプリ側ならできるがデータベース側で実装してしまうと汎用性がなくなるため。また、SharePointではReadは自分のものだけ、Create/Editは自分のもの以外も可との制御ができるのでワークフローは回せるが申請内容を一覧表示させるというのは自分のものだけといった制御をすることで一定のセキュリティを担保することができることがわかった。

また、SharePointとの連携でAsk in Powerappsは最低1つSharePointリストレコードのIDで連携し、冒頭でSharePointのIDとレコードの紐づけをさせてしまえばPowerAppsから多数の変数の受け渡しを行うことなくSharePointの変数を活用できることもわかっている。（例でいうところSubmit for Approvalボタンで承認フローをキックする際に多数のLastSubmit変数を受け渡すことなくIDのみで何とかなりそう）SharePointのレコード確定を冒頭でしてしまい後続の処理はSharePointの変数を有効活用することがよさそうだ。


#今後の改修課題/条件
・SharePointリストは5000件を超えると誤作動を起こすようなので、大量のトランザクションはこなせず必要に応じて移動、パージする必要がある。
・SharePointをステータスによって変更禁止、読み取り専用にする
・自分で申請したフォームのみ閲覧可などのセキュリティコントロール
・既に回っている承認フローに対して代理承認を強制上書きしてできないか？
・差し戻し対応
・申請済ステータスチェックアプリ