Terho Antila kirjoitti vuonna 2021 aivan huikean blogipostauksen. Siinä esitellään ratkaisu, jossa Power Automatea käytetään yksinkertaisena web-palvelimena. Tunnistautumattomat käyttäjät voivat täyttää julkiverkossa Power Automate -työnkululla dynaamisesti muodostetun lomakkeen. Toinen Power Automate -työnkulku sitten käsittelee lomakkeella lähetetyt vastaukset.

Terhon ratkaisussa hyödynnettiin mukautuvia kortteja (adaptive cards). Rakennetaan tällä kertaa samantyyppinen ratkaisu yksinkertaisena html-lomakkeena ilman mukautuvia ilman kortteja. Html ja javascript -taitoni ovat päässeet ruostumaan, joten käytetään niissä apuna Microsoftin Copilotia.

Esimerkki – Palautteen kerääminen tapahtumista

Haluamme rakentaa ratkaisun, jolla anonyymit käyttäjät voivat jättää palautetta tapahtumasta. Palautteessa kysytään

  • Yleisarvosana tapahtumasta
  • Vapaa kommentti tapahtumasta
  • Arvosana jokaisesta tapahtuman puheenvuorosta

Palautteet tulee kyetä kohdentamaan tiettyyn tapahtumaan. Lisäksi tapahtumissa on eri puheenvuorot, joten niiden palautelomakkeet ovat sisällöltään aina erilaisia.

Kuulostaa hankalalta. MS Forms ei tähän taivu. Miten Power Automate tähän sitten taipuu?

Tietojen tallennus – SharePoint

Tallennetaan tapahtumien ja niiden puheenvuorojen tiedot SharePoint -listoille. Samoin niihin liittyvät palautteet.

Tapahtumat (Events)

Tapahtumista tallennetaan nimen ja päivän lisäksi salaisuus (secret). Salaisuus kulkee mukana palaute-linkeissä ja sen avulla päätellään mihin tapahtumaan käyttäjä on antamassa palautetta.

Lisäksi tapahtumalle tallennetaan html-lomake (Feedback form). Palataan siihen myöhemmin.

Tapahtumaan liittyvät palautteet (Event feedbacks)

Tapahtumasta annetut yleispalautteet tallennetaan omalle listalleen (Event feedbacks). Listan sarakkeet ovat

  • Tapahtuman tunniste (EventID)
  • Arvosana (Overall rate)
  • Vapaa palaute (Feedback)

Puheenvuorot (Sessions)

Tapahtumien puheenvuorot löytyvät omalta listaltaan. Niistä tallennetaan otsikko (Title), puhuja(t) (Speaker) sekä tapahtuman tunniste (EventID).

Puheenvuorojen palautteet (Session feedbacks)

Puheenvuorojen palautteet ovat yksinkertaisia. Niistä tallennetaan ainoastaan arvosana (Rate) ja puheenvuoron tunniste (Session ID).

Työnkulut (cloud flow)

Tuleva ratkaisumme on karkealla tasolla seuraava

  1. Käyttäjä klikkaa linkkiä, joka käynnistää Power Automate -työnkulun (handle user request)
  2. Työnkulku palauttaa linkkiä vastaavan tapahtuman palautelomakkeen
  3. Käyttäjä täyttää lomakkeen ja lähettää sen
  4. Toinen työnkulku (handle user reponse) ottaa vastaan lähetyn lomakkeen tiedot ja tallentaa ne

Aloitetaan luomalla työnkulut, jotta niille muodostuu url-osoitteet.

Flow – Handle user request

Molemmat työnkulut käynnistyvät When an HTTP-request is received -herätteellä (trigger).

Sallitaan flown kutsuminen kaikille (anyone). Linkin klikkaamiseen reagoivan flown metodi on GET.

Ensimmäisen tallennuksen yhteydessä flow’lle muodostuu osoite.

Flow – Handle user response

