Функції
Рядкові функції
При роботі з рядками у виразах важливо використовувати одинарні лапки (’’) для охоплення літеральних рядків. Однак виняток виникає, коли ви хочете включити одинарні лапки всередині літерального рядка. У таких випадках ви можете використовувати подвійні лапки ("") для охоплення всього рядка.
Наприклад:
- Правильно: if(${yesno} = 1, “a string with ‘single quotes’ in it”, “no single quotes here”)
- Неправильно: if(${yesno} = 1, ‘a string with ‘single quotes’ in it’, ’no single quotes here’)
Щодо смарт-лапок, важливо знати про їх присутність, оскільки вони можуть спричиняти проблеми у виразах. Багато редакторів форматованого тексту автоматично перетворюють прямі лапки ("" або ‘’) на смарт-лапки або фігурні лапки ("" або ‘’), що може призвести до синтаксичних помилок або несподіваної поведінки. Щоб уникнути цього, переконайтеся, що ви послідовно використовуєте прямі лапки (’’) у своїх виразах.
rtSurvey підтримує різні функції, включаючи:
string(field): Перетворює поле на рядок.- Приклад:
string(34.8)буде перетворено на'34.8'.
- Приклад:
string-length(field): Повертає довжину рядкового поля.- Приклад:
string-length(.) > 3 and string-length(.) < 10можна використовувати для забезпечення, що поточне поле містить від 3 до 10 символів.
- Приклад:
substr(fieldorstring, startindex, endindex): Повертає підрядок, починаючи зstartindexта закінчуючи безпосередньо передendindex. Індекси починаються з 0 для першого символу рядка.- Приклад:
substr(${phone}, 0, 3)поверне перші три цифри номера телефону.
- Приклад:
concat(a, b, c, ...): Об’єднує поля (та/або рядки) разом.- Приклад:
concat(${firstname}, ' ', ${lastname})поверне повне ім’я, об’єднуючи значення полівfirstnameтаlastname.
- Приклад:
linebreak(): Повертає символ розриву рядка.- Приклад:
concat(${field1}, linebreak(), ${field2}, linebreak(), ${field3})поверне список трьох значень полів з розривами рядків між ними.
- Приклад:
lower(): Перетворює рядок на всі малі літери.- Приклад:
lower('Street Name')поверне “street name”.
- Приклад:
upper(): Перетворює рядок на всі великі літери.- Приклад:
upper('Street Name')поверне “STREET NAME”.
- Приклад:
Функції select_one та select_multiple
count-selected(field): Повертає кількість елементів, обраних у полі select_multiple.- Приклад:
count-selected(.) = 3можна використовувати як вираз обмеження, щоб забезпечити вибір рівно трьох варіантів.
- Приклад:
selected(field, value): Повертає true або false залежно від того, чи було обрано вказане значення у полі select_one або select_multiple.- Приклад:
selected(${color}, 'Blue')можна використовувати як вираз актуальності для показу групи або поля лише якщо респондент обрав “Blue” як свій улюблений колір. - Примітка: Другий параметр завжди повинен вказувати значення варіанту, а не мітку варіанту. Використовуйте значення зі стовпця value в таблиці choices визначення форми.
- Приклад:
selected-at(field, number): Повертає обраний елемент на вказаній позиції у полі select_multiple. Коли переданий номер дорівнює 0, повертає перший обраний елемент; коли номер дорівнює 1, повертає другий обраний елемент, і так далі.- Приклад:
selected-at(${fruits}, 0) = 'Apple'можна використовувати як вираз актуальності для показу групи або поля лише якщо першим обраним варіантом є “Apple”. - Примітка: Повернуте значення буде значенням варіанту, а не міткою варіанту. Використовуйте значення зі стовпця value в таблиці choices визначення форми.
- Приклад:
choice-label(field, value): Повертає мітку для варіанту поля select_one або select_multiple, як визначено в таблиці choices визначення форми.- Приклад 1:
choice-label(${country}, ${country})поверне мітку варіанту для поточного обраного варіанту в полі з назвоюcountry. - Приклад 2:
choice-label(${languages}, selected-at(${languages}, 0))поверне мітку для першого обраного варіанту в полі з назвоюlanguages. - Примітка: Ця функція отримує мітку варіанту, а не значення. Вона використовує стовпець label з таблиці choices визначення форми.
- Приклад 1:
Функції полів повторів
У rtSurvey, якщо ви хочете задавати одне й те саме питання кілька разів, ви можете помістити поле всередині групи повторів. Це призводить до кількох екземплярів одного поля. Наступні функції можуть допомогти вам працювати з цими повторюваними полями та даними, які вони виробляють.
join(string, repeatedfield): Для поля у групі повторів генерує список значень, розділений рядком. Перший параметр вказує роздільник для відокремлення значень.- Приклад:
join(', ', ${member_name})генерує єдиний список, розділений комами, з усіх введених імен.
- Приклад:
join-if(string, repeatedfield, expression): Функціонує точно якjoin(), за винятком того, що перевіряє кожен екземпляр у групі повторів за допомогою наданого виразу. Якщо вираз оцінюється як false, елемент буде виключено з виводу.- Приклад:
join-if(', ', ${member_name}, ${age} >= 18)генерує список імен, розділений комами, лише для дорослих членів (тих, кому 18 і більше).
- Приклад:
count(repeatgroup): Повертає поточну кількість повторень групи повторів.- Приклад:
count(${groupname})поверне кількість екземплярів групи.
- Приклад:
count-if(repeatgroup, expression): Функціонує точно якcount(), за винятком того, що перевіряє кожен екземпляр у групі повторів за допомогою наданого виразу. Якщо вираз оцінюється як false, елемент буде виключено з виводу.- Приклад:
count-if(${members}, ${age} >= 18)поверне кількість дорослих членів на основі поля age у групі повторів “members”.
- Приклад:
sum(repeatedfield): Для поля у групі повторів обчислює суму всіх значень.- Приклад:
sum(${loan_amount})поверне загальну суму всіх позик.
- Приклад:
sum-if(repeatedfield, expression): Функціонує точно якsum(), за винятком того, що перевіряє кожен екземпляр у групі повторів за допомогою наданого виразу. Якщо вираз оцінюється як false, елемент буде виключено з виводу.- Приклад:
sum-if(${loan_amount}, ${loan_amount} > 500)поверне загальну суму всіх позик, що перевищують 500. Менші позики будуть ігноруватися.
- Приклад:
min(repeatedfield): Для поля у групі повторів обчислює мінімум усіх значень.- Приклад:
min(${member_age})поверне вік наймолодшого члена в групі.
- Приклад:
min-if(repeatedfield, expression): Функціонує точно якmin(), за винятком того, що перевіряє кожен екземпляр у групі повторів за допомогою наданого виразу. Якщо вираз оцінюється як false, елемент буде виключено з виводу.- Приклад:
min-if(${member_age}, ${member_age} >= 18)поверне вік наймолодшого дорослого в групі. Ті, кому менше 18, будуть ігноруватися.
- Приклад:
max(repeatedfield): Для поля у групі повторів обчислює максимум усіх значень.- Приклад:
max(${member_age})поверне вік найстаршого члена в групі.
- Приклад:
max-if(repeatedfield, expression): Функціонує точно якmax(), за винятком того, що перевіряє кожен екземпляр у групі повторів за допомогою наданого виразу. Якщо вираз оцінюється як false, елемент буде виключено з виводу.- Приклад:
max-if(${member_age}, ${member_age} >= 18)поверне вік найстаршого дорослого в групі. Ті, кому менше 18, будуть ігноруватися.
- Приклад:
index(): Викликається у групі повторів, повертає порядковий номер для поточної групи або екземпляру.- Приклад:
index()при використанні у групі повторів поверне 1 для першого екземпляру, 2 для другого і так далі.
- Приклад:
indexed-repeat(repeatedfield, repeatgroup, index): Посилається на поле або групу всередині групи повторів ззовні цієї групи повторів. Перший параметр вказує потрібне поле повтору або групу, другий — групу повторів, в якій знаходиться поле або група, а третій — номер екземпляру в групі повторів для використання.- Приклад 1:
indexed-repeat(${name}, ${names}, 1)поверне перше доступне ім’я, коли поле name знаходиться у попередній групі повторів з назвою “names”. - Приклад 2:
indexed-repeat(${name}, ${names}, index())витягне ім’я, що відповідає номеру екземпляру поточної групи повторів.
- Приклад 1:
rank-index(index, repeatedfield): Ця функція обчислює порядковий ранг вказаного екземпляру повторюваного поля для використання поза групою повторів. Ранг 1 присвоюється екземпляру з найвищим значенням, ранг 2 — екземпляру з наступним найвищим значенням, і так далі. Якщо ви передаєте недійсний індекс або індекс до екземпляру з нечисловим значенням, буде повернуто ранг 999.- Приклад:
rank-index(1, ${random_draw})обчислює ранг першого екземпляру на основі значення його поляrandom_drawпорівняно з значеннями інших екземплярів.
- Приклад:
rank-index-if(index, repeatedfield, expression): Ця функція працює аналогічно доrank-index(), але перевіряє кожен екземпляр у групі повторів повторюваного поля за допомогою наданого виразу. Якщо вираз оцінюється як false, елемент буде виключено з обчислення. Індекс, що використовується, базується на повному наборі екземплярів перед оцінкою виразу для кожного екземпляру. Якщо ви передаєте індекс для екземпляру, який був ігнорований через те, що він не відповідає виразу, він вважається недійсним індексом, і буде повернуто ранг 999.- Приклад:
rank-index-if(1, ${age}, ${age} >= 18)обчислює ранг віку в наборі дорослих, враховуючи лише екземпляри, де вік більший або рівний 18.
- Приклад:
Числові функції
| Operator | Operation | Example | Example answer |
|---|---|---|---|
+ | Addition | 1 + 1 | 2 |
- | Subtraction | 3 - 2 | 1 |
* | Multiplication | 3 * 2 | 6 |
div | Division | 10 div 2 | 5 |
mod | Modulus | 9 mod 2 | 1 |
rtSurvey підтримує числові функції, включаючи:
number(field): Перетворює значення поля на число.- Приклад:
number('34.8')= 34.8
- Приклад:
int(field): Перетворює значення поля на ціле число.- Приклад:
int('39.2')= 39
- Приклад:
min(field1, ..., fieldx): Повертає мінімальне значення серед переданих полів.- Приклад:
min(${father_age}, ${mother_age})поверне вік батька або матері, залежно від того, який менший.
- Приклад:
max(field1, ..., fieldx): Повертає максимальне значення серед переданих полів.- Приклад:
max(${father_age}, ${mother_age})поверне вік батька або матері, залежно від того, який більший.
- Приклад:
format-number(field): Форматує значення цілочисельного або десяткового поля відповідно до налаштувань локалі користувача.- Приклад:
format-number(${income})може форматувати “120000” як “120,000”.
- Приклад:
round(field, digits): Округляє числове значення поля до вказаної кількості знаків після десяткової крапки.- Приклад:
round(${interest_rate}, 2)
- Приклад:
abs(number): Повертає абсолютне значення числа.pow(base, exponent): Повертає значення першого параметру, піднесеного до степеня другого параметру.- Кожен параметр може бути полем, числом або виразом.
log10(fieldorvalue): Повертає логарифм за основою десять переданого поля або значення.sin(fieldorvalue): Повертає синус переданого поля або значення, виражений у радіанах.cos(fieldorvalue): Повертає косинус переданого поля або значення, виражений у радіанах.tan(fieldorvalue): Повертає тангенс переданого поля або значення, виражений у радіанах.asin(fieldorvalue): Повертає арксинус переданого поля або значення, виражений у радіанах.acos(fieldorvalue): Повертає арккосинус переданого поля або значення, виражений у радіанах.atan(fieldorvalue): Повертає арктангенс переданого поля або значення, виражений у радіанах.atan2(x, y): Повертає кут у радіанах між точкою з координатами (x, y) та позитивною вісью x. Результат знаходиться в діапазоні від -pi() до pi().sqrt(fieldorvalue): Повертає невід’ємний квадратний корінь переданого поля або значення.exp(x): Повертає значення e^x.pi(): Повертає значення числа пі.
Функції дати та часу
Значення дат у rtSurvey зберігаються як рядки у форматі YYYY-MM-DD. Значення datetime зберігаються як рядки ISO 8601 (YYYY-MM-DDTHH:MM:SS). Використовуйте decimal-date-time() для перетворення на число для арифметики (наприклад, обчислення тривалостей).
today(): Повертає сьогоднішню дату як рядок у форматіYYYY-MM-DD. Оцінюється один раз при відкритті форми.- Приклад:
today()→'2024-03-15' - Поширене використання: стовпець
defaultдля попереднього заповнення сьогоднішньою датою, або вrelevant/constraintдля порівняння з полем дати.
- Приклад:
now(): Повертає поточну дату та час як рядок ISO 8601. Оцінюється кожного разу, коли обчислюється вираз.- Приклад:
now()→'2024-03-15T14:32:00.000+03:00' - Поширене використання: Запис точної позначки часу конкретної події під час опитування.
- Приклад:
date(value): Перетворює значення (рядок або число) на рядок дати. Корисно для приведення обчислених значень до типу дати.- Приклад:
date('2024-03-15')→'2024-03-15'
- Приклад:
date-time(value): Перетворює значення на рядок datetime.- Приклад:
date-time(${event_timestamp})
- Приклад:
decimal-date-time(value): Перетворює рядок дати або datetime на десяткове число, що представляє мілісекунди з початку епохи Unix, поділені на 86400000 (тобто дробові дні з 1970-01-01). Використовуйте це для виконання арифметики з датами.- Приклад: Тривалість у днях між двома датами:
decimal-date-time(${end_date}) - decimal-date-time(${start_date}) - Приклад: Тривалість у хвилинах між двома datetime:
(decimal-date-time(${end_time}) - decimal-date-time(${start_time})) * 1440
- Приклад: Тривалість у днях між двома датами:
format-date(date, format): Форматує значення дати за допомогою рядка шаблону.- Токени формату:
%Y(4-значний рік),%y(2-значний рік),%m(місяць 01–12),%d(день 01–31),%a(скорочений день тижня),%b(скорочена назва місяця) - Приклад:
format-date(today(), '%d/%m/%Y')→'15/03/2024' - Приклад:
format-date(${dob}, '%B %d, %Y')→'March 15, 1990'
- Токени формату:
format-date-time(datetime, format): Форматує значення datetime за допомогою рядка шаблону. Приймає всі токениformat-dateплюс:%H(година 00–23),%h(година 01–12),%M(хвилини 00–59),%S(секунди 00–59),%3(мілісекунди),%P(AM/PM)- Приклад:
format-date-time(now(), '%d/%m/%Y %H:%M')→'15/03/2024 14:32' - Приклад:
format-date-time(${event_time}, '%I:%M %p')→'02:32 PM'
Boolean функції
boolean(value): Перетворює будь-яке значення на boolean. Повертаєtrueдля непорожніх рядків, ненульових чисел таtrue; повертаєfalseдля порожніх рядків,0таfalse.- Приклад:
boolean(${name})повертаєtrue, якщоnameне порожнє.
- Приклад:
boolean-from-string(string): Повертаєtrue, якщо рядок —'1'або'true'(без урахування регістру); повертаєfalseв іншому випадку.- Приклад:
boolean-from-string(${enabled_flag})— корисно, коли поле зберігає'true'/'false'як текст.
- Приклад:
true(): Повертає boolean значенняtrue.- Приклад: У стовпці
requiredtrue()еквівалентноyes.
- Приклад: У стовпці
false(): Повертає boolean значенняfalse.- Приклад:
if(${skip_section} = 'yes', false(), true())— динамічне встановлення обов’язковості.
- Приклад:
not(expression): Повертає логічне заперечення виразу. Повертаєtrue, якщо вираз хибний, і навпаки.- Приклад:
not(${consent} = 'yes')— показати попередження, коли згода НЕ надана. - Приклад:
not(selected(${issues}, 'none'))— вимагати деталі, лише якщо “none” не обрано.
- Приклад:
Додаткові рядкові функції
starts-with(string, prefix): Повертаєtrue, якщоstringпочинається зprefix.- Приклад:
starts-with(${phone}, '+254')перевіряє, чи номер телефону починається з коду країни Кенії.
- Приклад:
contains(string, substring): Повертаєtrue, якщоstringміститьsubstring.- Приклад:
contains(${email}, '@')перевіряє, що адреса електронної пошти має знак@. - Приклад:
contains(${notes}, 'urgent')запускає подальше питання, якщо примітки згадують “urgent”.
- Приклад:
substring-before(string, needle): Повертає частинуstring, що з’являється перед першим входженнямneedle.- Приклад:
substring-before(${full_name}, ' ')витягує перше слово (ім’я).
- Приклад:
substring-after(string, needle): Повертає частинуstring, що з’являється після першого входженняneedle.- Приклад:
substring-after(${email}, '@')витягує доменну частину адреси електронної пошти.
- Приклад:
normalize-space(string): Видаляє початкові та кінцеві пробіли та згортає всі внутрішні послідовності пробілів до одного пробілу.- Приклад:
normalize-space(${name})— очищає ім’я, яке може бути набрано з зайвими пробілами.
- Приклад:
translate(string, search_chars, replace_chars): Замінює кожен символ уstring, що з’являється уsearch_chars, відповідним символом уreplace_chars. Символи уsearch_charsбез відповідного символу уreplace_charsвидаляються.- Приклад:
translate(${code}, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')перетворює на верхній регістр (еквівалентноupper()). - Приклад:
translate(${phone}, ' -()', '')видаляє пробіли, тире та дужки з номера телефону.
- Приклад:
Додаткові математичні функції
floor(number): Повертає найбільше ціле число, менше або рівнеnumber(округлює у бік від’ємної нескінченності).- Приклад:
floor(4.9)= 4,floor(-2.1)= -3
- Приклад:
ceiling(number): Повертає найменше ціле число, більше або рівнеnumber(округлює у бік позитивної нескінченності).- Приклад:
ceiling(4.1)= 5,ceiling(-2.9)= -2
- Приклад:
random(): Повертає випадкове десяткове число від 0.0 (включно) до 1.0 (виключно). Зазвичай використовується в поляхcalculateдля присвоєння випадкових значень або рандомізації порядку питань.- Приклад:
random()→ наприклад,0.7341 - Приклад:
int(random() * 6) + 1→ випадкове число 1–6 (кидок кубика)
- Приклад:
coalesce(a, b): Повертаєa, якщоaне порожнє; в іншому випадку повертаєb. Корисно як запасний варіант, коли поле може бути порожнім.- Приклад:
coalesce(${preferred_name}, ${full_name})— використовувати переважне ім’я, якщо встановлено, інакше повертатися до повного імені.
- Приклад:
once(value): Оцінюєvalueта зберігає його, але лише якщо поточне поле порожнє. Якщо поле вже має значення (наприклад, було раніше встановлено),once()повертає наявне значення незмінним. Це запобігає перезапису введення користувача повторним обчисленням.- Приклад:
once(today())у стовпціdefaultвстановлює сьогоднішню дату один раз і не оновлює, якщо анкетер повторно відкриває форму. - Приклад:
once(uuid())генерує UUID один раз і зберігає його стабільним при повторному редагуванні.
- Приклад:
Геофункції
area(geoshape_value): Обчислює площу у квадратних метрах, обмежену значенням geoshape (полігону).- Параметр — значення geoshape у форматі
lat1 lon1 0 0; lat2 lon2 0 0; ... - Приклад:
area(${field_boundary})— обчислити площу обстеженого поля у м². - Приклад:
round(area(${field_boundary}) div 10000, 2)— конвертувати в гектари.
- Параметр — значення geoshape у форматі
distance(coordinates): Обчислює загальну довжину шляху у метрах geotrace (лінії) або відстань між двома точками geopoint.- Для geotrace:
distance(${route})повертає загальну довжину шляху у метрах. - Для двох geopoint:
distance(concat(${point_a}, ' ', ${point_b}))повертає відстань між ними. - Приклад:
round(distance(${road_trace}) div 1000, 3)— довжина дороги у кілометрах.
- Для geotrace:
Функції валідації
regex(value, pattern): Повертаєtrue, якщоvalueвідповідає регулярному виразуpattern. Використовуйте у стовпціconstraintдля валідації за шаблоном.- Шаблон використовує стандартний синтаксис regex (підмножина POSIX ERE).
- Приклад:
regex(., '^[0-9]{10}$')— перевірка 10-значного числа. - Приклад:
regex(., '^[A-Z]{2}[0-9]{6}$')— перевірка формату номера паспорта (2 великі літери та 6 цифр). - Приклад:
regex(., '^[^@]+@[^@]+\.[^@]{2,}$')— базова перевірка формату електронної пошти.
checklist(min, max, v1, v2, ...): Оцінює список boolean виразів та повертаєtrue, якщо кількість значеньtrueзнаходиться міжminтаmax(включно). Передайте-1дляminабоmax, щоб пропустити цю межу.- Приклад:
checklist(2, 3, ${q1} = 'yes', ${q2} = 'yes', ${q3} = 'yes')— проходить, якщо рівно 2 або 3 з трьох умов є істинними. - Приклад:
checklist(1, -1, ${smoke_alarm}, ${fire_ext}, ${emergency_plan})— принаймні один захід безпеки повинен бути істинним.
- Приклад:
weighted-checklist(min, max, v1, w1, v2, w2, ...): Якchecklist(), але кожне значення має вагу. Сума ваг для значеньtrueповинна бути міжminтаmax.- Приклад:
weighted-checklist(10, -1, ${has_toilet}, 4, ${has_sink}, 3, ${has_shower}, 5)— сума ваг для наявних зручностей повинна бути не менше 10.
- Приклад:
Службові функції
uuid(): Генерує випадковий UUID (формат RFC 4122 v4) як рядок.- Приклад:
uuid()→'a3f8b2c1-4d5e-6f7a-8b9c-0d1e2f3a4b5c' - Зазвичай використовується з
once()для генерації стабільного унікального ідентифікатора:once(uuid())
- Приклад:
version(): Повертає значення атрибутуversionформи, встановленого в таблиці settings.- Приклад:
version()→'3.1' - Корисно в полях
calculateдля вбудовування версії форми в експортовані дані.
- Приклад:
position(): При виклику всередині групи повторів повертає 1-базований індекс поточного екземпляру повтору.- Приклад:
position()у першому екземплярі повертає1, у другому —2, і так далі. - Дивіться також:
index()(псевдонім),indexed-repeat()для посилання на значення повторів ззовні групи.
- Приклад:
thousandsep(length, separator, value): Форматує число з роздільником тисяч.length— мінімальна загальна довжина рядка (доповнюється пробілами, якщо коротший),separator— символ для використання (наприклад,','),value— число для форматування.- Приклад:
thousandsep(0, ',', 1234567)→'1,234,567' - Приклад:
thousandsep(0, '.', ${income})→ форматує дохід з крапкою як роздільником тисяч.
- Приклад:
substr-jsonpath(value, jsonpath): Витягує підрядок з рядка JSON за допомогою виразу JSONPath.- Приклад:
substr-jsonpath(${api_response}, '$.data.name')— витягти полеnameз рядка JSON, збереженого вapi_response. - Зазвичай використовується разом з
callapi()для витягування конкретних значень з відповідей API.
- Приклад: