インポート ジョブでも非同期メタデータ読み取り (AMR) ジョブでも、移行ジョブを送信した後は、GetMigrationJobProgress API を使用してその進行状況を追跡できます。 API は、SDK インターフェイスと REST インターフェイスの両方を介して使用できます。
JobQueued、JobStart、JobProgress、JobError、JobEnd など、一連のジョブ状態イベントが返されます。
アクセス許可
移行ジョブを送信するときは、アプリケーション ベースの認証を使用します。 アプリケーションに Sites.Read.All 権限以上が付与されていることを確認します。
GetMigrationJobProgress メソッド (SDK)
構文
public ClientResult Site.GetMigrationJobProgress(
Guid jobId,
String nextToken
)
メソッド パラメータ
| 名前 | 型 | 必須 | 説明 |
|---|---|---|---|
| jobId | Guid | はい | 移行ジョブの一意識別子 |
| nextToken | 文字列 | はい | ページング位置のトークン。 最初の要求に "0" を使用する |
完了したジョブの場合、nextToken を使用する要求はべき等です。同じ要求を繰り返すと、同じ結果が一貫して返されます。
戻り値
| 名前 | 型 | 説明 |
|---|---|---|
| ログ | IList | 新しい進行状況が使用可能な場合はジョブ状態イベントのコレクション、更新プログラムがない場合は空のコレクションを返します。 |
| NextToken | 文字列 | 新しい進行状況が使用可能な場合は更新された文字列値を返し、更新がない場合は nextToken パラメーターと同じ値を返します。 |
メソッドの使用例
ClientResult result = context.Site.GetMigrationJobProgress(jobId, nextToken ?? "0");
context.ExecuteQuery();
IList logs = result.Value.Logs;
string newNextToken = result.Value.NextToken;
GetMigrationJobProgress REST API
HTTP 要求
GET https://{site_url}/_api/site/GetMigrationJobProgress(jobId='{jobId}',nextToken=0)
URI パラメーター
| 名前 | 型 | 必須 | 説明 |
|---|---|---|---|
| jobId | Guid | はい | 移行ジョブの一意識別子 |
| nextToken | 文字列 | はい | ページング位置のトークン。 最初の要求に "0" を使用する |
要求ヘッダー
| ヘッダー | 必須 |
|---|---|
| 承認: ベアラー {token} | はい |
| Accept: application/json;odata=verbose | はい |
応答
HTTP 状態コードが 200 の場合の JSON オブジェクト。
HTTP 状態コードが 200 以外の場合は空の JSON オブジェクト。
エラー処理
| 状態コード | 意味 | アクション |
|---|---|---|
| 403 | 権限がありません (Unauthorized) | アプリ/ユーザーが Sites.Read.All 以上のアクセス許可を持っていることを確認します。 |
| 429 | 要求数が多すぎます (Too Many Requests) | ヘッダー Retry-After 解析し、指定した遅延後に再試行します。 |
| 500 | 内部サーバー エラー (Internal Server Error) | エラー応答を解析して内部エラーを特定します。 再試行しないでください。 |
| 503 | サービスは利用できません | ヘッダー Retry-After 解析し、指定した遅延後に再試行します。 |
| 内部エラー コード | 意味 |
|---|---|
| -2147213145 | ジョブが見つかりません |
| -2147213146 | ジョブの状態の有効期限が切れています (有効な期間は 5 日未満) |
API の使用例
要求サンプル
GET https://contoso.sharepoint.com/_api/site/GetMigrationJobProgress(jobId=' 3e280efa-78a3-4ba1-bac6-e447aa538ca5', nextToken=0)
成功応答のサンプル
状態コード: 200 応答本文:
{
"d": {
"GetMigrationJobProgress": {
"Logs": {
"__metadata": {
"type": "Collection(Edm.String)"
},
"results": [
"{\"MigrationType\":\"None\",\"MigrationDirection\":\"Import\",\"SiteId\":\"48f1898f-77d9-4a1b-bddc-1f49bb6dc134\",\"DbId\":\"de6b85cd-726e-4b13-ae04-629798fddbf3\",\"TotalRetryCount\":\"0\",\"JobId\":\"3e280efa-78a3-4ba1-bac6-e447aa538ca5\",\"Time\":\"05/20/2025 09:18:48.132\",\"CorrelationId\":\"91884a0c-5ee8-4e1f-a23f-e4f7ec170182\",\"Event\":\"JobQueued\"}",
"{\"MigrationType\":\"None\",\"MigrationDirection\":\"Import\",\"SiteId\":\"48f1898f-77d9-4a1b-bddc-1f49bb6dc134\",\"WebId\":\"7206fc09-e4af-48b3-8730-ed7321396d7a\",\"DbId\":\"de6b85cd-726e-4b13-ae04-629798fddbf3\",\"FarmId\":\"f77d7b6c-ef43-4609-8fce-0e93142ce8a0\",\"ServerId\":\"44af885c-393b-4236-9417-bae7a9edc44e\",\"SubscriptionId\":\"82abb045-250e-4186-ba83-b9295930f272\",\"TotalRetryCount\":\"0\",\"JobId\":\"3e280efa-78a3-4ba1-bac6-e447aa538ca5\",\"Time\":\"05/20/2025 09:20:51.129\",\"CorrelationId\":\"7d3e7a8e-4445-4ce0-adb1-078e78cbf686\",\"Event\":\"JobStart\"}",
"{\"MigrationType\":\"None\",\"MigrationDirection\":\"Import\",\"TotalRetryCount\":\"0\",\"ObjectType\":\"ListItem\",\"Url\":\"\",\"Id\":\"cb471d5f-593f-4a63-b59e-8eae3e35b08a\",\"SourceListItemIntId\":\"3\",\"TargetListItemIntId\":\"3\",\"ErrorCode\":\"-2147286782\",\"ErrorType\":\"Microsoft.SharePoint.SPException\",\"Message\":\"Attempted to use an object that has ceased to exist. (Exception from HRESULT: 0x80030102 (STG_E_REVERTED)) \",\"JobId\":\"3e280efa-78a3-4ba1-bac6-e447aa538ca5\",\"Time\":\"05/20/2025 09:20:55.490\",\"CorrelationId\":\"7d3e7a8e-4445-4ce0-adb1-078e78cbf686\",\"Event\":\"JobError\"}",
"{\"MigrationType\":\"None\",\"MigrationDirection\":\"Import\",\"TotalRetryCount\":\"0\",\"FilesCreated\":\"0\",\"BytesProcessed\":\"0\",\"ObjectsProcessed\":\"4\",\"TotalExpectedSPObjects\":\"15\",\"TotalErrors\":\"3\",\"TotalWarnings\":\"0\",\"WaitTimeOnSqlThrottlingMilliseconds\":\"0\",\"TotalDurationInMs\":\"0\",\"CpuDurationInMs\":\"0\",\"SqlDurationInMs\":\"0\",\"SqlQueryCount\":\"0\",\"IsShallowCopy\":\"False\",\"CreatedOrUpdatedFileStatsBySize\":\"{}\",\"ObjectsStatsByType\":\"{\\\"SPUser\\\":{\\\"Count\\\":1,\\\"TotalTime\\\":124,\\\"AccumulatedVersions\\\":0,\\\"ObjectsWithVersions\\\":0},\\\"SPFolder\\\":{\\\"Count\\\":1,\\\"TotalTime\\\":153,\\\"AccumulatedVersions\\\":0,\\\"ObjectsWithVersions\\\":0},\\\"SPDocumentLibrary\\\":{\\\"Count\\\":1,\\\"TotalTime\\\":404,\\\"AccumulatedVersions\\\":0,\\\"ObjectsWithVersions\\\":0},\\\"SPFile\\\":{\\\"Count\\\":1,\\\"TotalTime\\\":0,\\\"AccumulatedVersions\\\":0,\\\"ObjectsWithVersions\\\":0},\\\"SPListItem\\\":{\\\"Count\\\":1,\\\"TotalTime\\\":1880,\\\"AccumulatedVersions\\\":0,\\\"ObjectsWithVersions\\\":0}}\",\"TotalExpectedBytes\":\"0\",\"FilesCreatedIrrespectiveOfVersions\":\"0\",\"BytesProcessedOnlyCurrentVersion\":\"0\",\"JobId\":\"3e280efa-78a3-4ba1-bac6-e447aa538ca5\",\"Time\":\"05/20/2025 09:20:57.380\",\"CorrelationId\":\"7d3e7a8e-4445-4ce0-adb1-078e78cbf686\",\"Event\":\"JobEnd\"}"
]
},
"NextToken": "1764",
"__metadata": {
"type": "SP.MigrationJobProgress"
}
}
}
}
エラー応答のサンプル
状態コード: 500 応答本文:
{
"error": {
"code": "-2147213145, Microsoft.SharePoint.SPException",
"innererror": {
"message": "Job not found",
"stacktrace": "STACK_TRACE"
},
"message": {
"lang": "en-US",
"value": "Job not found"
}
}
}
ベスト プラクティス
nextToken=0から開始し、返されたトークンを格納し、一定の間隔でポーリングします。 この方法は、実行時間の長いジョブに適しており、更新が見逃されないようにするのに役立ちます。
移行ジョブは通常数分以上かかるため、調整を回避するための ガイドライン に従いながら、1 分ごとにポーリングすることをお勧めします。