SharePoint で選択肢列と参照列を PowerShell で付け替える(2/3)
前回の続きです
下記手順の 2 番目、参照列の作成を行います。
- 選択肢列の値を使い、参照列元のリストを作成する
- 手順 1 で作成したリストを使い、参照列を作成する
- 選択肢列の値を参照列に移行
- 選択肢列の削除
環境
このリストは最初に作っていた
- リスト名: 選択肢列と参照列を付け替える
列名 | 内部列名 | 種類 | 値 |
---|---|---|---|
目的地 | Title | 1 行テキスト | |
乗り物 | vehicle | 選択肢 | 車 , バイク , 自転車 , 船 , 飛行機 |
おやつ | snack | 選択肢(複数選択可能) | ポテトチップス , アポロ , じゃがりこ , チップスター , ハイレモン , かっぱえびせん |
このリストを前回作った
- 選択肢列から作成される参照元リスト(マスタリスト)
列名 | 生成されるリスト名 | リストのタイトル |
---|---|---|
乗り物 | 乗り物マスタ | vehicleMst |
おやつ | おやつマスタ | snackMst |
今回はこの列を作成する
- リスト「選択肢列と参照列を付け替える」に追加される参照列名
列名 | 内部列名 | 参照リスト名 |
---|---|---|
乗り物 | relVehicle | 乗り物マスタ |
おやつ | relSnack | おやつマスタ |
1. 選択肢列の値を使い、参照列元のリストを作成する
こちらは済です
2. 「選択肢列と参照列を付け替える」に参照列を作成
[void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client")
[void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.Runtime")
# SharePoint Online の URL
$url = 'https://<tenant>.sharepoint.com/sites/example'
# ユーザー名
$user = '[email protected]';
# パスワード
$secure = Read-Host -Prompt "Enter the password for ${user}(Office365)" -AsSecureString;
# SharePoint Online 認証情報
$credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($user, $secure);
# SharePoint Client Context インスタンスを生成
$ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL)
$ctx.Credentials = $credentials
## ここまではいつものおまじない的なコード。
## ログインして SharePoint Client Context のインスタンスを作成しています。
## 必要な変数定義
# 選択肢列を参照列に置き換えるリストのリスト名
$baseListName = "選択肢列と参照列を付け替える"
# 参照列化する列名
$baseFieldName = "乗り物"
#$baseFieldName = "おやつ"
# 作成する参照列の内部列名
$makeFieldInternalName = "relVehicle"
#$makeFieldInternalName = "relSnack"
# 作成する参照列の列名
$makeFieldDisplayName = "乗り物"
#$makeFieldDisplayName = "おやつ"
# マスタリストの名前
$mstListName = "乗り物マスタ"
#$mstListName = "おやつマスタ"
## サーバーから値の取得
# 列を追加するリスト
$baseList = $ctx.Web.Lists.GetByTitle($baseListName)
# 参照列化する列
$baseField = $baseList.Fields.GetByInternalNameOrTitle($baseFieldName)
# マスタリスト
$mstList = $ctx.Web.Lists.GetByTitle($mstListName)
# 値のロード予約
$ctx.Load($baseList)
$ctx.Load($baseField)
$ctx.Load($mstList)
$ctx.ExecuteQuery()
## 参照列の定義生成
# 参照列の XML フォーマット
$fieldXmlFormat = @"
<Field Type='{0}' DisplayName='{1}' StaticName='{2}' Name='{2}'
List='{3}'
Mult='{4}'
Required='FALSE' EnforceUniqueValues='FALSE'
ShowField='Title' UnlimitedLengthInDocumentLibrary='FALSE'
RelationshipDeleteBehavior='None'
/>
"@
switch ($baseField.TypeAsString.ToUpper()) {
'CHOICE' {
$fieldXml = ($fieldXmlFormat -f 'Lookup', $makeFieldDisplayName, $makeFieldInternalName, $mstList.Id, 'FALSE')
}
'MULTICHOICE' {
$fieldXml = ($fieldXmlFormat -f 'LookupMulti', $makeFieldDisplayName, $makeFieldInternalName, $mstList.Id, 'TRUE')
}
default {
# 参照列化する予定のフィールドが選択肢列でない時は処理を停止
Write-Host ("{0} is not 'Choice' or 'MultiChoice'" -f $baseFieldName)
exit
}
}
# 参照列の追加
$result = $baseList.Fields.AddFieldAsXml($fieldXml, $true, ([Microsoft.SharePoint.Client.AddFieldOptions]::AddFieldToDefaultView -bor [Microsoft.SharePoint.Client.AddFieldOptions]::AddFieldInternalNameHint))
$result.Title = $makeFieldDisplayName
$result.Update()
$ctx.ExecuteQuery()
# コンテキスト の破棄
$ctx.Dispose()
手順的には、この辺りを注意して参照列を作りました
-
列定義 XML を作成
既存の選択肢列を取得し、複数選択が許可されていたら Type を LookupMulti にして、 Mult を TRUE にする -
参照列の追加
内部列名を強制するように、AddFieldInternalNameHint を付ける
つぎはデーターの移行だなー
楽しみだなー
ディスカッション
コメント一覧
まだ、コメントがありません