SharePointとAutomateで承認フローを作成するときの権限設定

#概要
SharePointリストとPower Automateで簡易承認ワークフローを作成するときの
SharePointの権限設定パターンの覚え書き。

#承認フローの概要
今回解説するパターン

- 申請内容はSharePointリストに登録。
- 入力項目は件名、申請日、承認ルート、Excel添付ファイルとする。
- 申請者は事前に用意された承認者マスターから承認者を選択する。
- 承認者は、承認依頼からSharePointアイテムへのリンクを開き、SharePoint上で内容確認する。
- その他、Automateの実行は、SharePointのアイテム選択→自動化から実行するインスタントフローとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/e244cb67-219c-9318-bbfe-8a1d3409a187.png)

# 準備編

##SharePointの準備

###①承認者マスター
承認者をマスタから選択できるようにするためこちらを先に作成します。
承認者リスト列はユーザー型で複数のユーザーを設定できるようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/8993ed3e-43bd-899e-452f-2731e6a5bd47.png)

###②申請管理リストの作成
以下のような列を用意します。
承認ルートは参照型で、①のマスターを参照します。
設定はこちらの記事と同じです。→[承認者マスターを使ったSharePoint承認ワークフロー](https://qiita.com/Rambosan/items/b751c048645befb8dd33#%E6%A7%8B%E6%88%90)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/002b0ef2-7eb6-04d4-8296-1166e180176d.png)

申請者名列の作成は任意です。
文書を改訂して申請するような要件の場合、承認すると更新者列が上書きされ誰が申請したかわからなくなるため、
Power Automateから申請者名を記録しておくために使用します。
新規登録しかしない申請なら登録者名の列で代用できます。

###承認機能の有効化
申請管理リストについて、バージョン設定から承認機能を有効にしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/62d1dd03-8263-47c7-1ee6-69aabd5346bd.png)
また、ビューの設定から承認状態、承認者のコメント列を表示しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/8cc4f7ba-083e-949a-76c3-247d856b32bc.png)

## Power Automateの準備

### フローの作成
以下のようにスタンダードな承認フローを作成します。
承認者のアドレスリスト生成や承認状態の設定など、フローの細かい内容についてはこちらの記事を参考にしてください。→[承認者マスターを使ったSharePoint承認ワークフロー](https://qiita.com/Rambosan/items/b751c048645befb8dd33)
今回はSharePointリストから起動するインスタントフローです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/3b97a486-77b5-5d6e-01f9-c449b28f34e2.png)

「承認を開始して待機」アクションではアイテムへのリンクを設定しておき
承認者がSharePointのアイテムを開いて内容確認できるようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/f834cc0d-8353-b73e-6442-cd7f72ed5cae.png)

承認結果の判定と承認状態設定は以下のようなフローです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/05db9fd1-f6a2-4a4a-cfa7-c6f479f05129.png)



### 接続情報の設定
インスタントフローの場合は既定で利用者の接続情報を使用して各アクションの処理を行います。
フローの内容によっては、以下のように接続情報をフロー所有者のものに変更する必要があります。

Power AutomateからSharePointのアイテムを承認するには、「コンテンツの承認状態を設定する」アクションにより明示的に承認しますが、これはSharePoint側の機能です。
承認を実行するには、フローの接続ユーザーにSharePointの「アイテムの承認」アクセス権が必要です。(後ほど解説)

そこで、SharePointの接続情報を承認権限又はフルコントロール権限を持っているフローの所有者にします。
フロー詳細画面にある以下の編集を開き、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/8981a249-c003-09f0-da42-b85bfa1aea47.png)

SharePointの接続をこの接続(所有者)に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/67f19365-4845-c37a-fe0f-1b01cb191bf3.png)


#SharePointの権限設定パターン
##パターン1 ユーザーにSharePoint承認権限を付与するパターン

下書きの表示は既定の「アイテムの作成者およびアイテムを承認できるユーザー」とするパターンです。
承認待ちアイテムは、申請者本人かSharePointの承認権限がある人しか見えません。
申請内容を確認する人に承認権限を設定しておく必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/c1147aea-8354-e05a-b7d9-5e67678f4919.png)

