15 | Dokumentenhandling mit der Power Platform Teil I

#MrPowerMagic hilft! 🔮

10.06.2021 | Alex und Ragnar Show | Folge 42

In diesem 15. Fall für #MrPowerMagic zeige ich Euch, wie Ihr in Euren dokumentenbasierten Workflows die Dokumente sehr einfach mit weiteren, beschreibenden Informationen (Metadaten) versehen könnt. Das können z.B. Rechnungs-Nr. oder Betrag, Zuordnung zu einem Projekt, etc. sein. Dabei werden wir möglichst viel in diesem Prozess automatisieren und die manuellen Vorgänge auf ein Minimum reduzieren. Zusätzlich wird aus den Informationen wie z.B. Fälligkeitsdatum direkt eine Plannerkarte erstellt und mit zusätzlichen Informationen versehen.

Status Quo

Wir alle haben nach wie vor fast täglich in unserem (Geschäfts-)leben in irgendeiner Form mit Dokumenten und den dazugehörigen Prozessen zu tun. Leider ist es bei uns in Deutschland noch nicht so verbreitet, z.B. bei Rechnungen die dazugehörigen Daten gleich ebenfalls digital mit zusenden, stattdessen werden wir im besten Fall eine digitalisierte Rechnung in Form eines PDFs erhalten. Dadurch sind jedoch die wirklich wichtigen Daten in dem PDF gekapselt und wir müssen diese (händisch) extrahieren, wie z.B. den Rechnungsbetrag, das Fälligkeitsdatum oder auch die Zuordnung zu einem Projekt oder Kunden. Dieser Aufwand ist sehr hoch und teuer.

Zielsetzung

Das wollen wir deutlich vereinfachen und automatisieren. So ist ein Ziel, eine vereinfachte Möglichkeit der Erfassung der notwendigen Daten aus den jeweiligen Dokumenten bzw. die Anreicherung des Dokuments mit zusätzlichen (Meta-) Daten. Dadurch wollen wir eine Reduktion der manuellen Schritte erreichen, da wir diese Daten zukünftig nur noch einmalig erfassen müssen und uns diese dann immer elektronisch zur Verfügung stehen. Dadurch können wir zukünftig auch den Informationsfluss besser gestalten, denn die Informationen sind jederzeit für jeden verfügbar.

Umsetzung

Da es sich hierbei ja um Dokumentenhandling handelt, wird natürlich eine Dokumentenbibliothek in SharePoint Online ein zentrale Rolle spielen. Wir werden diese Bibliothek mit zusätzlichen Spalten versehen, die die notwendigen Informationen (Metadaten) der Dokumente aufnehmen. Zusätzlich werden wir eine Microsoft Lists-Liste als Projektliste erstellen, da wir in diesem Fall jedes Dokument einem Projekt zuordnen wollen. Die Liste dient uns dazu als Auswahl der möglichen Projekte.

Weiterhin wird es eine Adaptive Card in Microsoft Teams geben, damit zum eine Benachrichtigung an den User erfolgt, dass ein neues Dokument vorliegt und zum anderen natürlich, um die gewünschten Informationen direkt in der Adaptive Card aufnehmen zu können. Ebenfalls legen wir automatisiert eine Planner-Karte an, damit z.B. ein fällige Rechnung rechtzeitig überwiesen wird.

Zu guter Letzt benötigen wir natürlich Power Automate, um die einzelnen Bausteine miteinander zu verknüpfen und zu automatisieren. Hierzu werden wir mehrere Flows in Power Automate anlegen.

Demo

Die Hilfsliste „Projekte“

Da wir in unserem Fall neben „klassischen“ Daten, wie z.B. Fälligkeit oder Rechnungsbetrag die erfassten Dokumente auch den jeweiligen Projekten zuordnen wollen, benötigen wir eine MS Lists-Liste.

Warum eine Liste – wir könnten die Projektinfos ja auch direkt als Text oder über ein Auswahlfeld erfassen?

Da die Anzahl und Aktivität der Projekte doch sehr dynamisch ist und wir eine konsistente Zuordnung haben wollen, eignet sich hierfür die zusätzliche Liste ideal. Ein Textfeld birgt das Risiko von Textfehlern / Zahlendrehern, das wäre beim späteren Filtern nach Dokumenten ärgerlich. Ebenso ist die Verwaltung eines Auswahlfeldes i.d.R. mit einem höheren Aufwand verbunden und nicht ganz so flexibel, zumal die Projektliste auch noch anderweitig eingesetzt werden kann bzw. als Basis für andere Listen und Dokumentenbibliotheken zur Verfügung stehen kann.

