Wie bereits auf der Seite "Nintex Workflow Delegation" beschrieben, können Aufgaben in SharePoint Online nicht einfach delegiert werden. Über den Workaround der dort beschrieben ist, kann man sich jedoch behelfen. Aus dem Umfeld entstand eine neue Anforderung, welche sich als recht umfassend erwiesen hat.
Wird eine Task delegiert, soll der neue Besitzer ebenfalls über eine E-Mail benachrichtigt werden. Der Inhalt der E-Mail soll identisch zu der ursprünglichen aufgebaut sein. Inhalt der Mail ist zum Beispiel das Datum, bis zu dem der Task abgeschlossen werden soll. Diese Information befindet sich in dem Task Element, nicht aber in dem Element des dazugehörigen Workflows (also dem eigentlichen Element des Antrags)
Üblicherweise kann man über den Workflow Kontext, etwa der Workflow Instanz ID auf die dazugehörigen Tasks zugreifen (per List Lookup). Da der Delegationsworkflow aber eine separate Instanz ohne Bezug zum noch laufenden Genehmigungsworkflow ist, kann er nicht auf die Tasks der Genehmigung zugreifen.
Eine Workflow Instanz kann folglich nicht auf die Tasks eines anderen Workflows zugreifen. Auch nicht, wenn beide das gleiche Listenelement bearbeiten.
Lösung
Die Frage ist also, wie kann man alle offenen Tasks ermitteln, die zu einem Listenelement (der Genehmigung) gehören?
Die Lösung gliedert sich in folgende Schritte:
- Auslesen aller offenen Tasks
- Ermitteln der zugehörigen Elemente zu den gefundenen Tasks (related items)
- Prüfen aller Tasks über die related-item-ID bis die korrekte gefunden wurde
- Auslesen der Task ID und Zugriff auf das Listenelement des Tasks
Zunächst wird mit einer "Query List" Action eine Collection aller offenen Tasks erstellt
Und die Spalten "Related Items" und "ID" ausgelesen. Beides wird in einer Collection gespeichert.
Über eine "For Each" Action werden nun alle gefundenen Tasks durchlaufen. Die Loop Schleife wird beendet, wenn die Variable "taskFound" auf true gesetzt wird.
In der Variablen "Output Value" sollte eigentlich der aktuell gefundenen Task enthalten sein. Dies hat aber nicht verlässlich funktioniert, so dass ich den Task mit einer "Get Item from Collection" Action selbst in der Collection bestimmt habe
Die Variable "currentTaskItem" enthält nun genau einen offenen Task. Über das Auswerten der RelatedItems-ID kann ermittelt werden, ob der Task zu dem gewünschten Listenelement (die Genehmigung) gehört.
Der Wert sieht etwa wie folgt aus:
{"Id":392,"RelatedItems":"[{\"ItemId\":137,\"WebId\":\"e1e3919b-d113-4a4a-93fd-31405ba6b235\",\"ListId\":\"19af1ed2-7a3e-4802-a388-af9e7fda84fe\"}]","ID":392} []
Im Beispiel ist entspricht der Wert 137 hinter ItemID der Listenelement-ID der Genehmigung
Dazu wird zunächst mit einer "Regular Expression" Action die TaskID ausgelesen
(?<=\[\{\\"ItemId\\":)(.*)(?=,\\"WebId\\")
Die Variable TaskIDFound enthält nun alle gefundenen Ausdrücke. Zur weiteren Verarbeitung muss der Wert aus der Collection entnommen und als Integer Wert gesichert werden. Dies geschieht über eine "Get Item from Collection" Action
Die gefundene ID (singleTaskParentID) wird nun mit der ID des gewünschten Elements geprüft. Sind die Werte identisch ist der zugehörige Task gefunden. Im vorliegenden Fall wird die Schleife nun verlassen, da es nur einen offenen Task geben kann. In anderen Szenarien ist es eventuell erforderlich, nach weiteren Tasks zu suchen.
Über eine "Run-IF" Action wird geprüft, ob die Ids identisch sind. Innerhalb der Action wird die Variable "taskFound" auf True gesetzt
Nachdem der Task gefunden wurde, kann auch auf die Daten des Tasks zugegriffen werden. Zunächst muss dazu die ID des Tasks bestimmt werden. Dazu wird wiederrum eine "Regular Expression" Action verwendet und auf dem vorherigen String angewendet.
{"Id":392,"RelatedItems":"[{\"ItemId\":137,\"WebId\":\"e1e3919b-d113-4a4a-93fd-31405ba6b235\",\"ListId\":\"19af1ed2-7a3e-4802-a388-af9e7fda84fe\"}]","ID":392} []
(?<=\[\{\\"ItemId\\":.*\\"\}\]\".\"ID\":)(.*)(?=\})
Da auch hier wieder eine Collection mit den gefundenen Elementen erstellt wird, muss wieder die Task Id als einzelner Integer Wert bestimmt werden. Dies geschieht wieder über eine "Get Item from Collection" Action
Die Variable "singleTaskID" enthält nun endlich die ID des zugehörigen Tasks und nun kann mittels List-Lookup darauf zugegriffen werden.
Abschließend der gesamte Prozess in der Übersicht: