Návod jak postavit řešení od nuly

Předpoklady: M365 účet s přístupem k SharePoint a Power Automate
Čas: ~4–6 hodin první nastavení


Proč to děláme

Pokud opakovaně posíláš stejné nebo podobné emaily různým lidem s různými parametry, je to ideální kandidát na automatizaci. Místo ručního vyplňování šablon a hledání adres pokaždé znovu – vyplníš jeden formulář a systém se postará o zbytek.

Základní princip: databáze + logika + odesílání.


1. Nejdřív si popište proces

Než začneš cokoliv stavět, odpověz si na tyto otázky:

  • Kolik různých emailů posíláš?
  • Kdo jsou příjemci – jsou vždy stejní, nebo se mění?
  • Co se v emailech mění pokaždé? (datum, jméno, číslo…)
  • Odkud má email odcházet? (osobní vs. sdílená schránka)

Díky tomu víš co budeš ukládat do databáze a jak složitá bude logika.


2. Databáze – SharePoint Lists

Celé řešení stojí na třech jednoduchých tabulkách v SharePoint Lists. Fungují jako Excel v cloudu, ale Power Automate s nimi umí přímo pracovat.

Proč tři tabulky?

Každá řeší jinou část problému – oddělujeme kdo (adresáti), co (šablony) a jaké parametry (konkrétní kampaň/případ).


Tabulka 1: Adresáti

Co ukládáme: seznam lidí nebo schránek, kteří dostávají emaily.

Proč: místo abychom adresáty psali pokaždé ručně, máme je jednou uložené. Flow si je samo přečte.

Klíčový sloupec – Role: říká flow, jaký email daná osoba dostane. Pokud víc lidí dostává stejný email, mají stejnou roli.

Klíčový sloupec – JeStaly (Ano/Ne): přepínač. Odškrtneš = flow tuto osobu přeskočí, aniž bys mazal záznam.

Tip: sloupec Role nastav jako typ Volba (Choice) s předdefinovanými hodnotami – zabraňuje překlepům, které by způsobily, že email nedojde.


Tabulka 2: Šablony

Co ukládáme: texty emailů s placeholdery místo konkrétních hodnot.

Proč: text emailu se nemění, mění se jen pár hodnot uvnitř. Šablonu napíšeš jednou a pak ji flow vždy doplní správnými daty.

Jak fungují placeholdery: všude kde se mění hodnota napíšeš {{NazevPromenne}} – bez háčků, bez mezer. Flow tento řetězec najde a nahradí skutečnou hodnotou.

Klíčový sloupec – ProRoli: propojení se sloupcem Role v Adresáti. Říká flow: tento email patří lidem s touto rolí.

Klíčový sloupec – Telo: musí být typ Více řádků textu s RTF (Rich text). Jinak se text usekne na 255 znacích.

⚠️ Gotcha: SharePoint RTF editor ukládá znaky { a } jako HTML kódy ({ a }). Proto flow musí nejdřív tyto kódy dekódovat, než hledá placeholdery. Více v části 4.

Jak vložit HTML formátování: v editoru klikni na Vrátit se ke klasickému prostředí → tam použij formátovací tlačítka nebo vlož přes Ctrl+Shift+V.


Tabulka 3: Formulář / záznamy

Co ukládáme: konkrétní parametry pro každý případ (datum, jméno, číslo, ad hoc emailové adresy…).

Proč: tady kolegyně/uživatel zadává proměnné hodnoty pro daný případ. Každý nový řádek = jedno spuštění flow.

Sloupce: jeden sloupec pro každou proměnnou hodnotu, která se bude dosazovat do šablon. Název sloupce = název placeholderu (bez závorek).

Ad hoc adresáti: pokud se někteří příjemci mění případ od případu (např. kontaktní osoba na konkrétní fakultě), přidej pro ně samostatné sloupce s emailovou adresou.

SharePoint automaticky zobrazí tuto tabulku jako formulář – uživatel klikne + Nová položka a vyplní pole.


3. Flow v Power Automate – základní logika

Flow je automatizovaný recept: „Když nastane X, udělej Y, pak Z.“ Skládá se z bloků – každý blok je jedna akce. Bloky se propojují a předávají si data.

Přejdi na make.powerautomate.com+ Vytvořit → Automatizovaný tok cloudu.

⚠️ Flow vytvoř pod servisním/sdíleným účtem, ne osobním. Pokud uživatel odejde ze společnosti, flow musí dál fungovat.


Krok 1: Trigger (spouštěč)