Die Projektliste

Die Liste selbst ist sehr einfach gehalten, es gibt lediglich zwei Spalten, einmal das Projekt selbst und die dazugehörige verantwortliche Person. Natürlich könnte diese Liste an andere Gegebenheiten sehr einfach angepasst werden, z.B. Budgetspalte, Status, Datumsangaben, etc. Wir verwenden die Projektspalte später als Nachschlagespalte in unserer Dokumentenbibliothek.

Die Dokumentenbibliothek

In unserem Fall handelt es sich bei der Dokumentenbibliothek um die Standardbibliothek des MS Teams Team, wobei hier natürlich auch jede andere Bibliothek aus jeder SharePoint-Site genutzt werden kann.

Die Dokumentenbibliothek in SharePoint

Ich habe die Dokumentenbibliothek um zusätzliche Spalten ergänzt, nämlich unsere Metadaten, die wir zusätzlich zu dem Dokument speichern und nutzen möchten. In meinem Fall sind das eine Zuordnung zu einem Projekt anhand einer Nachschlagespalte auf die Hilfsliste „Projekte“ (s.o.), eine Kategoriespalte (Auswahlliste) mit den Kategorien ER für Eingangsrechnung, LS für Lieferschein und LN für Leistungsnachweis. Zusätzlich noch ein Datumsfeld für die Fälligkeit, eine Währungsspalte für den Betrag sowie eine Textspalte für Bemerkungen.

Die Kategorien habe ich sehr einfach über die Spaltenformatierung noch ein wenig farblich aufgehübscht, damit auch ein einfaches, visuelles Unterscheidungsmerkmal gegeben ist. Dies ist im Standard auch recht einfach, Ihr könnt einfach die Spalte auswählen, den kleinen Pfeil rechts klicken, dann auf Spalteneinstellungen und Diese Spalte formatieren. Wie das Formatieren von Spalten grundlegend funktioniert, könnt Ihr in Kürze in einem weiteren Beitrag nachlesen.

Der Power Automate Flow

Die Flow-Schritte

Damit das Ganze auch funktioniert und unsere Zielsetzung erreicht wird, benötigen wir einen Power Automate Flow. Dieser startet automatisch, wenn ein neues Dokument in der Bibliothek (in einem bestimmten Kanal oder Ordner) erstellt wird (1). Dies kann händisch per Upload erfolgen oder programmatisch durch einen weiteren Power Automate Flow, der z.B. aus einem Rechnungseingangspostfach die Dokumente automatisch in der Bibliothek ablegt.

Im nächsten Schritt müssen wir zunächst einmal die Dateimetadaten des neuen Dokuments abrufen (2), um an die eindeutige ID des Dokuments zu kommen, denn diese benötigen wir, um die Dateieigenschaften abzurufen (3).

In den Schritten (4), (5) und (6) geht es darum, die Werte aus der dynamischen Projektliste zu ermitteln und in ein Array zu packen, damit dem neuen Dokument immer alle aktuellen Projekte zur Auswahl in Teams zur Verfügung stehen.

Nun wird der eigentliche Inhalt der Adaptive Card für Teams vorbereitet. Da es nach wie vor nicht so einfach ist, dynamische Inhalte an eine Adaptive Card in Teams zu übergeben, machen wir diesen Schritt (7) vorher und übergeben nur den Inhalt des gesamten Bausteins als Inhalt für die Adaptive Card. Den Code der Adaptive Card findet Ihr ganz am Ende des Beitrags. Wir Ihr im Code erkennen könnt, sind die Werte, die wir später auch weiterverarbeiten wollen – also die Werte, die wir aus Teams zurück erhalten – mit einer ID versehen – MyProject, MyKategorie, etc.

In Schritt (8) senden wir lediglich die Adaptive Card ab und warten auf eine Antwort. Solange es keine Antwort auf unsere Karte gibt, läuft die Instanz des Flows! Ebenfalls haben wir eine Aktualisierungsnachricht hinterlegt und den Punkt Karte aktualisieren auf „Ja“ festgelegt. Dadurch wird diese Aktualisierungsnachricht nach dem Absenden der Antworten in Teams angezeigt.

