鍋綿ブログ

C#・SharePoint・SharePoint Framework・Office365を中心に扱うブログです。

PnP プロビジョニングを利用したSharePointサイトのテンプレート展開

サイトの展開、面倒ですよね。
テスト用サイトで色々ためしていざ本番!という時とか、部署毎のサイトに似たコンテンツを持っている時とか。
特にモダンサイトとか発行機能が有効なサイトではサイトテンプレート・リストテンプレートが作れません。

と、いうわけで、当記事ではPnP プロビジョニングを利用してコンテンツを展開する方法を紹介します。

 

 

PnP プロビジョニング とは?

一言で説明すると、SharePointサイトの展開を支援する仕組みです。
主な目標は、「展開の自動化」だと思われます。

SharePointの設定は非常に多くあり、設定画面も豊富です。
そのため同じコンテンツを大量に横展開することが難しい面があります。
(単純に作業量が多くなり、設定ミスなんかも心配です。)

特に顧客向けにテンプレートや展開サービスを提供しているベンダーは、
手作業での展開を前提にしてしまうとコストが嵩み、品質も落ちます。

PnPプロビジョニングエンジンはこのような課題を解決することを目標にする仕組みです。
作業の自動化 = 作業をコード化できる = コードが書ければ画面はいらない
という理屈なのか、画面は一切用意されておりません!

すべての作業はPowerShellまたはC#で行います。また、サイトやリストの設定値はすべてXMLまたはJSONで表されます。

Microsoftの公式ページは以下です。いつもながら公式は文章が頭に入りづらいです。英語を約した日本語ってすごく読みづらいですよね。いっそ英文のまま読むかってなります。

PnP リモート プロビジョニング | Microsoft Docs

PnP プロビジョニングで出来ること

簡単に書くと以下2つです。

  • 既存サイトの定義を抽出(XMLまたはJSON形式)
  • 既存サイトに定義を適用

なんぼ管理者・技術者だと言っても、常に全部をXMLで書くのはツラいです。
SharePointサイトを作る ⇒ 定義を抽出 ⇒ 抽出したファイルを更に加工 ⇒ 別サイトに適用
という流れで利用するのがいいかと思います。
Excelマクロを作る時に、よーわからんからマクロの記録から始めるかって考えてたフレッシュな時代を思い出しますね。

 

サイトは多くの構成要素から成り立っていますので、じゃあ何がXMLで展開できんのよってところが重要です。

  • サイト列
  • コンテンツタイプ
  • リスト
  • サイトの機能

など色々ですが、まあ多すぎて書ききれないのでMicorosoftの公式ページをご覧ください。

環境構築

前述の通り、PnP プロビジョニングはPowerShellまたはC#で利用できます。
この記事ではPowerShellでの実行例を取り上げます。
C#向けの環境構築とサンプルはMicrosoftの公式ページにありましたので参考にどうぞ。

PowerShellでの実行に必要なものは、「PnP PowerShell」です。
インストールはPowerShellギャラリーから行うのが簡単です。

PowerShellGetをインストール

PowerShellギャラリーに繋ぐために、PowerShellGetが必要です。

まずPowerShellGetのページにアクセスします。
執筆時点でPower3.0 / 4.0向けとそれ以降向けとでやり方が異なるようです。
PowerShellを起動して「$PSVersionTable」コマンドを実行し、PSVersionの欄を確認してください。

PowerShell3.0 / 4.0ならPowerShellGetのページから「PackageManagement MSI」をダウンロードします。

PowerShell 5以降ならPowerShellコマンドでダウンロードできます。

Install-PackageProvider Nuget –Force

ギャラリーからPnP PowerShellをインストール

Install-Module SharePointPnPPowerShellOnline

これで実行環境ができました。

コマンド実行例

というわけでPowerShellコマンドの実行例をご紹介します。

既存サイトの定義の抽出

# 定義ファイルの出力先フォルダに移動します。予めフォルダを作成しておいてください。
cd 'C:\work\PnP\templateSite'

# SharePoint Onlineに接続するアカウントとパスワードを入力します。
$cred = Get-Credential

# SharePoint Onlineサイトに接続します。
Connect-PnPOnline -Url https://yourdomain.sharepoint.com/sites/sample -Credential $cred

# 現在接続中のサイトの定義をファイルに抽出します。
Get-PnPProvisioningTemplate -Out template.xml

赤字部分は環境に合わせて置き換えてください。
これでtemplate.xmlが出来ているはずです。とりあえずオプション無しの例をご紹介しましたが、抽出対象は細かく指定できますのでリファレンスなど参考にしてください。

また、既存リストアイテムやファイルをテンプレートに含めることもできます。

# リストアイテムを含める
Add-PnPDataRowsToProvisioningTemplate -Path template.xml -List 'SampleMaster' -Fields 'Title' -Query '<Query></Query>'
# ファイルを含める Add-PnPFileToProvisioningTemplate -Path template.xml -Source 'グラフ.xlsx' -Folder '/Shared Documents'

既存サイトに定義を適用

抽出したtemplate.xmlを別のサイトに適用する例です。
xmlファイルは勿論手書きしても良く、要らないものを削除するなど都合の良いようにファイルを編集してから行います。

先ほど抽出を行ったPowerShellウィンドウでそのまま実行してください。

# 適用先のサイトに接続します。(重要)
Connect-PnPOnline -Url https://yourdomain.sharepoint.com/sites/sample2 -Credential $cred

# 現在接続中のサイトに定義ファイルを適用します。
Apply-PnPProvisioningTemplate -Path template.xml

いかがでしたでしょうか。
SharePointサイトをテンプレート化して展開する方法はいくつかありますが、
その中でも特にコード依存の方法です。
参考になれば幸いです。