###ポイント

- 投稿者には投稿者(削除制限)権限をつける。
- 承認者には承認者(投稿者+承認)権限をつける。
- 承認権限をつけることで標準機能による一括承認も実行可能にする。


###SharePointリストの設定
リストの設定→このリストに対する権限から設定できるアクセス権の設定を行います。
※リスト固有の権限にするかサイトの権限ごと触るかはお好みで。

権限設定に関してはこちらの高田弘介さんの動画が圧倒的に分かりやすいです。
https://www.youtube.com/watch?v=ZxGzFHeTk1Y&t=2195s


アクセス権設定の完成系は以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/b02a3199-811e-789e-faaa-af649e37f171.png)

**アクセス許可レベルの作成**
まずは独自のアクセス許可レベルを作成します。
アクセス許可とは、投稿者：「投稿はできるけど削除はできない」、承認者：「投稿に加えて承認ができる」といったようにアクセス許可の組み合わせを定義するものです。

サイト設定→サイトの権限画面を開き、アクセス許可レベルをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/999d7e65-0a05-792a-1112-52c71024aca0.png)

デフォルトで以下のような権限が表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/7786400a-4851-0e9b-0172-9ac0b0d2d465.png)


**投稿(削除禁止)権限を作成**
投稿権限をもとに作成したいので、「投稿」をクリックしてアクセス許可レベルをコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/4706ae71-c735-4642-61a0-c7363c74c5a9.png)

削除権限を外し「投稿(削除禁止)」と名前を付けて「作成」で保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/b4cd179b-f08b-3762-1a76-db8ed5e7d7c7.png)

**承認者権限を作成**
更に、先ほどの投稿(削除禁止)権限をコピーして、承認者権限をつけて名前を付けて保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/f7b51a90-6356-4b8a-6241-0cc4ab180422.png)

**グループとアクセス許可を設定**
SharePointグループを編集しグループのメンバーとアクセス許可を割り当てます(適当)
グループの作成は「グループの作成」ボタンから。サイトのアクセス権の画面から設定する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/7ebec49b-7576-243a-c994-b09af4350403.png)

グループの呼び出しとアクセス権付与は「アクセス許可の付与」ボタンから設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/991ccd9d-aaa8-6a9a-1529-fb9b4ff6de95.png)

最終的に以下のようになります。
メンバー：申請するメンバーを設定、投稿(削除制限)権限を設定
承認者：承認者となるメンバーを設定、承認者権限を設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/b02a3199-811e-789e-faaa-af649e37f171.png)
特定のSharePointリストだけに設定する場合は、固有の権限の設定を行い、アクセス権の継承を停止します。

その他、Power Automateフローの所有者となる人はSharePointリストの所有者となるよう設定されていることも確認します。
Teamsから作成されたSharePointの場合はチームの所有者にすればOKです。


###動作
- 申請者がフローを実行すると、承認者に承認依頼が届きSharePointのアイテムを開いて内容を確認します。
- 下書きアイテムは承認者しか閲覧できない設定ですが、承認者権限を設定しましたので閲覧することが可能です。<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/7e852d96-e2bf-8dc4-62c5-c622767f53f6.png)

その他、両パターン同じですが
フローからの承認処理は所有者の情報を利用しますので、アイテムの更新者は所有者の名前になります。

###メリット
・SharePoint標準の承認機能も使えるので手動で一括承認なども実行できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/de8da922-e0a6-26e1-94d4-8e323e7b04c7.png)
・下書きアイテムは一般の投稿者に見えないようにできる。

###デメリット
・承認権限があれば手動で誰でも承認できてしまう。
・アクセス権を付与するユーザーの管理が面倒。

権限の設定が面倒ですね。
TeamsのSharePointでやるような部内/小規模なものであれば、
承認者をチームの所有者に設定、申請者はチームのメンバーにしてしまう運用が楽ですね。
※チームの所有者はサイトコレクション管理者となります。
<br>

##パターン2 承認者のアクセス権設定を使用しない場合
先ほどのように面倒なSharePointのアクセス権を使用しない方法です。

**ポイント**

