Kategorien-Archiv Allgemein

Flow/PowerAutomate: Prüfen, ob ein String leer ist

Klingt einfach, muss aber über eine Formel umgesetzt werden.

PowerApps: Attachments als Pflichtfeld

Leider prüft Microsoft PowerApps bei Attachments zu SharePoint-ListItems nicht, ob dieses als Pflichtfeld behandelt werden soll oder nicht. Es gibt schlicht keine Möglichkeit in SharePoint, dieses irgendwo zu konfigurieren.

Hier hilft eine einfache PowerApps Formel, zum Beispiel beim „OnSelect“-Event, wenn man auf einen Button klickt. Über eine IF-Abfrage kann man so steuern, ob der Eintrag submitted werden soll oder nicht:

If(CountRows(YourAttachmentsControl.Attachments) = 0, Notify("Please provide the required files!"), SubmitForm(yourForm))

PowerApps: SharePoint-Werte auf „null“ zurücksetzen (Date, User etc.)

Die Anforderung kommt häufig vor, das Problem ist seit Jahren bekannt – eine „richtige“ Lösung gibt es dafür bisher noch nicht.

Hat man in einer SharePoint-Liste zum Beispiel eine Spalte vom Typ „Datum“ (Approval Date etc.), und möchte dieses in einer PowerApp zurück auf null setzen, ist dies schwieriger als gedacht.

Voraussetzung ist natürlich erst einmal, das die Eigenschaft „isEditable“ des DatePicker-Controls auf „true“ gesetzt ist.

Dann muss noch die Eigenschaft „InputTextPlaceholder“ geleert werden, hier sollte nichts drin stehen.

Ist aber einmal ein Datumswert in PowerApps gesetzt und in dem SharePoint-Listeneintrag gespeichert worden, bekommt man dieses zumindest in der PowerApp nicht mehr heraus. Ein Löschen in SharePoint funktioniert, aber oftmals möchte man den Wert ja auch über die PowerApp zurücksetzen bzw. löschen können.

Die Lösung dazu ist recht simpel – die Auswirkungen allerdings undurchsichtig. Nach langer Recherche bin ich darauf gekommen, das die Lösung das Aktivieren eines „Experimental Features“ in der PowerApp ist, und zwar der Funktion „Formula-level error management“.

… zu finden unter „File > Settings > Advanced Settings“

Wird dieses Feature aktiviert, werden anscheinend Null-Werte beim Speichern von Einträgen (SubmitForm, Patch etc.) unterstützt, ansonsten nicht.

PowerApps: „Fill-in“ Möglichkeit bei Dropdowns

In SharePoint gibt es die Möglichkeit, Auswahllisten (Dropdowns) mit der Option „Fill in“ zu erstellen. Dadurch kann der Benutzer eigene Werte eintragen, wenn der von ihm gewünschte Wert nicht in der Auswahl erscheint.

Beim Erstellen von neuen Einträgen in SharePoint kann der Benutzer nun eigene Werte eingeben, sofern er den passenden nicht in der Auswahl findet:

Leider wird diese Funktionalität von Haus aus in PowerApps nicht unterstützt, d.h. man muss ein bisschen konfigurieren:

Dazu muss die Eigenschaft „Update“ von der DataCard, in der sich die Dropdown befindet, angepasst werden:

If(
    IsBlank(DataCardValue5.Selected),
    {
        '@odata.type': "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedReference",
        Id: 0,
        Value: DataCardValue5.SearchText
    },
    DataCardValue5.Selected
)

„DataCardValue5“ ist dabei natürlich der Name unserer DataCard, in dem sich das DropDown-Control befindet.

Dieser Code prüft, ob eine Auswahl aus der Dropdown getroffen wurde, ansonsten wird ein neuer Eintrag auf Basis des „SearchText“ erstellt, und über den „Update„-Event beim Speichern der Form in das SharePoint-Listenelement eingetragen. Da es sich um ein Dropdown-Element handelt, muss hier der ODATA-Typ „SPListExpandedReference“ verwendet werden, mit den beiden bekannten Attributen „Id“ und „Value„.

PowerApps bietet dann beim nächsten Mal auch den neu hinzugefügten Wert in der Dropdown an, sodass dieser nicht erneut eingegeben werden muss.

