Nanairo

I want to run a way in front of me.

Sharepoint OnlineとPowershellでリストを大量作成した話②

前回の続きものです。
tachi221.hatenablog.com

説明については①を見ていただければと思います。

5.サイトを作る

次に各部署に割り当てるページを作ります。
サイトの中にページを作るにはAdd-PnPClientSidePageを使います。
Nameにはページのファイル名・保存パスを指定します。今回はPagesというフォルダーを作って、その中にhogehoge.aspxを入れたいので、Pages/hogehogeという指定をします。
ページ上にコメント欄をつけたい場合は何も指定する必要はありませんが、コメント欄を入れたくない場合はCommentsEnabled:$falseを追加します。
LayoutTypeは基本、Articleで良いでしょう。HeaderLayoutTypeですが、ヘッダーはさっぱりにしたいので、Noimageと指定しています。最後にPublish:$trueも忘れずにいれておきます。Publishを入れないと発行されません。

Add-PnPClientSidePage `
  -Name "Pages/hogehoge" `
  -CommentsEnabled:$false `
  -LayoutType Article `
  -Publish:$true `
  -HeaderLayoutType NoImage

これでページは出来たわけですが、出来たページのタイトルはhogehogeになっているので、これを変えます。
Titleに設定したいタイトルの名前を設定します(以下の例ではhogehoge belongslist)。

Set-PnPClientSidePage `
  -Identity "Pages/hogehoge" `
  -HeaderType:None `
  -Title "hogehoge belongsList"

次にリストパーツを配置します。Add-PnPClientSideWebPartでDefaultWevPartTypeの値にListを指定します。

Add-PnPClientSideWebPart -Page "Pages/hogehoge" -DefaultWebPartType List

リストパーツが設定されたので、ここに①で作ったリストを割り当てます。
最初に後続作業で使用するJSONを作ります。ここには割り当てるリストの内容などが格納されています。
JSONの生成に当たって、まずは表示するリストのGuIdを取得します。

Get-PnPList

サイト上に作成されているリストの一覧が表示されるので、該当のリストのIdを何か変数に格納しておきます。

$ListId = "ListのGuId"

次に適用したいリストのビューのGuIdを取得します。ListのGuIdと同様に何か変数に格納しておきます。

Get-PnPView -List "Lists/ListFilename"
$ListViewId = "(ビューのGuId)"

得た値を下にJSONのもとになる配列を作ります。webpartHeightkeyは貼り付けるリストがページ上でどのくらいの高さになるかを指定する値です。

$paramArray = @{`
  "isDocumentLibrary" = $false;`
  "selectedListId"=$ListId;`
  "selectedListUrl"="/sites/example/Lists/ListFilename";`
  "webRelativeListUrl"="/Lists/ListFilename";`
  "webpartHeightKey"=8;`
  "selectedViewId"=$ListViewId;`
  "selectedFolderPath"=""`
}

JSON用のオブジェクトを作成します。

$JsonObject  = New-Object -TypeName PSObject

JSON用のオブジェクトに上記で作った配列(paramArray)を格納します。

Foreach ($key in $paramArray.keys){
  Add-Member -InputObject $JsonObject -MemberType NoteProperty -Name $key -Value $paramArray[$key]
}

作ったオブジェクトからJSONを生成します。

$JSON = ConvertTo-JSON -Compress $JsonObject

次に作ったJSONを使って、ページ上にリストの配置をします。
Idntityに渡す値ですが、作ったリストパーツのGuIdのようですので、それを取得します。
Get-PnPClientSideComponentで作ったリストパーツのInstanceIdを取得し、ListInstanceGuIdに格納します。ただ、普通に格納すると型が異なる模様なので、Stringとして格納します。

[string]$ListPartsInstanceGuId = (Get-PnPClientSideComponent -Page "Lists/ListFilename").InstanceId

Set-PnPClientSideWebPartで前に作ったJSONとリストパーツのGuIdからリストの割り当てをします。

Set-PnPClientSideWebPart -Page "Pages/hogehoge" -Identity $ListPartsInstanceGuId --PropertiesJson $JSON

この記事の①では表示されるリストは年齢順に並べ替えたものが表示されたいと思っていたが、実際にやってみると反映されなかったということを説明しました。
というわけで、リストのフィルターをJSONを使って指定します(順番が前後しますが…)。

まずは、作ったリストのビュー情報を取得します。

Get-PnPView -List "Lists/ListFilename"

これを実行すると「すべてのアイテム」と「年齢順」が表示されるので、年齢順のビューを展開します。後続作業のことも考えて、適当な変数に保管することがよいでしょう。

$ListParm = Get-PnPView -List "Lists/ListFilename" | Where-Object {($_.Id) -eq "(年齢順ビューのId)"} | select *

展開するとListViewXmlというフィールドがあると思います。この値を取得します。例によって変数に格納しますが、この値はXml形式なので、Xmlで取り込むようにします。
格納後、リストの並べ替えを指定している部分を取得します。

[xml]$ListViewXml = $ListParm.ListViewXml
$ListViewXml.FirstChild.InnerXml

該当のXmlが表示されると思います。この記事の目的は、同じフォーマットのリストをいっぱい作るということだったので、このXmlは今後も使えると思います。
作成した年齢順のビューに並べ替えの設定を入れます($ListViewXml.FirstChild.InnerXmlの中身はから始まっていると思います)。

Set-PnPView `
 -List "Lists/ListFilename" `
 -Identity "年齢順" `
 -Values @{ListViewXml = "($ListViewXml.FirstChild.InnerXmlの内容を記述する)"} | Out-String

ページを作ってからリストパーツを追加し、パーツにリストを割り当てるという処理をした(=ページに手を加えた)ので、ページの再発行をしておきます。

Set-PnPClientSidePage -Identity "Pages/hogehoge" -Publish:$true

これで作業は終了しました。
この流れをps1ファイルなどにしておくと、機械的にたくさんのリストと掲載ページを作ることができます。
あとは作ったページをサイト上で適当にリンクを貼ってやればよいかと思います。

参考
PnP PowerShell で Sharepoint を操作しよう: (3) 簡単なリストを作ろう - Qiita
Microsoft.SharePoint.Client namespace () | Microsoft Docs