- 承認権限は所有者のみ。Power Automateは所有者権限で承認設定する。
- 業務上の承認者にはSharePointの承認権限を持たせない。
- 代わりに下書きアイテムを全員が表示できるよう設定。

###SharePointの設定

①バージョン設定で、アイテムを編集できるユーザーに表示できるようにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/bb03e8e8-ea48-febc-0a76-39507d2f7f2c.png)
承認者にはSharePoint承認権限を付与しませんが、このように設定することで誰でも下書きアイテム(承認待ち)を表示できます。
ただし、承認待ちアイテムは他人から編集ができてしまいます。

②詳細設定で、ユーザー本人のアイテムのみ編集できるようにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/33c40c2e-01ec-8933-2a97-a6be1d17940b.png)
これで承認待ちアイテムは本人以外編集できないようになります。

その他、Power Automateフローの所有者となる人はSharePointリストの所有者となるよう設定されていることも確認します。
リストの所有者はフルコントロール権限となり「承認」権限の他、「リストの動作を無視」といった権限により閲覧・編集の制限を無視できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/d6fa7fba-eb4b-4b17-5908-9b784ec7a123.png)


###動作
申請者がフローを実行すると承認者に承認依頼が届き、SharePointのアイテムを開いて内容を確認します。
下書きアイテムは編集権限以上の人が表示できるので、承認権限のない業務上の承認者もアイテムを閲覧できます。
Power Automateから「コンテンツの承認状態を設定する」

###メリット
・難しい権限設定をしなくてもよい。
・標準の承認機能が使えないので、承認者グループで指定された人しか承認できない。

###デメリット
・アイテムの作成者しか編集できないので、既存のアイテムを編集して再申請するようなフローには使えない。
→新規アイテムで申請して終わりのフローなら問題なく、文書管理などの改訂を伴う申請フローには向きません。
・SharePoint標準の一括承認が使えない


#おまけ
Power Automateで承認を作成するアクションを使用すると、承認者に対してメールの他Teamsの承認アプリでも通知が飛びます。
同様に承認アプリでは、申請者側も「送信済み」として申請記録が残ります。

送信済みタブを見ると自分が申請した内容と、申請状況が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/4ef7931b-304c-f1ae-3373-34db8c93f556.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/a61c064c-4236-4365-182f-91c039b49a0a.png)

ここに「リクエストキャンセル」と「フォローアップ」というボタンがあります。
それぞれ動作が以下のようになります。

**フォローアップ**
クリックすると承認者のTeamsにトースト通知でフォローアップを送ります。
ボタンが一旦グレーアウトしますが、送信が終わると何度でもクリックできるようです。
承認の遅い上司に押しまくりましょうｗ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/7e200cc8-b138-4261-caef-e8354a7a7408.png)
Power Automateからこのフォローアップを実行できれば悪いことができそうですｗ

**リクエストをキャンセル**
承認依頼をキャンセルします。
承認者のTeamsには「〇〇が要求をキャンセルしました」という通知が流れます。
Power Automateでは承認を待機アクションを通過します。
テストするとわかるのですがoutcome＝結果や、responses＝回答数（笑）が空白となっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/512f6ba6-bbee-d995-de2a-4aaaf2c998a5.png)
フロー内でキャンセルされたか判定するには、条件アクションでempty()関数を使って空判定する必要があります。

参考ですが、承認アクションの要求元は既定では接続情報のユーザーとなります。
インスタントフローでは実行者の接続情報を設定できますが、クラウドフローの場合は所有者の接続情報しか使用できず、承認の依頼元がフローの所有者となってしまいます。
対応方法としては、詳細オプションにある「要求元」にメールアドレスを設定すると、承認の要求者をその人に設定することが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293667/abf5cde8-3952-271f-a385-c9d345d74da6.png)

#あとがき
SharePointの権限設定はあくまで一例です。要件によって他の運用パターンもあるかと思います。
できる限りメンテナンスが単純になるパターンで管理したいですね。

SharePointを使った承認フローの作成方法を教える機会があり、詳しくはこれを見てね、という記事が欲しくてまとめてみました。

'22/2
フローの接続ユーザーの設定に誤りがあり、パターン1が動作しない問題があったものを修正。