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

Felder in einem Formular mit PnP und PowerShell verstecken [O365] zeige ich wie dieses Vorhaben einfach realisiert wird.

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

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.

Watn 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 um damit weniger Zeilen Code zu schreiben und auch mal einfache Befehle direkt in der PowerShell abzusetzen - ohne jetzt ein ps script zu schreiben.

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

$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 CSOM, gute Kombi!
$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()
PowerShell mit PnP, die bessere Kombi

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 - es können natürlich auch mehrere Eigenschaften mit dem gleichen Befehl gesetzt werden.

$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"}
Noch besser mit Set-PnPField

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 [O365] 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
Das HideFieldInList.ps1 Script

Done! Wie verwende ich nun dieses Script?

Wir brauchen nun eine PowerShell Instan. 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.

C:\temp\pfad\zum\script>./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 Disp-Form noch sichtbar sein soll.

C:\temp\pfad\zum\script>./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, ausser das jegliche Benutzung auf Eigenverantwortung und eigene Gefahr erfolgt. Viel Spaß damit :)