Luodaan toinen flow. Tämä käsittelee käyttäjän lähettämän vastauksen. Samat temput, mutta nyt käytetään POST-metodia.

Web-lomake

Luodaan seuraavaksi yksinkertainen html-lomake palautekyselyä varten. Tai annetaan Copilotin luoda se puolestamme. Aloitetaan seuraavalla promptilla.

Can you create a web form that is used by mobile phone. Form has 6 rows. Each row has header and then one input field with own header

Copilot vastaaa ripeästi.

Lopputulos näyttää selaimessa varsin kelvolliselta ensimmäiseksi yritykseksi.

Pyydetään copilottia tekemään siihen vielä muutamia korjauksia.

Nice! Can you make input field little bit narrower (it will contain two digits). And field header should be on the left side of input field. not at the top of it.

Parempi.

Vielä viimeinen silaus.

Ok. can you add general header text on the beginning of the form? And after that two inputfields: Rate of the events (number) and then feedback for the event (multiline text)

Lomakkeen runko on valmis.

Käytäjän painaessa submit-painiketta, tulisi lomakkeelle täytetyt tiedot välittää cloud flow’lle käsittelyä varten.

Miten ihmeessä tämä tehdään? Copilot tietää, joten pyydetään sitä tekemään tarvittava muutos.

Thanks. When user submits the form the content should be passed to the endpoint https://prod-254.westeurope.logic.azure.com:443/workflows/d8736f9c22a44246-... in JSON format.

After the submit we show "Your submit is processed..." text for the user. When we got response from the endpoint, we show the response to the user.

Saamme vastauksena jälleen html-lomakkeen. Koitetaan lähettää se.

Lomakkeen lähetys menee virheeseen.

Syynä on se, ettei lähetettyä lomaketta käsittelevä flow lähetä paluuvastausta lomakkeelle. Mutta se kyllä vastaanottaa lähetetyn lomakkeen! Kutsusta löytyy kaikki lomakkeelle syöttämämme tiedot.

Meillä on nyt ratkaisun elementit kasassa. Valmista ei kuitenkaan vielä ole.

Tapahtumakohtaisen palautelomakkeen luominen

Luodaan työnkulku, joka muodostaa jokaiselle tapahtumalle oman lomakkeen ja tallentaa sen html-koodin SharePoint-listalle. Valmiiksi muodostettu lomake on huomattavasti nopeampaa palauttaa käyttäjälle hänen avatessaan linkin.

Aloitetaan hakemalla kaikki tapahtumat (events) ja käydään läpi kunkin tapahtuman puheenvuorot (sessions).

Lomakkeella yhden puheenvuoron palauterivi näyttää seuraavalta.

<div class="row">
    <div class="row-header">Row 4</div>
    <div>
        <label for="field4">Field 4</label>
        <input type="number" id="field4" name="field4" required>
    </div>
</div>

Haluamme muodostaa jokaisesta tapahtuman puheenvuorosta lomakkeelle tällaisen kokonaisuuden. Lisätään kunkin puheenvuoron kohdalla muuttujaan (Session row) oma rivi. Nimetään (name) kenttä etuliitteellä 3 (=palaute puheenvuorosta) sekä puheenvuoron tunnisteella (Id). Tämä helpottaa jatkossa lomakkeen käsittelyä.

Lisätään lomakkeelle (Compose – Create html form) tapahtuman otsikko sekä tapahtumaa ja puheenvuoroja koskevat palautekentät.

Valmis lomake tallennetaan tapahtumariville.

Palautelomakkeen avaaminen

Lähetämme tapahtumaan osallistuneille linkin, josta he pääsevät antamaan palautetta. Linkki on Handle user request -flow’n triggerin linkki.

Linkkiin liitetään parameteriksi tapahtuman salaisuus (secret). Näin tiedämme mihin tapahtumaan palautetta ollaan antamassa.

Lopullinen linkki näyttää seuraavalta

