SharePointリストで疑似的に「投稿」のみの権限を作成する

`Microsoft 365 Advent Calendar 2024`13日目担当記事です！

https://adventar.org/calendars/10100

# はじめに
SharePointリストで、「投稿できるけど編集・削除はできない」といった権限の設定がやりたかったので、なんとか疑似的にでも再現できないか考えてみました。
具体的なシーンとしては、「社員からの申請を受け付けるが、申請内容を**勝手に書き換えたり削除したりできない**ようにしたい」という内容です。

要件としては、以下の操作のみが実行できる仕組みを考えます。
|操作|自分が投稿したアイテム|自分以外が投稿したアイテム|
|:---|:---|:---|
|閲覧|〇|×|
|投稿|〇|-|
|編集|×|×|
|削除|×|×|

# 既存の設定
リストの権限として、サイトの「所有者」「メンバー」「閲覧者」の既定の権限ロールがせっていされています。
他にも、ユーザー自身の投稿したアイテム以外を非表示にしたり、編集・削除できないようにすることも可能です。

![2024-12-08_13h16_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/50ce3cd3-1db0-c30b-e5c6-6ba0e9e113a7.png)
![2024-12-08_13h16_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/755e0fdf-2ec8-e781-5066-75dcab9037c7.png)
![2024-12-08_13h16_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/eb0f9bdf-0434-cf41-2913-7b0e17782a1c.png)

ただし、これらの権限設定では「作成」と「編集」が１つの同じ設定になっているため、「作成（投稿）」はできるが「編集」できないという権限の設定はできません。

個別の権限設定でさらに細かく見ていった場合も、上記の要件を満たす権限設定はありませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/1ee397e9-bc25-f8e9-2457-8a918157ff42.png)

https://learn.microsoft.com/ja-jp/sharepoint/understanding-permission-levels

結論として、「作成」と「編集」をそれぞれ制限する方法は見つかりませんでした。

:::note warn
※追記
カスタムのアスセス許可レベルを作れば「作成」と「編集」をわけて制限することができるようです！
[アクセス許可レベルを作成し、編集する方法 - SharePoint in Microsoft 365](https://learn.microsoft.com/ja-jp/sharepoint/how-to-create-and-edit-permission-levels)

ただし、「作成（追加）」と「表示」を分けることはできないようでしたので、この記事は残しておくこととします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/59d0f353-77af-bf41-e842-54521fc78f05.png)
[ヨウセイ](https://x.com/youseibubu)さんありがとうございます！
:::

# 疑似的な再現
どうやらできないことがわかったので、直接のアクセス権の設定ではなく疑似的に再現する方法を考えます。
今回考えた方法は、リストから直接フォームを作成できる機能です。

https://techcommunity.microsoft.com/blog/spblog/collect-information-like-a-pro-%e2%80%93-new-microsoft-lists-forms-experience/4086659

## フォームを作成する
フォームはリストのメニューから作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/5c62de15-70ac-f937-0cfc-8e83bf7f7296.png)

申請に必要な列のみを表示したフォームを作成します。
例えば「承認状態」など、管理用の列がある場合は非表示にしてフォームを作成できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/750cf7dc-4417-28ec-fff4-aba66dcda8e0.png)

:::note alert
必須フィールドを非表示にすることも可能で、必須フィールドを省いて投稿させることもできるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/72983218-6be1-99ff-28c6-c371baeaabf7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/a764db62-56c6-dbb8-a107-d4c73b65eb12.png)
:::

## フォームを利用できる対象
これで、既存の権限設定とは別に、「投稿」のみを行うことができる仕組みを用意することができました。
しかし、現時点では残念ながら、このフォームを使用できるユーザーを限定することはできません。

フォームにアクセスできるのは、同じ組織(テナント)のユーザーのみとはなってはいますが、特定のユーザーやグループに制限することがでいないため、**このリンクを知っている同じ組織(テナント)のユーザーであれば、誰でも投稿できてしまいます。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/61d597e1-02cf-c8e1-7249-efcce9950a67.png)


:::note alert
「誰にでも投稿してもらっては困る」というリストではこの方法は使用できません。
:::

私の目的では、社員全員が申請できるリストであったため、この問題は対処せずに使用しております。

## フォームの設置場所
あとは動線の用意です。
リストのコマンドバーに直接ボタンを置きたいところですが、JSON定義でのカスタマイズを含めても実装は難しいようでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/87c3babf-8392-e9d4-6d85-c76eaf0f2aeb.png)

https://learn.microsoft.com/ja-jp/sharepoint/dev/declarative-customization/view-commandbar-formatting

代わりに、フォームのリンクとリストを同じSharePointページに配置することで、それらしい動線を用意しておきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/66d5a5b6-ecaf-de24-e8bb-e6c9de5916bc.png)

:::note warn
この方法では、ページに対するアクセス許可も考える必要があります。
:::

## 最終結果
上記の仕様に問題がなければ、あとは実際に使用してもらうだけです。
下準備として、`アクセス許可の付与`からフォームの仕様に合わせて「外部ユーザー以外のすべてのユーザー」を`閲覧`権限で追加。
![2024-12-09_00h03_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/d92ec914-46a0-a009-a79d-0b8c66de15d8.png)

`アイテムごとの権限`はどちらも「ユーザー本人」にしておきます。
![2024-12-09_00h16_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/1594a938-6776-1095-9105-937494596282.png)

所有者と一般ユーザー(閲覧権限のみ)の画面を比べたのがこちらです。
フォームから投稿してもらった自身のアイテムは表示されますが、編集はできなくなりました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/e5f55cc5-0c3c-333b-248f-1b535b9b7399.png)

# おわりに
いろいろと考えて、無理やり実装はできましたが、やはり`無理やり感`は拭えない結果となってしまいました。
結論としては、行ごとの細かな権限設定ができる`Dataverse`をオススメしたいところですね。

ただ、このフォームを使うと、リストそのものに対するアクセス権を無視して「投稿」ができるという点は、可能性を大きく広げるものでもあると思います。
今後、フォームに対するアクセス許可を細かく設定できるようになれば、さらにできることも広がっていくでしょう！