Обновление поля поиска в списке SharePoint с помощью PowerShell не работает должным образом - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть следующая функция, заимствованная у этого модуля Тао Янгом.

Function Add-SPListItem
{
  [OutputType('System.Int32')]
  [CmdletBinding()]
  Param(
    [Parameter(ParameterSetName = 'SMAConnection',Mandatory = $true,HelpMessage = 'Please specify the SMA / Azure Autoamtion connection object')][Object]$SPConnection,
    [Parameter(ParameterSetName = 'IndividualParameter',Mandatory = $true,HelpMessage = 'Please specify the request URL')][String]$SiteUrl,
    [Parameter(Mandatory = $true,HelpMessage = 'Please specify the name of the list')][String]$ListName,
    [Parameter(ParameterSetName = 'IndividualParameter',Mandatory = $true,HelpMessage = 'Please specify the user credential to connect to the SharePoint or SharePoint Online site')][Alias('cred')]
    [System.Management.Automation.PSCredential]
    [System.Management.Automation.CredentialAttribute()]
    $Credential,
    [Parameter(ParameterSetName = 'IndividualParameter',Mandatory = $true,HelpMessage = 'Please specify if the site is a SharePoint Online site')][Alias('IsSPO')][boolean]$IsSharePointOnlineSite,
    [Parameter(Mandatory = $true,HelpMessage = 'Please specify the value of each list field in a hash table')][Object]$ListFieldsValues
  )

  If($SPConnection)
  {
    $SPcredential = New-SPCredential -SPConnection $SPConnection
    $SiteUrl = $SPConnection.SharePointSiteURL
  } else 
  {
    $SPcredential = New-SPCredential -Credential $Credential -IsSharePointOnlineSite $IsSharePointOnlineSite
  }

  #Bind to site collection
  $Context = New-Object -TypeName Microsoft.SharePoint.Client.ClientContext -ArgumentList ($SiteUrl)
  $Context.Credentials = $SPcredential

  #Retrieve list
  $List = $Context.Web.Lists.GetByTitle($ListName)
  $Context.Load($List)
  $Context.ExecuteQuery()

  #Adds an item to the list
  $ListItemInfo = New-Object -TypeName Microsoft.SharePoint.Client.ListItemCreationInformation
  $item = $List.AddItem($ListItemInfo)
  Foreach ($Field in $ListFieldsValues.Keys)
  {
    $item["$Field"] = $ListFieldsValues.$Field
  }
  $item.Update()
  $Context.ExecuteQuery()
}

Я пытаюсь использовать функцию для добавления элемента в список SharePoint с помощью значение поиска из другого списка. Это хорошо работает, когда я получаю значение поиска из другого элемента в том же списке и просто назначаю его новому элементу. Вот так:

$existingItem = Get-SPListItem -SiteUrl $siteURL -Credential $creds -IsSharePointOnlineSite $false -ListName $listToUpdate -ListItemId 480
$lookupField = $existingItem['serviceUcmdbID']
$newItemValues = @{Title='___test'; Objekttype='Test'; Objektnavn='Test'; 'serviceUcmdbID'=$lookupField}
Add-SPListItem -SiteUrl $siteURL -Credential $creds -IsSharePointOnlineSite $false -ListName $listToUpdate -ListFieldsValues $newItemValues

Но я так и не понял, как создать $lookupField, не получив его из существующего предмета. Например, это терпит неудачу:

$lookupField = New-Object Microsoft.SharePoint.Client.FieldLookupValue
$lookupField.LookupId = 300
$newItemValues = @{Title='___test'; Objekttype='Test'; Objektnavn='Test'; 'serviceUcmdbID'=$lookupField}
Add-SPListItem -SiteUrl $siteURL -Credential $creds -IsSharePointOnlineSite $false -ListName $listToUpdate -ListFieldsValues $newItemValues

... со следующим (частично норвежским) исключением:

Exception calling "ExecuteQuery" with "0" argument(s): "Ugyldige data er brukt til å oppdatere listeelementet. Feltet du forsøker å oppdatere, kan være skrivebeskyttet."
At D:\Daniel\_TopsImport\SharePointSDK\SharePointSDK.psm1:232 char:3
+   $Context.ExecuteQuery()
+   ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ServerException

Норвежская часть переводится в: «Неверные данные используются для обновления элемент списка. Поле, которое вы пытаетесь обновить, может быть доступно только для чтения ". Идентификатор 300 из приведенных выше примеров является идентификатором существующего элемента в списке ссылок.

Если я сравню $lookupField, полученный мной от другого элемента, и элемента, который я создал сам, они относятся к одному и тому же типу. , но они (неудивительно) отличаются тем, что у одного есть LookupValue, а у другого - нет. Но установить lookupValue вручную невозможно, так как 'LookupValue' is a ReadOnly property.

Что делать?

1 Ответ

0 голосов
/ 20 апреля 2020

Разобрался. Оказывается, вы можете просто назначить идентификатор напрямую, даже если поле ищет другое значение в справочной таблице, чем идентификатор.

$id = 300
$newItemValues = @{Title='___test'; Objekttype='Test'; Objektnavn='Test'; 'serviceUcmdbID'=$id}
Add-SPListItem -SiteUrl $siteURL -Credential $creds -IsSharePointOnlineSite $false -ListName $listToUpdate -ListFieldsValues $newItemValues
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...