Sortieren der Auswahl-Liste

Möchte man die Auswahl-Liste noch sortiert haben, muss man die „Items„-Eigenschaft der Dropdown mit der Funktion „SortByColumns“ erweitern:

Prototyping List 2“ ist hierbei unsere SharePoint-Liste, „System2“ der Name der Spalte vom Typ „Choice“ (Dropdown). „Value“ ist die Eigenschaft, nach der sortiert werden soll, diese sollte nicht geändert werden.

Danach werden die Einträge alphabetisch sortiert:

Power Automate: Dynamischer Empfänger beim Email-Versand per Outlook

Wenn man in Power Automate (ehemals Microsoft Flow) Emails mit SharePoint List Item Attachments verschicken möchte, verwendet man in der Regel den „Send an email“ Outlook Connector. Dieser bietet über ein kleines Icon die Möglichkeit, den „Attachment“-Bereich umzustellen, sodass man diese über ein vorher befülltes Array referenzieren kann.

Leider wird in der Standard-Ansicht der Aktion im „To“-Bereich keine Möglichkeit gegeben, dynamischen Inhalt einzusetzen, zum Beispiel die Email eines Personen-Felds aus der SharePoint-Liste.

In der Standard-Ansicht kann man keinen dynamischen Empfänger einfügen…

Dies geht jedoch, in dem man in den „Advanced“-Modus wechselt:

Dazu klickt man erst oben rechts in der Aktion auf die beiden Pfeile. Nun hat man schon mal die Möglichkeit, dynamischen Inhalt einzufügen. Möchte man alle verfügbaren Felder aus dem SharePoint List Item sehen, klickt man rechts auf das „See more“. Danach stehen einem alle Felder zur Verfügung.

Power Apps: Personen-Auswahl aus Dropdown-Liste befüllen

Bei der Konzeption von Formularen mit Power Apps ist eine der Anforderungen sehr häufig, das man zum Beispiel einen Antrag einer verantwortlichen Person zuweisen kann. Leider muss der Benutzer dazu bei der normalen Personen-Auswahl immer erst ein paar Buchstaben eingeben, um dann die gewünschte Person angezeigt zu bekommen.

Abbildung 1: So sieht die Standard-Auswahl für Personen-Lookups aus

Anwenderfreundlicher ist die direkte Auswahl aus einer Dropdown – insbesondere, wenn der Kreis der Personen relativ klein ist (5-30 Personen zum Beispiel). Bei noch kleineren Gruppen wäre auch die Darstellung über Icons oder Benutzer-Fotos denkbar – die technische Umsetzung aber genau gleich wie bei einer Dropdown.

Abbildung 2: So sähe eine einfache Dropdown aus

In unserem Beispiel wollen wir die zur Auswahl möglichen Personen in einer separaten SharePoint-Liste verwalten. Dies hat den Vorteil, das noch weitere Meta-Informationen mit gepflegt werden können.

Ich habe dazu der Einfachheit halber in SharePoint eine Custom-List mit dem Namen „Project Users“ angelegt und eine Spalte namens „User“ hinzugefügt, welche vom Typ „Person or Group“ ist. In das Titel-Feld schreibe ich den Benutzernamen, wie er in der Dropdown-Liste erscheinen soll, in der Spalte „User“ wähle ich den entsprechenden SharePoint-Benutzer aus, welcher in der Power App in die Lookup-Dropdown automatisch übernommen werden soll.

In Power Apps binden wir das Edit-Formular an eine andere SharePoint-Liste (unsere „Master-Liste“), welche das eigentliche People-Lookup enthält (hier: „PersonToInform“), und fügen eine „Custom card“ hinzu…

… und fügen in diese Custom Card ein Dropdown-Control ein und binden diese an unsere Custom-List „Project Users“:

Damit nun bei Auswahl eines Benutzers in der einfachen Dropdown der User in dem eigentlichen People Lookup automatisch eingetragen wird, müssen wir noch die folgenden Schritte durchführen:

Im „OnChange“ Event der einfachen Dropdown führen wir ein „UpdateContext“ aus, um den ausgewählten Benutzer aus der einfachen Dropdown in den aktuellen Kontext zu setzen (hier in die Variabel „oSelectedPerson“):

