SharePoint에서 참조 열의 대상 목록을 변경하고 싶습니다.

4791 단어 SharePointPowerShell
블로그에서 전재

목록을 템플릿화한 것을 다른 사이트에 배포했습니다. 그러나 참조 열을 포함하는 것을 잊었고 참조 열을 선택할 수 없습니다.

GUI에서 참조 소스 목록을 변환 할 수 없기 때문에 열의 SchemaXml을 바라 보면 변경할 수 있다고 생각했습니다. (SchemaXml을 보는 방법은 여기)

참조 열의 SchemaXml 확인



시험에 리스트를 만들어, 다른 리스트의 「작성 일시」를 이용해 참조열 작성해 보았습니다.


그 SchemaXml이 여기에 있습니다.
<Field
    Type="Lookup"
    DisplayName="参照(日付と時刻)"
    Required="FALSE"
    EnforceUniqueValues="FALSE"
    List="{f5bb4f52-e0a7-4c25-abab-a3d261fde470}"
    ShowField="Created"
    UnlimitedLengthInDocumentLibrary="FALSE"
    RelationshipDeleteBehavior="None"
    ID="{55843724-0221-4ae3-ad18-414edd209754}"
    SourceID="{aca9e366-bd2b-4060-bd63-342e18395df7}"
    StaticName="testLookupDatetime"
    Name="testLookupDatetime"
    ColName="int3"
    RowOrdinal="0"
    Version="2"
    Group="" />

이 안에 36 문자의 영숫자와 하이픈으로 생긴 캐릭터 라인을 {} 로 둘러싸고 있는 GUID 가 3 개 있습니다.
  • List="{f5bb4f52-e0a7-4c25-abab-a3d261fde470}"
    참조 목록 목록 ID
  • ID="{55843724-0221-4ae3-ad18-414edd209754}"
    열 특정 ID
  • SourceID="{aca9e366-bd2b-4060-bd63-342e18395df7}"
    이 열이있는 목록의 목록 ID

  • 참조하는 열의 내부 이름 라고 생각해 보았습니다.

    SchemaXml의 List 특성을 PowerShell로 다시 작성



    아래와 같이 가정하여 샘플 코드를 올립니다.
  • 사용자
    미야미야@에에mpぇ. 이 m
  • SharePoint Online URL
    https://.sharepoint.com/sites/example
  • 참조열이 있는 리스트명
    참조 열이 있습니다. 목록
  • 참조 열의 내부 이름 또는 열 이름
    LookupDate
  • 참조원의 리스트명
    나를보고 목록
  • [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client") | Out-Null
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.Runtime") | Out-Null
    
    # 取得する 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($url)
    $ctx.Credentials = $credentials
    

    여기까지는 평소의 엉망인 코드.
    로그인하여 SharePoint Client Context의 인스턴스를 만드는 중입니다.

    여기서부터 본명의 코드.
    # 更新リスト名
    $targetListName   = '参照列持ってるぜリスト';
    # 更新列
    $targetFields     = @('LookupDate');
    # 新参照先リスト名
    $toLookupListName = '私を見てリスト'
    
    # 新参照先リスト ID 取得
    $toList = $ctx.Web.Lists.GetByTitle($toLookupListName)
    $ctx.Load($toList)
    
    # 更新列の読み込み予約
    $fieldsContainer = @()
    foreach($fieldName in $targetFields) {
        $field = $ctx.Web.Lists.GetByTitle($targetListName).Fields.GetByInternalNameOrTitle($fieldName)
        $ctx.Load($field)
        $fieldsContainer += $field
    }
    
    # 読み込み実行
    $ctx.ExecuteQuery()
    
    # 参照先リストの書き換え
    foreach($field in $fieldsContainer) {
        # SchemaXml の List 属性の値を、新参照先リストのリスト ID に書き換え
        $field.SchemaXml = $field.SchemaXml -replace 'List="(.*?)"', ('List="{'+ $toList.Id + '}"')
    }
    
    # 書き換え実行
    $ctx.ExecuteQuery()
    

    실제로는 좀 깨끗한 스크립트로 하고 있습니다만( 변명)

    고찰



    일단 수중에서는 움직이고 있습니다만, 이것으로 좋은 것인가? 라는 의문과 어지럽히면 되돌릴 수 없게 될 것 같으므로, 참고로하는 기특한 분이 있으면 백업을 취해 자기 책임으로 부탁합니다
    _(:3」∠)_

    좋은 웹페이지 즐겨찾기