Výrazy a funkce
Výrazy počítají hodnoty polí z jiných polí pomocí vestavěných funkcí.
Kde se výrazy používají
- Pravidla: akce setExpression. U spouštěče
alwaysse výsledek počítá průběžně, uonLoadaonSavejednou. - Tlačítka: akce setExpression se vyhodnotí při kliknutí.
- Texty bannerů: akce setBannerTitle a setBannerContent používají jen dosazení tokenů
[Pole],{Pole},@Me,@Todaybez vzorců (viz textová šablona).
Výrazy fungují i na tenantu, který nepovolil skripty.
Syntaxe výrazů
Hodnoty a odkazy
| Zápis | Význam | Příklad |
|---|---|---|
| číslo | desetinná tečka, záporná čísla, exponent. Číslo s úvodní nulou (04) není platné. | 42, 3.5, .5, 1e3 |
| text | v jednoduchých nebo dvojitých uvozovkách; zpětné lomítko pro \n, \t, \\, \', \" | "Schváleno" |
true, false, null | logické hodnoty a prázdno | IF([Hotovo], true, false) |
[Pole] nebo {Pole} | hodnota pole podle interního názvu (písmena, číslice, podtržítko). Obě závorky jsou rovnocenné. | [Cena] * [Kusy] |
@Today | dnešní datum jako text YYYY-MM-DD | DATEDIFF([Termin], @Today) |
@Me | jméno přihlášeného uživatele (jméno, jinak přihlašovací jméno, jinak e-mail) | CONCAT("Schválil ", @Me) |
Interní název pole najdete v inspektoru pole. Samotný identifikátor bez závorek (Cena) není pole a vzorec je neplatný; pole vždy pište jako [Cena].
Operátory a priorita
Od nejnižší priority po nejvyšší:
- podmíněný výraz
podmínka ? a : b(lze vnořovat) ||(nebo),??(pravá strana, je-li levá strana bez hodnoty:null, nevyplněné pole, prázdný řetězec nebo text ze samých mezer, stejně jako u ISBLANK a COALESCE; hodnoty0afalsezůstanou)&&(a)==,!=,===,!==<,<=,>,>=+,-*,/,%- unární
-,+,! - volání metody a vlastnosti:
.toFixed(2),.lengtha další (viz níže)
Kulatými závorkami pořadí změníte. Chování operátorů odpovídá JavaScriptu: + s textem spojuje texty ("A" + [Cislo]), s čísly sčítá. Logické operátory vrací jednu z hodnot, ne vždy true/false. Nepravdivé jsou 0, prázdný text, null a false.
[Cena] * [Kusy] * (1 + [DphProcent] / 100)
[Stav] == "Schváleno" ? "Hotovo" : "Čeká"
[Cena] > 0 && [Kusy] > 0
Aliasy JavaScriptu a metody
Pro uživatele, kteří znají JavaScript, fungují tato volání jako aliasy vestavěných funkcí:
| Zápis | Stejné jako |
|---|---|
Math.round(x), Math.floor(x), Math.ceil(x), Math.abs(x), Math.sqrt(x) | ROUND, FLOOR, CEIL, ABS, SQRT |
Math.min(...), Math.max(...), Math.pow(x, y) | MIN, MAX, POWER |
Number(x), parseFloat(x) | VALUE |
String(x) | TEXT |
Povolené jsou jen čtyři metody a jedna vlastnost: .toFixed(n) (číslo jako text s n desetinnými místy, 0 až 20), .toUpperCase(), .toLowerCase(), .trim() a .length (délka textu). Jiné metody jsou chyba (nepovolená metoda). Názvy vestavěných funkcí nerozlišují velikost písmen (round = ROUND), názvy Math.… ano.
([Cena] * 1.21).toFixed(2) → "121.00"
[Nazev].trim().toUpperCase()
Math.max([A], [B])
Převod hodnot polí
Hodnota pole se do výrazu dostane takto:
- Číslo nebo text v běžném desetinném zápisu je číslo:
"10"je10,"0,5"je0.5. Desetinná čárka funguje:"100,5"je100.5. Text s úvodní nulou (PSČ"01234", telefon"0601123456"), s exponentem ("1e5") nebo hex zápisem ("0x10") je identifikátor a zůstane textem, takžeCONCAT([PSC], " Praha")vrátí01234 Praha. Aritmetický operátor nebo funkce text přesto přečte jako číslo ([A] * 2s"1e5"dá200000). - Nevyplněné pole (
null, žádná hodnota) je0, takže se dá bezpečně násobit a sčítat. Prázdný text""zůstane prázdným textem, v součtu a součinu se bere jako 0, ale+ho spojí s textem. Na prázdnost se ptejte funkcemi ISBLANK a COALESCE, které se dívají na skutečnou hodnotu pole. - Ostatní text zůstane textem.
- Ano/ne je
true/false. - Osoba, vyhledávání, spravovaná metadata se změní na svůj popisek; vícehodnotová pole na popisky oddělené čárkou.
- Datum se čte jako text
YYYY-MM-DD(případně s časem). Datumové funkce YEAR, MONTH, DAY, DATEDIFF pracují s tímto tvarem v místním čase.
Výsledek výrazu
- Platný výsledek (číslo, text, ano/ne, datum jako text) se zapíše do cílového pole.
- Neplatný číselný výsledek (dělení nulou,
NaN, nekonečno, datum, které nejde přečíst) cílové pole vymaže, aby v něm nezůstala zastaralá hodnota. Ve výpisu ladění se objeví zpráva. - Prázdný výraz pole nezmění.
- Výraz
null(například COALESCE bez vyplněné hodnoty) pole vymaže.
Textová šablona (záložní chování)
Pokud výraz nejde přečíst jako vzorec, nepovažuje se za chybu, ale za textovou šablonu: tokeny [Pole], {Pole}, @Me a @Today se nahradí hodnotami a zbytek zůstane textem. Díky tomu fungují šablony:
Faktura - {Supplier} ({Status}) → "Faktura - Contoso (Schváleno)"
2026-11-04 → "2026-11-04" (zůstane textem, ne 2011)
Překlep ve vzorci (například SUMM([A], [B])) se proto nezastaví chybou za běhu: místo výsledku se do pole zapíše text šablony. Chybu uvidíte v návrháři pod polem se vzorcem (viz Ověření v návrháři) a v ladicím výpisu.
Dosazují se jen hodnoty, které už jsou v poli. Dosazený text se dál nevyhodnocuje a odkaz na neexistující pole dá prázdný text.
Ověření v návrháři
Pod polem se vzorcem (akce setExpression v pravidle i v tlačítku) kontroluje návrhář syntaxi průběžně. Neplatný vzorec označí červeně zprávou ve tvaru „Neplatný vzorec, pozice 7: neznámá funkce SUMM. Za běhu se text použije jako textová šablona.“ Pozice se počítá od 1. Rozpoznané chyby:
- neočekávaný znak nebo symbol, neúplný výraz, neukončený řetězec;
- neplatné číslo (například
04); - neznámá funkce nebo nepovolená metoda;
- neznámý název („pole zapište jako [Pole]“);
- špatný počet argumentů funkce;
- příliš hluboké vnoření (nejvýše 64 úrovní).
Kontrola ověřuje jen zápis. Neověřuje, zda pole [Pole] existuje, ani zda dává výsledek smysl.
Bezpečnost výrazů
Výrazy se nevyhodnocují přes eval ani new Function, ale vlastním analyzátorem:
- povolené jsou jen funkce a metody z tohoto seznamu; nic jiného nejde zavolat;
- výraz nemá přístup ke globálním proměnným,
window, DOM ani k vlastnostem objektů; pole se čtou jen podle jejich názvu ([constructor]dá prázdnou hodnotu); - hloubka vnoření je omezená, takže složitý výraz nezahltí prohlížeč;
- výraz tedy nemůže spustit cizí kód, proto nepotřebuje povolení skriptů ani
unsafe-evalv CSP.
Souhrn zabezpečení konfigurace najdete na stránce Zabezpečení, pravidla pro skripty na stránce Skripty.
Chyby ve výrazech
Chyby vzorců za běhu formulář nepřeruší a koncovému uživateli se nezobrazí. Zjistíte je takto:
- v návrháři podle červené zprávy pod polem;
- v konzole v ladicím režimu (
?fcdebug=1, viz Ladění pravidel), kde je u neplatného výrazu pozice a důvod a u nekonečného výsledku původní hodnoty polí.
Funkce
Funkce se zapisují velkými i malými písmeny, argumenty se oddělují čárkou. Počet argumentů je pevný nebo rozsah; jiný počet je chyba špatný počet argumentů. Čísla se v argumentech berou podle převodu hodnot, prázdná hodnota jako 0.
IF
IF(podmínka, hodnotaPokudPravda, hodnotaPokudNepravda?), 2 až 3 argumenty. Vrátí druhý argument, je-li podmínka pravdivá, jinak třetí (když chybí, false). Vyhodnotí se jen vybraná větev.
IF([Cena] > 10000, "Vyžaduje schválení", "OK") → "Vyžaduje schválení" (při Cena = 12000)
AND
AND(a, b, …), 1 a více argumentů. Vrátí true, když jsou všechny argumenty pravdivé. Vyhodnocuje se zleva a po první nepravdě se končí.
AND([Cena] > 0, [Kusy] > 0) → true
OR
OR(a, b, …), 1 a více argumentů. Vrátí true, když je alespoň jeden argument pravdivý.
OR([Stav] == "Nový", [Stav] == "Koncept") → true (při Stav = "Nový")
NOT
NOT(a), 1 argument. Obrátí pravdivost.
NOT(ISBLANK([Poznamka])) → true (je-li poznámka vyplněná)
ROUND
ROUND(číslo, desetinnáMísta?), 1 až 2 argumenty. Zaokrouhlí na celé číslo, nebo na zadaný počet desetinných míst (půlka nahoru). Záporný počet míst zaokrouhluje na desítky, stovky.
ROUND(2.346, 2) → 2.35
ROUND(1234, -2) → 1200
FLOOR
FLOOR(číslo), 1 argument. Zaokrouhlí dolů na celé číslo.
FLOOR(7.9) → 7
CEIL
CEIL(číslo), 1 argument. Zaokrouhlí nahoru na celé číslo.
CEIL(7.1) → 8
ABS
ABS(číslo), 1 argument. Absolutní hodnota.
ABS(-15) → 15
SQRT
SQRT(číslo), 1 argument. Druhá odmocnina. Záporné číslo dá neplatný výsledek a cílové pole se vymaže.
SQRT(81) → 9
POWER
POWER(základ, mocnitel), přesně 2 argumenty. Mocnina.
POWER(2, 10) → 1024
MIN
MIN(a, b, …), 1 a více argumentů. Nejmenší z čísel.
MIN([A], [B], 100) → nejmenší z hodnot A, B a 100
MAX
MAX(a, b, …), 1 a více argumentů. Největší z čísel.
MAX([Cena], 0) → 0 (při záporné ceně)
SUM
SUM(a, b, …), 1 a více argumentů. Součet. Prázdné hodnoty se berou jako 0.
SUM([Q1], [Q2], [Q3], [Q4])
AVG
AVG(a, b, …), 1 a více argumentů. Aritmetický průměr všech argumentů; prázdná hodnota se počítá jako 0 (neignoruje se).
AVG(10, 20, 30) → 20
CONCAT
CONCAT(a, b, …), 1 a více argumentů. Spojí hodnoty do jednoho textu; prázdná hodnota dá prázdný text.
CONCAT([Prijmeni], ", ", [Jmeno]) → "Novák, Jan"
LEN
LEN(text), 1 argument. Počet znaků (stejné jako .length).
LEN("Praha") → 5
UPPER
UPPER(text), 1 argument. Velká písmena.
UPPER("abc-1") → "ABC-1"
LOWER
LOWER(text), 1 argument. Malá písmena.
LOWER("ABC") → "abc"
TRIM
TRIM(text), 1 argument. Odstraní mezery na začátku a na konci.
TRIM(" ahoj ") → "ahoj"
TODAY
TODAY(), bez argumentů. Dnešní datum v místním čase jako text YYYY-MM-DD (stejné jako @Today).
TODAY() → "2026-11-08"
NOW
NOW(), bez argumentů. Aktuální datum a čas v místním čase jako text YYYY-MM-DDTHH:mm:ss.
NOW() → "2026-11-08T14:30:05"
YEAR
YEAR(datum), 1 argument. Rok z data ve tvaru YYYY-MM-DD (volitelně s časem). Cokoli jiného dá neplatný výsledek a cílové pole se vymaže.
YEAR("2026-11-04") → 2026
MONTH
MONTH(datum), 1 argument. Měsíc 1 až 12.
MONTH("2026-11-04") → 11
DAY
DAY(datum), 1 argument. Den v měsíci.
DAY("2026-11-04") → 4
DATEDIFF
DATEDIFF(datum1, datum2), přesně 2 argumenty. Rozdíl datum1 − datum2 ve dnech (čas se ignoruje, přechod na letní čas výsledek neovlivní). Je-li datum1 později, výsledek je kladný.
DATEDIFF([Termin], @Today) → 14 (termín je za 14 dní)
DATEDIFF("2026-12-24", "2026-12-01") → 23
ISBLANK
ISBLANK(hodnota), 1 argument. true, když je pole nevyplněné (nic, prázdný text nebo jen mezery, prázdný seznam). U odkazu na pole se kontroluje skutečná hodnota pole, nikoli převedená na 0.
IF(ISBLANK([Termin]), "Bez termínu", [Termin])
COALESCE
COALESCE(a, b, …), 1 a více argumentů. Vrátí první argument, který není prázdný (null, prázdný text, nevyplněné pole). Pokud jsou všechny prázdné, vrátí null a cílové pole se vymaže.
COALESCE([Mobil], [Telefon], "bez kontaktu")
VALUE
VALUE(text), 1 argument. Převede text na číslo; z textu přečte číslo na začátku ("12abc" je 12). Text bez čísla dá neplatný výsledek a cílové pole se vymaže. Alias: Number(x), parseFloat(x).
VALUE("42.5") + 1 → 43.5
TEXT
TEXT(hodnota), 1 argument. Převede hodnotu na text (prázdná hodnota na prázdný text). Alias: String(x). Pro pevný počet desetinných míst použijte .toFixed(n).
CONCAT("Číslo ", TEXT([Poradi])) → "Číslo 7"