PowerShellでShareGateを活用した効率的なSharePointデータ移行方法

<p>
株式会社テンダではShareGate Migrate（以降、ShareGate）を販売しています。<br>
PowerShellを使用することで、ShareGateによるSharePoint間のデータ移行は効率的かつ効果的に行えます。<br>
特に、手動での操作が必要なGUIとは異なり、PowerShellを用いることで、複数のサイトやリストを一度に移行することができるため、大規模なデータ移行プロジェクトにおいてその真価を発揮します。<br>
この記事では、PowerShellを活用したShareGateによるデータ移行の具体的な手順を、初心者の方でも理解しやすいように解説します。これにより、移行作業の効率が向上し、人為的なミスを減らすことができます。<br>
</p>

<h1>目次</h1>
1.ShareGateでのデータ移行をPowerShellで実行するメリット<br>
2.データ移行における主要コマンドレット一覧<br>
3.実例！　PowerShellとCSVを組み合わせたデータ移行方法<br>
4.サンプルコード<br>
5.まとめ<br>

<h1>1.ShareGateでのデータ移行をPowerShellで実行するメリット</h1>
ShareGateでのデータ移行をGUIではなくPowerShellで実行する最大のメリットは、一括移行が可能な点です。一括で移行することにより以下の恩恵を受けることが出来ます。

・	複数の移行元サイトから一回の操作で移行できる。
・	複数の移行先サイトへ一回の操作で移行できる。
・	移行作業の効率を向上できる。
・	人為的エラーを削減できる。

上記の恩恵はデータ移行するサイト数、リスト数、ライブラリ数が多いほど大きくなります。


<h1>2.データ移行における主要コマンドレット一覧</h1>
SharePoint間でのデータ移行の場面でよく使われるPowerShellコマンドレットは以下の通りです。<br>

|No.　|コマンドレット| 概要 |
|---------|---|---|
|1|Connect-Site |SharePointサイトに接続するコマンドレット |
|2 |Copy-Site|SharePointサイトをコピーするコマンドレット |
|3 |Copy-List |SharePoint リストまたはライブラリをコピーするコマンドレット |
|4 |Copy-Group  |SharePoint グループをコピーするコマンドレット  |
|5 |Copy-Content |SharePoint コンテンツ (ドキュメントまたはリスト アイテム)をコピーするコマンドレット |
|6 |Export-Report |移行レポートを出力するコマンドレット|


<h1>3. 実例！　PowerShellとCSVを組み合わせたデータ移行方法</h1>
今回はSharePointサイト間でリスト/ライブラリを複数移行する場合の実行方法をご紹介します。<br>
今回は下記画像のようなサンプルサイトAにあるリスト4つとサンプルサイトBにあるライブラリ2つをPowerShellで移行します。<br>

サンプルサイトA
![1サンプルサイトA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992355/fc1867a1-db07-4457-84a6-a2358e6d6137.png)

サンプルサイトB
![2サンプルサイトB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992355/dc9ecae6-fb83-45af-a008-d895c72c1f02.png)

移行先サイト
![3移行先.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992355/261da742-9804-4c10-8462-41d1fc9cd527.png)
※下記3-1以降の操作を行う前にShareGateが起動されていることを確認してください。
ShareGateが起動されていないとShareGate関連のPowerShellコマンドレットが実行されません。<br>


3-1.PowerShellをWindows標準のコンソールから起動し、ShareGate関連の実行コマンドレットを使えるように下記コマンドレットを実行します。

```powershell
Import-Module Sharegate
```

3-2.移行元リスト/ライブラリと移行先をマッピングするためのCSVファイルを作成し、ローカルの任意の場所に格納します。
マッピング用CSVに必要な列の要素はリスト/ライブラリ名、移行元サイトURL、移行先サイトURLの3点です。
下記画像のCSVでは、リスト/ライブラリ名=SourceListName、移行元サイトURL= SourceSiteUrl、移行先サイトURL= DestinationSiteUrlとして設定していますが、任意の名前で構いません。
![5CSV準備.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992355/a053247f-b0ab-4637-beee-06e4ea40c104.png)

3-3.PowerShellコンソール上でデータ移行に必要なパラメータを入力します。
今回の移行に必要なパラメータと設定するためのコマンドレットを下記表に記載します。

|No　|パラメータ|実行コマンドレット|
|---------|---|---|
|1|移行元ユーザー名 |$srcUsername = "<font color="red">**(アカウント名)**"</font>|
|2 |移行元ユーザーパスワード|$srcPassword = ConvertTo-SecureString "<font color="red">**(パスワード)**</font>" -AsPlainText -Force|
|3 |移行先ユーザー名 |$dstUsername = "<font color="red">**(アカウント名)**</font>"|
|4 |移行先ユーザーパスワード|$dstPassword = ConvertTo-SecureString "<font color="red">**(パスワード)**</font>" -AsPlainText -Force |
|5 |移行用CSVパス|$MigrationCsv = “<font color="red">**(3-2で格納した移行用CSVパス)**</font>”|
|6 |移行レポート出力パス|$migrateReportDirectory = "<font color="red">**(移行レポート出力フォルダパス)**</font>"|

下記画像は実際にPowerShellでパラメータを設定したものとなります。
![6パラメータ設定.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992355/df1dd2b5-3005-43d0-9adb-1d300295fc8a.png)