https://prod-130.westeurope.logic.azure.com/workflows/69c8624a6104466aa...&event=P7Q8R9S0T1U2V3W4X5Y6Z7A8B9C0D1E2

Mitä tapahtuu kun käyttäjä klikkaa linkkiä?

Kyllä, Handle user request -flow käynnistyy. Muokataan sitä hieman.

Haetaan ensin linkissä olevaa parametria vastaavan tapahtuman tiedot (Get items – Matching event).

Tapahtumat rajataan seuraavasti

Filter Query: Secret eq '@{last(split(last(split(triggerOutputs()['headers']?['X-WAWS-Unencoded-URL'],'&')),'='))}'

Tämän jälkeen käyttäjälle palautetaan tapahtumalle etukäteen luotu html-lomake.

Body: @{First(outputs('Get_items_-_Matching_event')?['body/value'])?['Feedbackform']}

Näin käyttäjä pääsee linkkiä klikatessaan tapahtumakohtaiselle palautelomakkeelle.

Palautteen tallentaminen

Haluamme tietenkin tallentaa lähetetyt palautteet. Tämä tehdään Handle User Response flow’lla. Vastaukset tulevat sinne jo nätisti.

Vastausrivin (”1-1″:”5” jne) sisältö on aina tämä: ”palautteen tyyppi – palautteen kohde” : ”palaute”. Palautteen tyypit ovat seuraavat

  1. Tapahtuman arvosana
  2. Tapahtuman vapaa palaute
  3. Puheenvuorokohtaiset arvosanat

Palautteen kohde on käytännössä SharePoint-listan rivin Id.

Muodostetaan vastauksista taulukko, joka voidaan käydä Apply to each -toiminnolla läpi.

split(replace(replace(string(triggerBody()),'}',''),'{','') ,',')

Pääsemme käsiksi rivin eri osiin seuraavilla kaavoilla.

Palautteen tyyppi = int(split(replace(first(Split(item(),':')),'"',''),'-')[0])

Palautteen kohde = split(replace(first(Split(item(),':')),'"',''),'-')[1]

Palaute = replace(last(Split(item(),':')),'"','')

Näitä kaavoja hyödyntäen palautteen tallentaminen on helppoa. Kunhan muistaa että arvosanat on muutettava numeroiksi (int()) ennen tallennusta.

Palautteen tallennuksen jälkeen lähtetetään html-lomakkelle viesti tallennuksen onnistumisesta.

Käyttäjälle onnistunut lähetys näyttää tältä.

Pyydetään Copilottia muokkaamaan html-lomaketta siten, että onnistuneen lähetyksen jälkeen lomake piilotetaan näkyvistä. Tehdään Copilotilta saadut muutokset työnkulkuu, jolla muodostamme palautelomakkeet.

Tämän jälkeen lomake näyttää vastauksen jälkeen tältä.

Yhteenveto

Näin olemme rakentaneet Power Automatella ja SharePointilla ratkaisun, jolla voi muodostaa dynaamisesti erilaisia lomakkeita anonyymeille käyttäjille. Saadut vastaukset tallennetaan nätisti SharePoint-listoille.

Idea siitä että Power Automaten Response -toiminnolla käyttäjälle palautetaan html-sivu on mielestäni nerokas. Eikä siis omani.

Ratkaisussa on toki omat heikkoutensa. Power Automate on hidas. Käyttäjän klikatessa palautelinkkiä kestää lomakkeen avautuminen hetken. Tätä voi merkittävästi nopeuttaa muodostamalla lomakkeet etukäteen, kuten tällä kertaa teimme. Myös palautteen käsittely ottaa aikansa, eli käyttäjä joutuu tovin odottamaan että saa kuittauksen onnistuneesta lähetyksestä.

Ratkaisu edellyttää että Power Automaten voi triggeröidä kuka tahansa internetistä. Toki url-osoite tulee tietää, mutta siti.