У меня есть следующая функция, заимствованная у этого модуля Тао Янгом.
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
.
Что делать?