In Schritt (9) extrahieren wir aus dem JSON-Gewirr die Daten, die wir zur Weiterverarbeitung benötigen. Dies tun wir mit der Aktion „JSON analysieren“. Dadurch, dass die Antworten in Teams immer gleich aufgebaut sind, können wir uns ein Schema daraus erstellen und dadurch anschließend die Werte einzeln als dynamische Platzhalter verwenden, so dass wir im nächsten Schritt (10) die notwendigen Aktualisierungen des Dokuments mittels „Dateieigenschaften aktualisieren“ vornehmen können. Wir ergänzen die fünf Felder Projekt-ID, Kategorie, Bemerkungen, Fälligkeit und Betrag mit den jeweiligen Werten aus der analysierten Antwort der Adaptive Card.

Last but not least erstellen wir noch eine Planner-Karte in einem Planner-Board. Zunächst wird die Aufgabe mit den Basisangaben erstellt (11) – hier kommen auch wieder die farblichen Kategorien ins Spiel – und anschließend, wenn die Aufgabe erstellt wurde mittels „Aufgabendetails aktualisieren“ ergänzt (12), in unserem Fall um den Betrag, die Bemerkungen, den Link zum Dokument und einer festgelegten Checkliste. Um die Kategorien die richtige Farbe zuzuordnen nutzen wir eine einfache boolesche Abfrage, bei Gelb z.B. sinngemäß – Ja, wenn die Kategorie LN ist, hier die Formel:

equals(body('JSON_analysieren')?['data']?['myKategorie'],'LN')

Damit ist die Erfassung zusätzlicher Metadaten eines Dokuments abgeschlossen. Hier könnt Ihr Euch die einzelnen Schritte des Flows noch einmal anzeigen lassen:

Hier könnt Ihr Euch den Fall nochmal anschauen:

Assets

Hier findet Ihr den gesamten Code für die Adaptive Card in MS Teams

{
  "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
  "type": "AdaptiveCard",
  "version": "1.2",
  "body": [
    {
      "type": "TextBlock",
      "text": "Eine neue Datei wurde abgelegt",
      "weight": "Bolder",
      "size": "Large",
      "color": "Attention"
    },
    {
      "type": "TextBlock",
      "text": "Wir benötigen noch ein paar Details, um die Datei als vollständig zu markieren.",
      "isSubtle": true,
      "wrap": true
    },
    {
      "facts": [
        {
          "title": "Dateiame:",
          "value": "@{outputs('Dateieigenschaften_abrufen')?['body/{Name}']}"
        }
      ],
      "type": "FactSet"
    },
    {
      "text": "Du kannst Dir die Datei hier aufrufen",
      "type": "TextBlock"
    },
    {
      "type": "ActionSet",
      "actions": [
        {
          "title": "Datei öffnen",
          "type": "Action.OpenUrl",
          "url": "@{outputs('Dateieigenschaften_abrufen')?['body/{Link}']}"
        }
      ]
    },
    {
      "text": "Projekt",
      "type": "TextBlock"
    },
    {
      "choices": @{variables('var_Projekte')},
      "placeholder": "bitte Projekt auswählen",
      "type": "Input.ChoiceSet",
      "id": "myProject"
    },
    {
      "type": "TextBlock",
      "text": "Kategorie",
      "wrap": true
    },
    {
      "choices": [
        {
          "title": "ER",
          "value": "ER"
        },
        {
          "title": "LS",
          "value": "LS"
        },
        {
          "title": "LN",
          "value": "LN"
        }
      ],
      "placeholder": "bitte Kategorie auswählen",
      "type": "Input.ChoiceSet",
      "id": "myKategorie"
    },
    {
      "type": "TextBlock",
      "text": "Bemerkungen",
      "wrap": true
    },
    {
      "type": "Input.Text",
      "id": "myBemerkung",
      "placeholder": "gibt es Besonderheiten?",
      "spacing": "None",
      "isMultiline": true,
      "maxLength": 3000
    },
    {
      "type": "TextBlock",
      "text": "Fälligkeit"
    },
    {
      "type": "Input.Date",
      "id": "myFaelligkeit"
    },
    {
      "text": "Betrag",
      "type": "TextBlock"
    },
    {
      "placeholder": "Betrag",
      "type": "Input.Number",
      "id": "myBetrag"
    }
  ],
  "actions": [
    {
      "type": "Action.Submit",
      "title": "Absenden"
    }
  ]
}