承認申請用のリストのアイテムにアクセス権を付与する

[Microsoft 365の活用ネタのまとめに戻る](https://qiita.com/Keiji_otsubo/items/5ddec87d5f1fd4e9f4af)

個人情報が含まれていることもあるので、申請者/承認者と管理部門だけは編集権限を与えたい。また承認されたら変更されないように閲覧権限だけにしたい。

探してみると「アイテムまたはファイルの共有を停止します/アイテムまたはフォルダーへのアクセスを許可する」というアクションが使えそうだ。


+ [Power Automate フローを使用してリスト アイテムとファイルのアクセス許可を管理する](https://learn.microsoft.com/ja-jp/sharepoint/dev/business-apps/power-automate/guidance/manage-list-item-file-permissions)


Power Automate の SharePoint コネクタでは、リスト内の個々のリスト アイテムまたはドキュメント ライブラリ内のファイルのアクセス許可を管理するための次のアクションが提供されます。

+ アイテムまたはフォルダーへのアクセスを許可
+ ファイルまたはフォルダーの共有リンクを作成
+ アイテムの共有を停止

上記のすべてのアクションを使用すると、アイテムまたはファイルのアクセス許可をカスタマイズして、適切なユーザーがそのアイテムまたはファイルにアクセスできるようにします。 アクセス権を付与するか、共有を停止するには、そのリストまたはライブラリのリスト所有者である必要があります。 **つまり、これらのアクションのフローでは、リスト所有者ユーザー アカウントを使用してリストまたはライブラリに接続する必要があります。**

太字のところが気になる。まぁ、正直なところ今は具体的な設定がよく分からん。

+ [Power Automate で SharePoint リスト アイテムに対して個別のアクセス権を付与する方法](https://jpspsupport.github.io/blog/sharepoint-online/power-automate-assign-permission/)

気になることが... キャパシティ プランってどうするんだろう？

:::note
なお、前提として SharePoint の制限 には、リストまたはライブラリ内のアイテムに対する固有の権限は 5,000 までと指定されております。そのため、固有のアクセス権を割り当てる運用を実施する場合、リストまたはライブラリ内のアイテムが 5,000 を超えないようキャパシティ プランをお願いします。
:::

# 試しに作って確認してみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7276403e-dd63-0bdf-199d-63b81eb61ec2.png)

共有の停止は分かったけど、権限の付与は分からんパラメータがある。

受信者って！！
共有の招待を受信する受取人のコレクション　は何よ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/67075131-dd6d-e5d4-3565-0d9ca5db3d97.png)


共有対象のメールアドレスを指定します。

メールアドレスが複数ある場合は、一つずつメールアドレスを指定するか、";"で繋げます。

https://blog-tips.sekenkodqx.jp/2023/12/08/power-automate-action-access-to-an-item-folder-sharepoint/

しかし、どうやって変数を作るのかな？

今回は部門の上長と本人には権限を付与したい。でも、メールアドレスの直打ちなんて本人はいいけど、上長が異動になった時にこの部分はすべて更新し直しか？　本当に使いにくい。

以下を見ると , で区切っているけど　配列とコレクションは違う？

[【PowerAutomate】配列を作る方法](https://qiita.com/suzu_qiita/items/008614f5a4ed8920aad5)


サイトの設定がない

こっちにはある

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/03177ced-40f4-572c-48b9-47cfb82fa42f.png)

このサイトの所有者だけど、サイトの設定がサイトの情報に変わっている。何でだろう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/91162426-b1a5-d157-102e-4278d71fd91e.png)



何故か、サイトの情報の下の方にリンクがある？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/fe70f587-38f7-8c23-aa62-8bafcd51cb81.png)

しかし、ユーザとグループの設定はない。嫌になる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/40c749f2-7e77-00dc-66fd-e629800057a7.png)

サイトのアクセス許可をクリックすると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/97b3e953-1534-6286-3b53-36539aec2334.png)

高度なアクセス許可の設定か？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e8f0bf02-8aee-56b4-7246-d64ee3de19df.png)


これか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/733c3ef0-0961-a756-a366-acaf8a7e7c5e.png)

# 最終的なフロー

エラーにはならないのですが、私はこのSandboxサイトの所有者なので閲覧だけにしても変わらないですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ea22066b-3ca2-df25-50f0-31badd5008e2.png)

同じ権限いなっている。？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f12d1142-f733-02a1-d5ce-8b242f368244.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/58534e27-a476-581f-7d20-b1d925c8c72a.png)

あれぇ、もう一つグループを追加したハズだけど...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/41592e5e-1daf-79f0-d1a4-622b31c2c25d.png)

手動で追加したら表示されたということは、アクションからは設定できなかったということかな？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/00ed267d-f806-c910-15ad-992bbb66efb7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e291696c-69ae-485f-9740-abbc19d1a830.png)


受信者にグループのアドレスを入れているけどエラーになる。上記のように001Editをハンドで追加した後にこの設定を走らせるとエラー。ということは権限の削除だけしたことになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/37a5c79e-623d-ac81-1885-462a651983e4.png)

エラーになって権限を追加できていないから、グループが２つに減ったみたい。ああああ、何を指定するんだろう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/68db2d2d-d038-e2ac-c8b5-bdea9f6d7559.png)


null だからかな？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e43b54e4-a4f6-1013-86c7-29cd3317fe08.png)

400error だな。意味が分からん。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ea639dd2-c2d1-7937-d4b8-3ed877fab4cb.png)


私のメールアドレスを設定すると、成功した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4e16b413-c44a-c28c-e6c9-a537b5db41fa.png)