Das „People Picker“ Dropdown benötigt mindestens die Attribute „Claims“ und „DisplayName“, um den Benutzer korrekt zuweisen zu können.

Wichtig ist hierbei, das „User“ der Spaltenname aus der SharePoint-Liste mit den möglichen Benutzern ist. Dieser muss unter Umständen angepasst werden, wenn Sie einen anderen Namen für die Spalte verwenden.

Als letztes muss noch der „Default“-Wert für das „People Picker“ Dropdown gesetzt werden, um den ausgewählten Benutzer aus dem Kontext zu übernehmen (dazu muss das Control entsperrt werden). Wichtig ist dabei die Prüfung, ob die Context Variable leer ist oder nicht:

Die Bezeichnung „.PersonToInform“ ist hierbei der Spaltenname in der SharePoint-Liste, welches die „People Picker“ Spalte enthält und mit den Werten aus der Dropdown befüllt werden soll.

Damit nach dem Speichern des Eintrags in SharePoint der ausgewählte User in der People Dropdown im Power Apps Formular wieder zurückgesetzt wird, kann in dem „OnSelect“ Event auf einem Button der folgende Code ausgeführt werden, um den Context wieder auf null zu setzen (durch die Funktion „Blank()“):

Grundsätzlich kann man die Informationen aber natürlich auch über PATCH an die SharePoint-Liste übertragen.

Zum Schluß setzt man das „People Picker“ Dropdown auf hidden, damit es nicht doppelt erscheint. Zu Debugging-Zwecken kann man es aber am während der Entwicklung natürlich auch noch sichtbar lassen, um die Funktionsweise zu überprüfen.

Microsoft Flow: Email bei neuem oder geändertem SharePoint Item mit Attachments versenden

In SharePoint ist es sehr einfach, eine oder mehrere Dateien an einen Listeneintrag anzuhängen. Etwas komplizierter ist es, diese in Microsoft Flow bzw. Power Automate zu verarbeiten und zum Beispiel an eine Benachrichtigungs-Email für das neue oder geänderte List Item anzuhängen.

Um dies zu realisieren, müssen verschiedene Aktionen durchgeführt werden:

  • Holen der Attachments
  • Für jedes Attachment den eigentlichen Inhalten abfragen
  • Den Inhalt für jedes Attachment an eine Variable auf Basis eines Arrays anhängen
  • Die Email generieren und das Array anhängen
Ablauf des Flows zum Anhängen von Attachments an eine Email

1. Trigger: When an item is created or modified

Hier verbinden wir uns mit der SharePoint-Site und -Liste, für die wir den Flow aktivieren wollen:

2. Delay

Aus Erfahrung hat sich gezeigt, das gerade bei größeren und mehreren Attachments eine kurze Verzögerung von zum Beispiel einer Minute sinnvoll sein kann:

3. Get Attachments

Als nächstes müssen wir uns die Meta-Daten der Attachments für das zu verarbeitende List Item aus SharePoint heran holen:

Die ID ist dabei die des SharePoint List Items.

4. Initialize Variable

Nun müssen wir eine Variable vom Typ „Array“ initialisieren. Dieses Array wird dann für jedes Attachment einen Eintrag enthalten. Das Array kann dann in der Email ausgelesen bzw. verwendet werden:

5. Apply to each

Jetzt durchlaufen wir für jedes Attachment eine Schleife und holen uns die Details zu dem Attachment. Diese werden alle in der BODY-Variable aus der „Get Attachments“-Aktion geliefert:

In das Attribut „ContentBytes“ setzen wir die folgende Formel:

 body('Get_attachment_content').$content 

Der vollständige Code für diese Aktion sieht folgendermaßen an:

{    "inputs": {
        "name": "varAttachments",
        "value": {
            "Name": "@{items('Apply_to_each')?['DisplayName']}",
            "ContentBytes": "@{body('Get_attachment_content').$content}"              
        }
    }
}

6. Email versenden

Zum Schluß versenden wir die Email. Hier ist zum einen die richtige Aktion wichtig (V3 geht nicht), und das bei den Attachments rechts das kleine Icon geklickt wird, sodass die Attachments gruppiert werden. In das Textfeld schreiben wir dann den Namen unserer Array-Variable hinein:

