【SharePoint】PnP.PowerShellだけでアプリの設定がどこまでできるか - リスト編

こんにちは！
M365（特にSharePoint,Power Automate,Power Apps,Teams）に関する記事やちょっとした小ネタなどをご紹介していきます。

# はじめに
検証テナントで作成したSharePointサイトやリストやライブラリを別の環境に移植したいとき、GUIで頑張る方法、移行ツールを使う方法、PowerShellでサイトテンプレートやアプリの情報を抽出して展開する方法など、やり方は色々あると思います。

今回は、PnP.PowerShellコマンドのみを利用してリスト／ライブラリの作成・設定から、列、ビューの設定などをどこまで実装できるかを検証してみましたので、シリーズ化してお届けしたいと思います。

初回はカスタムリストの作成と設定に関する内容をまとめました。
主によく設計で利用しそうな項目をピックアップしているため、網羅性は十分ではないかと思いますが、ご了承いただけますと幸いです。

# 検証環境
・Windows PowerShellバージョン：5.1
・PnP.PowerShellモジュール：1.12.0
・M365ライセンス：Office 365 E1

# 検証内容
＜前提＞
・SharePointサイトが作成済みであること（今回はモダンチームサイトを利用）
・PnP.PowerShellモジュールがインストール済みであること

:::note info
PnP.PowerShellモジュールのインストール、サイトへの接続方法は、以下のサイトを参照ください。
[SharePoint サイトのデザイン - PnP PowerShell コマンドレット](https://learn.microsoft.com/ja-jp/sharepoint/dev/declarative-customization/site-design-pnppowershell)
:::

## リストの作成と設定
リストの新規作成、設定変更ではそれぞれ「New-PnPList」、「Set-PnPList」コマンドを利用します。
それぞれのコマンドで指定出来るオプション、指定出来ないオプションをカテゴリ別に表にまとめました。「New-PnPList」で指定出来ないものは、リスト作成後に「Set-PnPList」で追加設定を行う必要があります。

・[New-PnPListコマンドレット](https://pnp.github.io/powershell/cmdlets/New-PnPList.html)
・[Set-PnPListコマンドレット](https://pnp.github.io/powershell/cmdlets/Set-PnPList.html)

### ①リスト名、説明、ナビゲーションの列挙

＜ 設定画面（GUI）＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587034/650d6c58-0313-9e59-ded4-74a1084c2bc5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587034/88909a69-56f9-0801-0be8-cb4c52de3be6.png)

| 設定項目1 | 設定項目2 | New-PnPList | Set-PnPList |
|:-----------|:------------|:------------:|:------------:|
| 名前と説明 | 名前 | ○<br>Title | ○<br>Title |
|           | 説明 | × | ○<br>Description |
| ナビゲーション | このリストをサイド<br>リンク バーに表示する | ○<br>OnQuickLaunch | × |
| その他 | 内部名（Webアドレス） | ○<br>URL | ○<br>Path |
|  | アプリの種類 | ○<br>Template<br>(GenericList,DocumentLibrary<br>など) | × |

:::note info
表の見方は以下の通りです。
・該当列のコマンドで指定出来る場合は「○」、出来ないものは「×」となります。
・○の下に記載している単語は、指定するオプション名となります。
※コマンド実行例も併せてご確認ください。

```powershell
# New-PnPList 実行例
New-PnPList -Title "検証用リスト01" -Url "Lists/testList01" -Template GenericList -OnQuickLaunch

# Set-PnPList 実行例
Set-PnPList -Identity "検証用リスト01" -Title "検証用リスト02" -Path "Lists/testList02" -Description "検証用のリストです"
```
:::

### ②バージョン設定（リストの場合）
＜ 設定画面（GUI）＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587034/bfbb7143-600a-cf55-b166-e4e9e73a1163.png)

| 設定項目1 | 設定項目2 | New-PnPList | Set-PnPList |
|:-----------|:------------|:------------:|:------------:|
| コンテンツの承認 | 承認を必須にする | × | ○<br>EnableModeration |
| アイテムの<br>バージョン履歴 | 編集するたびに<br>バージョンを作成する | ○<br>EnableVersioning | ○<br>EnableVersioning |
|  | 次の数のバージョンを保存 | × | ○<br>MajorVersions |
|  | 次の数の承認済み<br>バージョンの下書きを保存 | × | ×<br>※1 ※2 |
| 下書きアイテムのセキュリティ<br>※2 | 下書きアイテムを<br>表示できるユーザー | × | ○<br>DraftVersionVisibility<br>(Approver,Author,Reader) |

※1 コマンド自体は正常に実行されますが、パラメータには反映されませんでした。
※2 コンテンツの承認が無効の場合は、GUI上でグレーアウトとなります。

### ③詳細設定（リストの場合）
＜ 設定画面（GUI）＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587034/ade4fd15-bd97-ecfb-a355-636c6c6a2971.png)