Trigger je první blok – říká flow kdy se má spustit. Bez triggeru flow nikdy nic neudělá.

Pro testování: vyber Ručně aktivovat tok – spustíš ho kdykoliv tlačítkem v Power Automate. Nemusíš nic vyplňovat do formuláře, jen klikneš a flow běží.

Pro produkci: vyber SharePoint – Při vytvoření položky → vybereš svůj SharePoint web a tabulku s formulářem. Od teď flow hlídá tuto tabulku – přibyde nový řádek → flow se automaticky spustí a všechny hodnoty z toho řádku má k dispozici.


Krok 2: Načtení dat (3× Získat položky)

Flow teď potřebuje přečíst data ze všech tří tabulek. Přidej tři akce SharePoint – Získat položky za sebou – po jedné pro každou tabulku.

Šablony:

  • Načti všechny šablony emailů
  • Top Count nastav na 20 (nebo víc než máš šablon) – výchozí limit je 100, ale je dobré ho vždy nastavit explicitně

Adresáti:

  • Načti jen aktivní záznamy – do pole Filtrovat dotaz napiš JeStaly eq 1
  • Top Count nastav na 500
  • Filtr funguje jako WHERE v SQL – vrátí jen řádky kde JeStaly = 1 (= Ano)

Formulář:

  • Načti jen poslední záznam – Top Count = 1
  • Do pole Seřadit podle napiš Created desc – tím dostaneš nejnovější záznam první
  • Výsledkem je jeden konkrétní případ s parametry (datum, jméno, adresy…)

Každá akce Získat položky vrátí pole (array) záznamů. Výsledek se jmenuje value – na to se budeme odkazovat v dalších krocích.


Krok 3: Proměnné pro email

Před tím než začneme procházet šablony, musíme si připravit dvě proměnné – budeme do nich ukládat sestavený text emailu.

Přidej dvě akce Inicializovat proměnnou:

  • Název: EmailPredmet, Typ: Řetězec, Hodnota: prázdná
  • Název: EmailTelo, Typ: Řetězec, Hodnota: prázdná

Co je proměnná: dočasné úložiště pro hodnotu. Funguje jako pojmenovaná krabička – dáš do ní hodnotu a pak ji kdekoli v flow použiješ přes její název.

⚠️ Inicializovat proměnnou NESMÍ být uvnitř cyklu – Power Automate to neumožňuje a flow selže. Proměnné inicializuj vždy před cyklem.


4. Cyklus přes šablony a dosazení hodnot

Krok 4: Cyklus (Použít na všechny)

Přidej akci Použít na všechny – do vstupního pole vyber value z akce Získat položky (Šablony).

Co cyklus dělá: projde každou šablonu jednu po druhé a pro každou provede všechny akce uvnitř. Máš 7 šablon → cyklus proběhne 7×, pokaždé s jinou šablonou jako „aktuální položkou“.

Aktuální šablonu v cyklu čteš přes items('Použít_na_všechny')?['NazevSloupce'].


Krok 5: Sestavení textu emailu (Nastavit proměnnou + replace)

Uvnitř cyklu přidej dvě akce Nastavit proměnnou – pro EmailPredmet a EmailTelo. Do pole Hodnota klikni na záložku fx (Výraz) a vlož replace() výraz.

Co replace() dělá: prohledá text a nahradí všechny výskyty hledaného řetězce novým řetězcem. Takto funguje:

replace(zdrojovy_text, co_hledat, čím_nahradit)

Příklad – nahradí {{Jmeno}} skutečným jménem:

replace(
  items('Použít_na_všechny')?['Telo'],
  '{{Jmeno}}',
  'Jana Nováková'
)

Protože máš víc placeholderů, vnořuješ replace() do sebe – výstup jednoho je vstupem dalšího:

replace(replace(
  items('Použít_na_všechny')?['Telo'],
  '{{Jmeno}}', first(body('Formulár')?['value'])?['Jmeno']),
  '{{Datum}}', first(body('Formulár')?['value'])?['Datum'])

first(body('NazevAkce')?['value']) vezme první (a jediný) záznam z výsledku Získat položky – Formulář.

Proč coalesce(): pokud je pole v formuláři prázdné, Power Automate vrátí null. replace() s null selže s chybou. coalesce() ošetří null – pokud je hodnota null, použije náhradní text:

coalesce(first(body('Formulár')?['value'])?['Jmeno'], 'nespecifikováno')

