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

calendar_month 1. März 2020 22 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.

Was’n dat Problem?

Naja, Problem ist folgendes: In dem SchemaXml von einem Feld kann die Sichtbarkeit innerhalb der Formulare mit den ShowInDisplayForm, ShowInNewForm und ShowInEditForm gesteuert werden. An der Oberfläche hat man nur die Möglichkeit, das Feld im Inhaltstypen zu verstecken. Ein dediziertes Aus- bzw. Einblenden ist somit nicht möglich.

Der gewiefte SharePoint PowerUser – oder auch Admin – hatte früher die Möglichkeit, dieses Vorhaben über den SharePoint Manager zu realisieren. So etwas in der Form existiert zwar auch für SharePoint Online – ich meine damit den SharePoint Online Client Browser – speichert aber keine Änderungen.

Womit wir bei unserem Problem wären. Nun habe ich als alter SharePoint-Entwickler mehrere Möglichkeiten, mein Vorhaben zu realisieren. 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 (oder allgemein .NET) in PowerShell macht nicht so wirklich Spaß. Zudem muss ich viele Zeilen Code schreiben – es geht auch einfacher, und zwar mit PnP.

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, um damit weniger Zeilen Code zu schreiben und auch mal einfache Befehle direkt in der PowerShell abzusetzen.

Hier mal ein Beispiel mit reinem CSOM und das Pendant mit PnP. Die Beschreibung von „Mein Feld” soll programmatisch gesetzt werden:

PowerShell mit CSOM:

$user = "aytac@kirmizi.online"
$pass = "laangesPa$$w04t"
$siteUrl = "https://aytac.sharepoint.com/sites/Beispiel"
$listTitle = "Meine Liste"
$fieldTitle = "Mein Feld"

$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()

PowerShell mit PnP:

$siteUrl = "https://aytac.sharepoint.com/sites/Beispiel"
$listTitle = "Meine Liste"
$fieldName = "MeinFeld"

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

Sieht doch aufgeräumter aus beim zweiten Beispiel. Es geht sogar noch kürzer! Mit dem Set-PnPField-Befehl können wir direkt diese Eigenschaft setzen:

$siteUrl = "https://aytac.sharepoint.com/sites/Beispiel"
$listTitle = "Meine Liste"
$fieldName = "MeinFeld"

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

Toll! Kann ich gleich loslegen?

Damit die PnP-PowerShell-Commands verwendet werden können, müssen diese zuerst installiert werden. Wie man diese Erweiterungen installiert, kann hier nachgelesen werden. Die Installation rentiert sich, diese sollte nicht gescheut werden.

Zurück zum Thema: Felder mit PnP und PowerShell verstecken

In dem Artikel „Felder in einem SharePoint Formular mit PnP und PowerShell verstecken” gibt es eine klare Aufgabenstellung: Die Sichtbarkeit von Feldern soll einfach manipuliert werden können.

Nun verpacken wir das ganze in ein PowerShell-Script und nennen dieses Script HideFieldInList.ps1. Diese Datei ist leer, nun füllen wir diese Datei mit dem Inhalt aus dem folgenden Code-Block.

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 {
    $errorMessage = "error while applying changes for field: " + $field + "... " + $_.Exception.Message
    throw $errorMessage
}
Write-Host "field updated" $field

Done! Wie verwende ich nun dieses Script?

Wir brauchen nun eine PowerShell-Instanz. Entweder starten wir diese direkt über Windows und navigieren dann per cd in den Ordner, wo wir unser Script abgelegt haben, oder wir klicken in die Adresszeile von unserer Explorer-Instanz und tippen powershell ein und klicken auf Enter. Danach sollte sich eine PowerShell-Instanz im richtigen Pfad öffnen.

Die Ausführung ist nun recht simpel. Wir haben 3 Pflicht-Parameter url, list und field. Diese Parameter müssen wir beim Aufruf des Scripts mitgeben:

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

Versteckt das Feld in der Display-, New- und Edit-Form.

Ansonsten können wir über die optionalen Parameter noch die jeweilige Sichtbarkeit steuern. Angenommen, wenn das besagte Feld nur in der Edit-Form und New-Form versteckt werden soll, aber in der Display-Form noch sichtbar sein soll:

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

Versteckt das Feld in der New- und Edit-Form.

Mehr muss ich dazu vermutlich nicht sagen, außer das jegliche Benutzung auf Eigenverantwortung und eigene Gefahr erfolgt. Viel Spaß damit :)