Felder in einem SharePoint Formular mit PnP und PowerShell verstecken [O365]

calendar_month 5. Oktober 2019 14 Wörter

Ich habe mich entschlossen, meine kleinen Snippets und Skripte, die ich so erstelle, nicht mehr nur in meinem OneDrive zu pflegen… sondern hier zu veröffentlichen. Felder in einem SharePoint-Formular mit PnP und PowerShell verstecken ist somit der erste Artikel mit so einem Inhalt.

Das Problem

Im SchemaXml von einem Feld kann die Sichtbarkeit innerhalb der Formulare mit ShowInDisplayForm, ShowInNewForm und ShowInEditForm gesteuert werden. An der Oberfläche hat man nur die Möglichkeit, das Feld im Inhaltstypen zu verstecken. Ein dediziertes Ein- bzw. Ausblenden ist somit nicht möglich.

Der gewiefte SharePoint PowerUser hatte früher die Möglichkeit, dieses Vorhaben über den SharePoint Manager zu realisieren. Für SharePoint Online existiert zwar ein SharePoint Online Client Browser, dieser speichert aber keine Änderungen.

Womit wir bei unserem Problem wären. Nun habe ich als alter SharePoint-Entwickler mehrere Möglichkeiten. Ich könnte eine Konsolenanwendung (.NET), eine UWP-Anwendung oder ein PowerShell-Script mit CSOM schreiben. Letzteres lässt sich schneller runterschreiben, testen und ausführen – aber CSOM in PowerShell macht nicht so wirklich Spaß.

PnP und PowerShell

Die PnP PowerShell Commands für SharePoint gibt es ja nicht erst seit gestern. Die PnP PS Befehle stellen einen Wrapper um das CSOM dar, damit weniger Zeilen Code geschrieben werden müssen.

Reines CSOM:

$context = New-Object Microsoft.SharePoint.Client.ClientContext($siteUrl)
$context.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($user, (ConvertTo-SecureString $pass -AsPlainText -Force))
$list = $context.Web.Lists.GetByTitle($listTitle)
$field = $list.Fields.GetByTitle($fieldTitle)
$field.Description = "Das ist mein Feld"
$field.UpdateAndPushChanges($true)
$context.Load($field)
$context.ExecuteQuery()

Mit PnP:

Connect-PnPOnline -Url $siteUrl
$field = Get-PnPField -List $listTitle -Identity $fieldName
$field.Description = "Das ist mein Feld"
$field.UpdateAndPushChanges($true)
$field.Context.ExecuteQuery()

Noch kürzer mit Set-PnPField:

Connect-PnPOnline -Url $siteUrl
Set-PnPField -List $listTitle -Identity $fieldName -Values @{Description="Das ist mein Feld"}

Felder verstecken

Hier das komplette Script HideFieldInList.ps1:

Param(
    [parameter(Mandatory=$true)][alias("url")]$siteUrl,
    [parameter(Mandatory=$true)][alias("list")]$listTitle,
    [parameter(Mandatory=$true)][alias("field")]$fieldName,
    [alias("display")]$hideInDisplayForm=$true,
    [alias("new")]$hideInNewForm=$true,
    [alias("edit")]$hideInEditForm=$true
)

Connect-PnPOnline -Url $siteUrl -Credentials (Get-Credential)

$field = Get-PnPField -List $listTitle -Identity $fieldName

if($field.Sealed){ throw 'field is sealed' }
if($field.Hidden){ throw 'field is hidden' }

$field.SetShowInDisplayForm(!$hideInDisplayForm)
$field.SetShowInNewForm(!$hideInNewForm)
$field.SetShowInEditForm(!$hideInEditForm)

try{
    $field.UpdateAndPushChanges($true)
    $field.Context.ExecuteQuery()
} catch {
    throw "error while applying changes for field: $field ... $($_.Exception.Message)"
}
Write-Host "field updated" $field

Verwendung

Alle drei Formulare verstecken:

./HideFieldInList.ps1 -url https://contoso.sharepoint.com/sites/Beispiel -list "Meine Liste" -field MeinFeld

Nur in Edit- und New-Form verstecken:

./HideFieldInList.ps1 -url https://contoso.sharepoint.com/sites/Beispiel -list "Meine Liste" -field MeinFeld -display $false

Jegliche Benutzung erfolgt auf Eigenverantwortung und eigene Gefahr. Viel Spaß damit :)