Proč dekódování HTML entit na začátku: SharePoint RTF editor ukládá { jako { a } jako }. replace() hledá {{Jmeno}} ale v textu najde {{Jmeno}} – neshoda, placeholder se nenahradí. Proto první tři replace() tyto kódy převedou zpátky na normální znaky:

replace(replace(replace(
  items('Použít_na_všechny')?['Telo'],
  '{', '{'),
  '}', '}'),
  ':', ':'),
  ...  <- teprve tady přijdou replace() pro placeholdery

5. Směrování – kdo dostane jaký email

Krok 6: Přepínač (Switch)

Uvnitř cyklu, hned za Nastavit proměnnou, přidej akci Přepínač. Do pole Na vlož výraz, který přečte hodnotu ProRoli aktuální šablony.

Co Přepínač dělá: podívá se na jednu hodnotu a podle ní vybere jednu z předem definovaných cest (Case větví). Funguje jako křižovatka – každá šablona má svoji ProRoli a flow podle ní zvolí správnou cestu k odeslání.

Každá Case větev obsahuje:

  • podmínku Rovná se – hodnotu ProRoli (např. vedeni)
  • akce pro odeslání emailu správným adresátům

Výchozí větev (Default): záchytná síť pro případ neznámé role. Nech ji prázdnou nebo přidej notifikaci o chybě.


Krok 7a: Fixní adresáti (Case s cyklem)

Pokud adresáti pro danou roli jsou vždy stejní (máš je uložené v tabulce Adresáti), uvnitř Case větve:

  1. Získat položky (tabulka Adresáti) s filtrem Role eq 'nazev_role' → vrátí všechny lidi s touto rolí. Přejmenuj akci (tři tečky → Přejmenovat) aby bylo jasné co dělá.
  2. Použít na všechny (vnořený cyklus) – vstup: value z předchozí akce → projde každého adresáta
  3. Odeslat e-mail uvnitř vnořeného cyklu – Komu: item()?['Email'] (email aktuálního adresáta v cyklu)

Proč vnořený cyklus: lidí se stejnou rolí může být víc (např. vedení má 3 členy). Cyklus zajistí, že každý dostane email zvlášť.


Krok 7b: Proměnliví adresáti (Case bez cyklu)

Pokud se adresát mění případ od případu a uživatel ho zadává do formuláře, uvnitř Case větve přidej přímo Odeslat e-mail bez cyklu:

  • Komu: first(body('NazevAkceFormulare')?['value'])?['EmailObjednatele']

Je to jeden konkrétní email přečtený přímo z formuláře – žádný cyklus nepotřebuješ.


6. Odeslání emailu

Vždy používej akci Office 365 Outlook – Odeslat e-mail ze sdílené poštovní schránky (V2).

⚠️ Neplést s „Odeslat e-mail (V2)“ – ta posílá z osobního účtu. Musí být verze ze sdílené schránky.

Pole:

  • Původní adresa poštovní schránky: adresa sdílené schránky (pro testování použij vlastní)
  • Komu: email adresáta (z cyklu nebo z formuláře)
  • Předmět: proměnná EmailPredmet
  • Text: proměnná EmailTelo

7. Testování

  1. V tabulce Adresáti nastav dočasně jako email u každé role svůj testovací email – ať nepošleš testovací maily skutečným lidem
  2. Do tabulky Formulář přidej testovací záznam s fiktivními daty
  3. Spusť flow ručně → Testovat → Ručně → Spustit tok
  4. Zkontroluj historii: Power Automate → Moje toky → detail → Historie spuštění – zelená = OK, červená = klikni pro detail chyby
  5. Ověř v emailu: placeholdery nahrazeny, formátování správné, email přišel ze správné schránky

8. Časté chyby

ProblémPříčinaŘešení
Placeholder se nenahradíSharePoint RTF kóduje { jako &#123;Přidat dekódovací replace() na začátek výrazu
Chyba „cannot be nested in foreach“Inicializovat proměnnou je uvnitř cykluPřesunout ven z cyklu, uvnitř použít Nastavit proměnnou
Chyba „third parameter is Null“Pole v formuláři je prázdnéObalit hodnotu do coalesce(hodnota,'nespecifikováno')
Flow vrací jen 100 záznamůVýchozí limit je 100Nastavit Top Count na 500 nebo více
Interní název sloupce neodpovídáSharePoint přejmenovává sloupce interněZkontrolovat v dynamickém obsahu
Flow přestalo fungovat po odchodu kolegyFlow patřilo osobnímu účtuVždy vytvářet pod servisním/sdíleným účtem