3-4.下記コマンドレットを入力してCSVファイルから移行元サイトURL、移行元サイト名、移行先サイトURLを取得します。
```powershell
$MigrationList = Import-Csv $MigrationCsv -Delimiter ","
```
3-5.下記コマンドレットを入力してSharePointのデータ移行処理を実行します。
下記コマンドレットはCSVファイル内のデータを参照し、1行ごとに移行元/移行先データ接続、データコピーの実行、移行レポート出力を繰り返す処理を行っています。
この処理によってCSVファイルに記載したリスト/ライブラリが上から順番に1ずつ直列でデータ移行されます。
※下記コマンドレットの内、SourceSiteUrl、DestinationSiteUrl、SourceListNameと記載されている箇所は3-2のCSVファイル作成時に設定した列名に対応するように修正してください。

```powershell
foreach($val in $MigrationList){
    #移行元、移行先サイト接続
    $srcSite = Connect-Site -Url $val.SourceSiteUrl -Username $srcUsername -Password $srcpassword
    $dstSite = Connect-Site -Url $val.DestinationSiteUrl -Username $dstUsername -Password $dstpassword
    #移行元リスト取得
    $srcList = Get-List -Site $srcSite -name $val.SourceListName
    #移行#
    $result = Copy-List -List $srcList -DestinationSite $dstSite -NoSiteFeatures
    # 移行レポートファイル名
    $migrateReport = $migrateReportDirectory + "\" + $val.SourceListName + "_" + (Get-Date).ToString("yyyyMMddHHmmss") + "_Migration_Report.xlsx"
    # 移行レポート出力
    $exportResult = Export-Report $result -Path $migrateReport
}
```

3-6.移行先サイト、ShareGate上での実行履歴、移行レポートを見て移行結果を確認します。
移行先サイト
![7移行後移行先.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992355/3b6a34b6-ce27-4388-94a5-af57c8fea5e9.png)

ShareGateアプリ上の実行履歴![8ShareGate確認画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992355/e2fdcc26-c9ee-4591-9e93-19ca6bf82023.png)

移行レポート
![9移行レポート一覧.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992355/a9dd7413-703f-402e-bb0c-80f285c36aa3.png)

例として移行元のサンプルサイトAにあった「案件」リストの移行結果が下記画像のように移行レポートとしてExcelに出力されたことが分かります。
![10移行レポート中身.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3992355/eacd4875-614e-48c9-8f4d-b02ea15688e5.png)

<h1>4.サンプルコード</h1>
3章で使用したコマンドレットをまとめたものを下記に記載します。
適宜パラメータを設定することでスクリプトファイル(.ps1)として実行することができ、また、タスクスケジューラを併用すればスケジュールで実行することも可能です。

※下記コマンドレットを手打ちで入力すると入力ミスのリスクがあるため、コピー&ペーストを行ってからユーザー名等の変更を行うことを推奨します。
※パラメータ設定で入力する移行元/移行先ユーザーアカウントはサイトコレクション管理者権限を持っている必要があります。

```powershell
### 移行元サイトURL/リスト名、移行先サイトURLのCSVファイル配置パス ###
$MigrationCsv = "(移行用CSV格納パス)"

### 移行元パラメータ ###
# ユーザー名(「"」内にユーザー名を記述)
$srcUsername = "(アカウント名)"
# パスワード(「"」内にパスワードを記述)
$srcPassword = ConvertTo-SecureString "(パスワード)" -AsPlainText -Force

### 移行先パラメータ ###
# ユーザー名(「"」内にユーザー名を記述)
$dstUsername = "(アカウント名)"
# パスワード(「"」内にパスワードを記述)
$dstPassword = ConvertTo-SecureString "(パスワード)" -AsPlainText -Force

### 移行レポート出力用パラメータ ###
# 移行レポート出力フォルダ
$migrateReportDirectory = "(移行レポート出力フォルダパス)"

### ------------------------------------- ###

### 移行処理 ###
# CSVファイルから移行元サイトURL、移行元サイト名、移行先サイトURLを取得
$MigrationList = Import-Csv $MigrationCsv -Delimiter ","

# 移行元リストの数だけ繰り返し処理
foreach($val in $MigrationList){
    #移行元、移行先サイト接続
    $srcSite = Connect-Site -Url $val.SourceSiteUrl -Username $srcUsername -Password $srcpassword
    $dstSite = Connect-Site -Url $val.DestinationSiteUrl -Username $dstUsername -Password $dstpassword
    #移行元リスト取得
    $srcList = Get-List -Site $srcSite -name $val.SourceListName
    #移行#
    $result = Copy-List -List $srcList -DestinationSite $dstSite -NoSiteFeatures
    # 移行レポートファイル名
    $migrateReport = $migrateReportDirectory + "\" + $val.SourceListName + "_" + (Get-Date).ToString("yyyyMMddHHmmss") + "_Migration_Report.xlsx"
    # 移行レポート出力
    $exportResult = Export-Report $result -Path $migrateReport
}

```

<h1>5.まとめ</h1>
プログラミングに慣れていない人にとっては、PowerShellに抵抗があると思いますが、移行するデータ量が多ければ多いほどPowerShellの方が便利なので本記事を参考にまずは試してみてほしいと思います。

<h1>最後に</h1>
<p>
テンダでは、「こんなプロジェクトに挑戦したい」「こんなチームで働きたい」「理想のチームを創りたい」と願う仲間を求めています。 
カジュアル面談も随時受付中です。ぜひ一度お話ししましょう。<br> 
<a href="https://hrmos.co/pages/tenda/jobs">募集職種一覧</a><br>
<a href="https://hrmos.co/pages/tenda/jobs/031002/apply">カジュアル面談の申込</a><br>
<a href="https://note.com/tenda_recruit">テンダで働く人や社風について</a><br>
</p>