| 設定項目1 | 設定項目2 | New-PnPList | Set-PnPList |
|:-----------|:------------|:------------:|:------------:|
| コンテンツタイプ | コンテンツタイプの管理を許可 | ○<br>EnableContentTypes | ○<br>EnableContentTypes |
| アイテムごとの権限 | 読み取りアクセス権 | × | ○<br>ReadSecurity<br>(AllUsersReadAccess,<br>AllUsersReadAccessOnItemsTheyCreate) |
|  | 作成/編集のアクセス権 | × | ○<br>WriteSecurity<br>(WriteAllItems,WriteOnlyMyItems,WriteNoItems) |
| 添付ファイル | アイテムへのファイル添付 | × | ○<br>EnableAttachments |
| コメント | アイテムへのコメント許可 | × | ○<br>DisableCommenting<br>※1 |
| フォルダー | [新しいフォルダー] の表示 | × | ○<br>EnableFolderCreation |
| 検索 | リストアイテムの検索結果表示 | × | ○<br>NoCrawl |
| 既定以外のビューの<br>インデックス化 | 既定以外のビューの検索結果表示 | × | △<br>CrawlNonDefaultViews<br>※2 |
| リストのインデックスの再作成 |  | × | 不明 |
| オフライン クライアントの<br>使用制限 | ダウンロードの許可 | × | ×<br>ExcludeFromOfflineClient<br>※3 |
| クイック プロパティの編集 | [クイック編集]と[詳細] の利用 | × | ○<br>DisableGridEditing |
| ダイアログ ボックス |  | × | 不明 |
| インデックスの自動管理 |  | × | 不明 |
| リストの表示 |  | × | ○<br>ListExperience<br>(Auto,NewExperience,ClassicExperience) |

※1 コマンド実行時にエラーとなり、設定不可。後述のコマンド処理により設定が可能。
※2 コマンド自体は正常に実行されますが、パラメータには反映されませんでした。後述のコマンド処理により設定が可能。
※3 オプション名は記載のものと推測されますが、コマンドを実行してもパラメータに反映されませんでした。後述のコマンド処理でも同様に反映不可となりました。

:::note info
上記の※1、※2で記載した別方法によるコマンド処理は以下となります。この処理を利用することで、Set-PnPListで直接指定が出来ないものも、一部設定が可能でした。

```powershell
$list = Get-PnPList -Identity "リストの表示名"

# ※1（コメント）の場合
$list.DisableCommenting = $false

# ※2（既定のビュー以外のインデックス化）の場合
$list.CrawlNonDefaultViews = $false

$list.Update()
Invoke-PnPQuery
```

【参考】[モダンリストとライブラリのエクスペリエンスをオプトアウトする](https://learn.microsoft.com/ja-jp/sharepoint/dev/transform/modernize-userinterface-lists-and-libraries-optout#opting-out-at-list-level)
:::

### ④リストの権限
＜ 設定画面（GUI）＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587034/0f450fe2-4236-0e33-ed57-d22cbaa16563.png)

| 設定項目1 | 設定項目2 | New-PnPList | Set-PnPList |
|:-----------|:------------|:------------:|:------------:|
| このリストに対する権限 | 権限の継承／中止 | × | ○<br>(BreakRoleInheritance [中止]),<br>ResetRoleInheritance [継承]) |

# 最後に
「New-PnPList」で指定出来るものは限りがありましたが、「Set-PnPList」では主要な設定項目が思っていたよりもカバー出来た印象でした。
一度コマンドセットを作っておけば、色々と使いまわしが出来そうなので、引き続き深堀していきたいと思います。

# 関連記事
第2回：[【SharePoint】PnP.PowerShellだけでアプリの設定がどこまでできるか - ライブラリ編](https://qiita.com/yuki_asa/items/7b5c0c24505551b4764a)