私自身はこのサイトの所有者なのでグループは増えないのかな？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/397d537c-0b77-f905-d1c7-be5466a4f1d6.png)

しかし、手動で追加すると私が入っているし、共有したというメールも来ます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/71e92997-22f7-9716-b9c4-e171252ee423.png)

もう一度処理すると私の設定が消えている。　どういうこと？　フローは成功になっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/22c2f701-eba0-1f61-d458-9b598af6e2db.png)

今回は明示的に通知をオンにしたら、通知は来ましたね。

サイトの所有者でないユーザを追加したら、追加できた。
ということは、はやり機能しているということ？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e60a09a2-7001-453b-58a0-920b7d8e6bcd.png)


# グループの追加もできるかも

MSさんの場合は日本語で検索していても結構検索できるので日本語で検索していましたが、ダメですねぇ。
salesforceの場合は無条件に英語で検索しているので、ここでも英語で検索。

おおお、何と一発で見つかりますね。

+ [grant access to a SharePoint group](https://powerusers.microsoft.com/t5/Building-Flows/grant-access-to-a-SharePoint-group/td-p/729406)

HTTP requestを使えとあるなぁ。　日本語のページでは見つけられませんでしたし、グループの場合にはメールアドレスは意味がなかったのでね。日本のユーザはグループでアクセス権をつけることはしないんだろうか？ちょっと不思議です。

You can't replicate that easily in PA, there's no special action to assign permissions to SharePoint group. You'll have to use HTTP request for that:

では、設定してみます。

```
_api/lists/getByTitle('019住所変更届')/items(1)/roleassignments/addroleassignment(PrincipalId=17,roleDefId=1073741827)
```

PrincipalIdはグループのIdを使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ae02f0f5-4969-6332-dbde-b6cb459c98c1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/469a4995-5c28-b451-451f-43e17784ca4c.png)



おお、ちゃんと3つ目に追加したグループが登録されていますね。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/3a65a8ee-00f4-cf41-7132-c98834b63032.png)

部署をマスターとして使っているリストから選ぶようにしています。
ここにcanEditという列を作ってグループを登録させています。このメールアドレスを使っていたらずっと失敗でした。今回はHTTP requestでIdを設定すればいいと分かったのIdはどこにあるのだろうか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/11b910ae-aa22-a8db-0ba2-02dd96976b45.png)

列そのものを指定したらラベル名が入っているみたい。 Idでないな。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/46fe47da-4658-8181-7988-298a60f402a4.png)


```
_api/lists/getByTitle('019住所変更届')/items(8)/roleassignments/addroleassignment(PrincipalId=001Edit,roleDefId=1073741827)
```

これは、Null

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c84f56bf-d278-ad5d-95df-1c86c4442795.png)

```
_api/lists/getByTitle('019住所変更届')/items(8)/roleassignments/addroleassignment(PrincipalId=,roleDefId=1073741827)
```

ここを参考にしてグループのIdを取得してみましょう。

+ [SharePointグループへのアクセス権をPowerAutomateのフローで変更する](https://m365tips.com/flow-for-changing-accessrights/)

いきなり400エラーです。またヘッダが違う？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c8d3bbd4-d0a3-6eed-acdb-aa574020a750.png)

何を設定しても400エラーから抜け出せないので、　_api/web/sitegroups(17)を使って他のルーチンは動くか調べたけど、Jsonの解析が全くだめだ。値を取得できませんね。

式のところに以下を入れてOKクリックしてやっと動いた。　アクション名にブランクがあったけど _ に置き換える必要がありますね。

```
body('グループ情報の取得_HTTP_要求')?['d']
```

式から入力するとえんじ色のアイコンになる（右）
しかしいったん保存して開くと緑色のアイコンになる（左）。意味が分からん

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/fb66c08b-7dd9-7b93-056d-cefc7cc2dbfc.png)

最終的にはグループが取得できれば、機能はするみたい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f5ea614f-de64-f48f-1693-3b9d107f8f12.png)


書き換えたらなぜか動いた

シングルコーテーションが違う？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/9112dcd8-5eae-899c-dcf7-c94851c4ea35.png)

_api/web/sitegroups/getbyname('001Edit')　<-- OK
_api/web/sitegroups/getbyname(‘001Edit’)  <-- NG

ちがう、NGは実行結果をコピーして作ったような... 

違いがよくわからないので、分かりやすい絵

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/32a04ede-af53-9c18-26c4-08793e5eb8dc.png)

最終的にはマスター代わりに使っているリストの項目にあるグループの上からグループIdを取得することができました。これでどうにかやりたかったことが進みそう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/be5a950b-1ac2-fddb-d3fc-9e1aee98b8d5.png)





# 400エラーの調査。正直全く分からん

+ [グループ名に「&」が含まれている場合、REST API を使用してセキュリティ グループをクエリすると問題が発生する](https://sharepoint.stackexchange.com/questions/217065/problem-when-querying-my-security-group-using-rest-api-when-the-group-name-conta)


デフォルトでは、XML データを返します。Json データ形式を取得したい場合は、これを使用します。

accept: application/json;odata=verbose

メタデータが不要な場合は、これを使用します。

accept: application/json;odata=nometadata

https://github.com/SharePoint/sp-dev-docs/issues/5045


-----------------

+ [Power Automate フローで SharePoint の権限の継承を中止する２つの方法とその微妙な仕様の違い](https://pa-wsc.work/2413ms365)

+ [Power Automate のフローで SharePoint リストアイテムの権限を操作してみる](https://idea.tostring.jp/?p=5427)