SharePoint Onlineのサイトページを他のサイトコレクションにコピーする
2022.01.18

皆様初めまして。MS開発部の福田です。
突然ですがSharePoint Onlineのサイトページをコピーしたいと思ったことはありませんか?SharePoint Onlineではサイトページを作成しそれらを複製することができますが、標準の機能だと同じサイトコレクション内にしかコピーすることができません。
「部署ごとにチームサイトを作っているけど作成したサイトページを他部署にも掲載したい…。」
「せっかく作ったモックサイトのページを本番用のテナントにそのまま移行したい…。」
といったときにはもう一度サイトページを作成する必要がありました。
そこで今回はPnP PowerShellを利用する、サイトページを他テナントやサイトコレクションにコピーできるスクリプトをご紹介します。
PnP PowerShellとは
PnP PowerShellとはMicrosoft365のSharePoint Online、Microsoft Teams、Microsoft Flowで動作するコマンドレットを提供するPowerShellモジュールです。コマンドレットを実行することにより情報取得やカスタムをすることが可能です。
PnP PowerShellを利用する
PnP PowerShellを利用するにはPnP PowerShellモジュールをインストールする必要があります。以下の手順でインストール可能です。
- Windows PowerShellを管理者として実行する。
- 以下のコマンドレットを実行する。
Install-Module -Name PnP.PowerShell |
サイトページをコピーするPowerShellスクリプトを作成する
必要な権限
- サイトページのコピー元サイトコレクション、コピー先サイトコレクションの双方に編集以上の権限があるMicrosoft365アカウント
PowerShellスクリプト
基本のスクリプトは以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
try { $srcUrl = Read-Host "コピー元のサイトを入力してください。(例:https://original.sharepoint.com/sites/sample)" $destUrl = Read-Host "コピー先のサイトを入力してください。(例:https://copy.sharepoint.com/sites/sample2)" $pageName = Read-Host "コピーするサイトページを入力してください。(例:sitePage.aspx)" $cred = Get-Credential Connect-PnPOnline -Url $srcUrl -Credentials $cred $tempFile = [System.IO.Path]::GetTempFileName(); Export-PnPPage -Force -Identity $pageName -Out $tempFile Connect-PnPOnline -Url $destUrl -Credentials $cred Invoke-PnPSiteTemplate -Path $tempFile Write-Host "処理が完了しました。" sleep 10 } catch { Write-Host -ForegroundColor Red 'Error ',':'$Error[0].ToString(); sleep 10 } |
‘Read-Host’によって、PowerShellの画面からコピー元とコピー先のサイトコレクション名、コピーするページ名を変数に入力します。
1 2 3 |
$srcUrl = Read-Host "コピー元のサイトを入力してください。(例:https://original.sharepoint.com/sites/sample)" $destUrl = Read-Host "コピー先のサイトを入力してください。(例:https://copy.sharepoint.com/sites/sample2)" $pageName = Read-Host "コピーするサイトページを入力してください。(例:sitePage.aspx)" |
以下の画像の赤枠線部はユーザーが入力する箇所です。

PowerShellにてユーザーが入力する項目
‘Get-Credential’でログインするOffice365アカウントのユーザー名とパスワードを入力します。
1 |
$cred = Get-Credential |

ユーザー情報の入力
入力したサイトコレクション名、ページ名、ユーザー情報をもとに、‘Connect-PnPOnline’にてコピー元のサイトコレクションにアクセスします。
ユーザーのローカル環境に一時ファイル(***.tmp)を作成し、‘Export-PnPPage’によって一時ファイルにコピーするサイトページを出力します。
1 2 3 |
Connect-PnPOnline -Url $srcUrl -Credentials $cred $tempFile = [System.IO.Path]::GetTempFileName(); Export-PnPPage -Force -Identity $pageName -Out $tempFile |
続いてコピー先のサイトコレクションにアクセスします。
アクセスすることができたら’Invoke-PnPSiteTemplate’によって一時ファイルをサイトコレクションに適用します。
1 2 |
Connect-PnPOnline -Url $destUrl -Credentials $cred Invoke-PnPSiteTemplate -Path $tempFile |

サイトページのコピーイメージ
1 2 3 4 5 6 |
catch { Write-Host -ForegroundColor Red 'Error ',':'$Error[0].ToString(); sleep 10 } |
サイトページのコピーができないもの
コピー元とコピー先のサイトコレクションで「全幅のセクション」に配置できるWebパーツが異なり、コピー先の「全幅のセクション」には配置できないWebパーツがサイトページに含まれている場合、エラーが発生します。以下のキャプチャは全幅のセクションを配置したサイトページです。追加できるWebパーツのうち、「Show Like」Webパーツはコピー元のサイトコレクションでのみ使えるWebパーツです。

全幅のセクションを配置した状態

「Show Like」Webパーツを配置したサイトページ(Original.aspx)
「Show Like」Webパーツを配置した状態で、「Show Like」Webパーツを全幅のセクションに配置できないサイトコレクションにコピーしようとすると、エラーが発生します。

全幅のセクションにコピー先で利用できないWebパーツを配置したサイトページをコピーする際に発生するエラー
この状態ではサイトページの内容をコピーする際にエラーが発生したため、コピー元と同じ名前の空白のページが作成されます。

コピー先に作成された空白ページ(Original.aspx)
また、サイトコレクション内を参照するリンクやパスを含むWebパーツはコピーの際にリンクやパス内のサイトコレクションのURLがコピー先のサイトコレクションのURLに置き換わります。コピー先にリンク先やパスで指定したファイル等がない場合は、リンク及びパスが無効になります。
サイトテンプレートとの併用
SharePoint Onlineではサイトテンプレートを利用してサイトコレクションを作成できます。Microsoft側で用意されている既存のサイトテンプレートだけではなく、ユーザーがオリジナルのサイトテンプレートを作成することも可能です。
サイトテンプレートにはサイトのテーマやリスト、ドキュメントライブラリの設定等が含まれますが、リストやドキュメントライブラリのアイテムは含まれないため、今回紹介したPowerShellスクリプトと合わせて使うことでサイトコレクションの作成が容易になるのではないでしょうか?
サイトテンプレートの詳しい使い方、作成方法につきましては、Microsoftのドキュメント及び弊社の記事をご覧ください。
Microsoftドキュメント
DeepComブログ
最後に
いかがでしたでしょうか。今回ご紹介したのはPnP PowerShellにて提供されているコマンドレットを使ったPowerShellのスクリプトになります。 他のコマンドレットを利用することでサイトページ以外のコピーができたり、ループ処理を追加することで複数ページを一括でコピーできたりするなど様々な形に応用が可能となっております。
皆様が便利なようにカスタムしてご活用ください。
ディープコムのSharePointに関するサービス一覧
ディープコムのSharePointに関するプロダクト一覧
以上、最後までご愛読いただき
ありがとうございました。
お問い合わせは、
以下のフォームへご連絡ください。