Wenn wir nun an ein List Item aus der SharePoint-Liste Attachments anhängen, erhalten wir wie geplant eine Email mit den Attachments im Anhang:

Power Apps: Deep Linking

Einer der häufigsten Anwendungsfälle bei Power Apps ist es, dem Benutzer verschiedene Links (z.B. über Email-Benachrichtigungen oder in Websites) zu unterschiedlichen Screens bzw. Ansichten der App zu ermöglichen. Dies geht über sogenanntes „Deep Linking“, also der Steuerung des ersten sichtbaren Screens über URL-Parameter.

Standardmäßig wird in einer Power App immer der erste, oberste Screen angezeigt, sobald sich die Anwendung im Browser öffnet. Die Reihenfolge kann man ganz einfach per drag&drop ändern.

Möchte man aber zum Beispiel per Microsoft Flow/Power Automate eine Email zu einem speziellen Formular auf einem anderen Screen verschicken, kann man dies über einen URL-Parameter realisieren.

Beim Starten der Power App wird als Erstes das „App“-Modul ausgeführt. Hier gibt es den Event „OnStart“. Möchte man nun einen URL-Parameter abfragen, geht das über die Methode „Param()“. In dem folgenden Beispiel fragen wir den URL-Parameter „DeepLink“ ab, und öffnen den entsprechenden Screen:

Öffnet man nun die Power App über die URL, erscheint standardmäßig der erste Screen (hier „Welcome“).

Fügt man der URL jedoch einen Parameter mit einem entsprechenden Wert an, zum Beispiel „&DeepLink=Task“, öffnet sich auf Basis der Abfrage im „OnStart“ Event direkt der passende Screen. (Die Funktion „NewForm()“ in diesem Beispiel stellt die Ansicht des Formulars auf einen neuen Eintrag um).

Bearbeiten eines SharePoint Eintrags per URL

Um einen Eintrag in einer SharePoint Liste direkt in Power Apps Formularen zu öffnen, kann man die gleiche Vorgehensweise anwenden. Hierzu übergeben wir die ID des Listeneintrags ebenfalls per URL-Parameter.

In dem „OnVisible“-Event des entsprechenden Screens, auf dem sich das dazu passende Formular befindet, fügen wir den folgenden Code hinzu:

if(!IsBlank(Param("ID")), EditForm(Form2))

Wobei „Form2“ der Name des Formulars ist, in welchem der SharePoint-Eintrag bearbeitet werden soll.

Mit diesem Code setzen wir den Anzeigemodus unseres Formulars auf „Bearbeiten“, sofern die URL einen Parameter namens „ID“ enthält.

Nun müssen wir noch in der „Item“-Eigenschaft des Formulars den entsprechenden Eintrag aus der SharePoint-Liste referenzieren. Dies geht über die „LookUp“-Methode, welcher wir den Wert aus unserem URL-Parameter übergeben. Da die Spalte „ID“ unserer Liste „Tasks“ ein Integer ist, müssen wir das „Param(„ID“)“ noch mit der Funktion „Value()“ konvertieren, da URL-Parameter immer als String interpretiert werden.

Rufen wir nun unsere App im Browser auf und fügen der URL einen Parameter ID=1 hinzu, öffnet sich direkt der dazu passende Listeneintrag aus SharePoint:

Power Automate: SharePoint Felder „case-insensitiv“ prüfen

Möchte man in Power Automate (ehemals Microsoft Flow) bei SharePoint List Items prüfen, ob der Wert einer Spalte einen speziellen Text enthält, ist dies standardmäßig Case-sensitiv.

Um dies unabhängig von der Groß-/Kleinschreibung zu prüfen (case-insensitiv), kann man mit einer Expression in der Condition arbeiten.

Der Wert (links) entspricht dabei der Formel/Expression:

toLower(triggerBody()?['Title'])

wobei im hinteren Teil der Name der entsprechenden Spalte steht (in diesem Fall wird der Titel des List Items überprüft). Wichtig ist dann natürlich, den zu testenden String auch in Kleinschreibung zu formulieren.