Tämän viikon sorminäppäryysharjoituksena teemme flow’n, joka käy läpi ryhmähierarkian ja lähettää kaikille sen jäsenille viestin.

Ja sama selkosuomella. Meillä on seuraavanlainen organisaatiohierarkia.

  • Unit A
    • Department A
      • Team 1
      • Team 2
      • Team 3
    • Department B
      • Team 4
      • Team 5

Hierarkia on mallinnettu Entra ID:hen sisäkkäisinä ryhminä. Organisaatiotason jäsenet ovat aina vastaavan ryhmän jäsenenä. Minä olen luonnollisesti A-yksikön (unit) johtaja.

Nyt meidän tulisi lähettää flow’ta hyödyntäen viesti jokaiselle tämän organisaation jäsenelle.

Flow – Ryhmän jäsenet

Tehdään flow, joka saa parametrina ryhmän tunnisteen (groupid).

Tämän jälkeen haemme flow’ssa kaikki kyseisen ryhmän jäsenet (List group members).

Haun tuloksena saamme ryhmän jäsenenä olevat käyttäjät ja ryhmät.

Suodatetaan haun tulos näyttämään ainoastaan käyttäjät.

Filter Query = @equals(item()?['@odata.type'], '#microsoft.graph.user')

Nyt voimme lähettää kaikille ryhmän jäsenille viestin, esimerkiksi sähköpostin.

Suodatetaan ryhmän sisällöstä seuraavaksi pelkät ryhmät.

Filter Query = @equals(item()?['@odata.type'], '#microsoft.graph.group')

Flow – Ryhmän sisällä olevan ryhmän käsittely (rekursio)

Lähetämme sähköpostin nyt vain yhden ryhmän (Unit A) suorille jäsenille. Emme käyttäjille, jotka ovat ryhmän aliryhmissä. Kaiken kukkuraksi näitä aliryhmiä voi olla sisäkkäin vaikka miten monta tasoa.

Ratkaisu on kuitenkin yksinkertainen. Sitä kutsutaan rekursioksi (itse itseään kutsuva funktio). Olemme jo tehneet flow’n joka

  • Lähettää kaikille ryhmän jäsenille viestin
  • Listaa kaikki ryhmän sisällä olevat ryhmät

Nyt kutsumme jokaisen löytämämme ryhmän kohdalla tätä samaa flow’ta uudelleen! Uusi flow’n suoritus lähettää kyseisen ryhmän jäsenille viestin ja listaa sen sisällä olevat ryhmät. Ja kutsuu jälleen itseään.

Selkeää?

Käynnistetään jokaisen ryhmän kohdalla flow uudelleen (Run a Child Flow) käyttäen parametrina kyseisen ryhmän tunnistetta (GroupId). Jotta flow’ta voi käyttää aliflow’na (child flow), tulee siihen lisätä paluuarvon välittävä toiminto (Respond to a Power App or flow).

Samoin kaikki flow’n yhteydet tulee määritellä (Manage run-only permisissions) käyttämään kiinteää yhteyttä. Ei flow’n käynnistäjän yhteyttä.

Kaiken tämän tehtyämme flow’n tallennus menee kuitenkin virheeseen.

Request to XRM API failed with error: 'Message: Flow client error returned with status code "BadRequest" and details "{"error":{"code":"FlowCannotInvokeItself","message":"The Flow could not be saved because Flows cannot invoke themselves as Child Flows."}}". Code: 0x80060467 InnerError: '.

Flow ei voi käynnistää itseään.

Typerä rajoitus, jolle on kaksi helppoa kiertotietä.

Ensimmäinen on käynnistää flow http-triggerillä. Tämä käytiin läpi edellisessä rekursiota käsittelevässä jutussa.

Toinen on yksinkertaisen välittäjä-flow’n käyttö. Tehdään toinen flow (List Group Members – Helper), joka saa parametrina ryhmän id:n ja välittää sen edelleen alkuperäiselle flow’lle.

Tekemämme flow ei siis käynnistä itseään, vaan välittäjä-flow’n. Joka ei tee muuta kuin käynnistää alkuperäisen flow’n.

Pääflow näyttää lopuksi tältä.

Käynnistetään flow käyttäen parametrina Unit A -ryhmän tunnistetta. Hierarkiassamme on kahdeksan ryhmää. Käynnnistys generoi yhteensä 8 suoritusta. Jokainen hierarkian ryhmä käydään siis läpi.

Optimointi

Nyt flow lähettää ensin kaikille ryhmän jäsenille viestin ja sen jälkeen kutsuu itseään kunkin aliryhmän kohdalla. Viimeisenä vaiheena flow palauttaa kutsujalleen paluuviestin.

Mikäli hierarkia on todella laaja, voi koko ketjun läpikäynti kestää. Varsinkin mikäli käyttäjän kohdalla tehdään jotain monimutkaisempaa, kuin pelkkä viestin lähetys.

Muutetaan flow’ta siten, että käyttäjät ja ryhmät käsitellään rinnakkain. Myös paluuviesti kutsuneelle flow’lle lähetetään samantien.

Lisätään vielä virheenkäsittely jolloin saamme halutessamme tiedon, minkä ryhmän käsittelyssä virhe on tapahtunut.

Huomioita

Ensimmäinen huomio ratkaisusta on, että sähköpostiviestin lähettämiseksi organisaation jäsenille on takuulla toimivampiakin ratkaisuja. Mutta entäpä jos haluamme lähettä heille flow’lla henkilökohtaisen Teams-viestin? Käytännössä tulee eteen tilanteita, jossa esitetty ryhmien läpikäynti flow’n avulla on tarpeellista.

Mikäli ryhmissä on paljon jäseniä, tulee List Group Members -toiminnolle asettaa sivutus (pagination) päälle.

Mikäli ryhmissä on todella paljon jäseniä, joutuu hakutuloksen käsittelemään flow’ssa sivu kerrallaan.

Ongelmia saattaa aiheuttaa tilanne, jossa henkilö on usean ryhmän jäsenenä. Tällöin flow käsittelee hänet useaan kertaan. Tällöin alkuperäinen flow voi vain tallentaa henkilön tunnisteen esimerkiksi SharePoint-listalle. Ainoastaan silloin jos henkilöä ei sieltä vielä löydy.

Tämän jälkeen toisella flow’lla käydään SharePoint-listan henkilöt läpi ja tehdään haluttu toimenpide per henkilö.