Выражения форм

Вы можете использовать выражение в опросе для управления поведением ответов по умолчанию. Вопрос или группу вопросов можно скрывать и показывать, в зависимости от предыдущих ответов, используя выражения в столбце relevant. Вопрос, спрятанный в выражении в столбце relevant, не предоставляет данные.

Примечание:

В Survey123 Mobile и полевом приложении при вводе ответа на вопрос, который позже будет скрыт из-за выражения relevant, ответ будет очищен. Если вопрос снова становится актуальным, необходимо ввести новый ответ. В веб-приложении ответ не очищается, поэтому, если вопрос снова становится актуальным, используется ранее введенный ответ.

Выражения можно применять также и к столбцу readonly, который может отключить ввод в вопрос или группу на основе результата выражения. Обязательный столбец также поддерживает выражения, что позволяет опросу требовать от пользователя ответа на вопрос только при определенных условиях.

Примечание:

В мобильном приложении выражения только для чтения не поддерживаются.

На предыдущие вопросы всегда следует ссылаться в выражениях в формате ${field_name}.

Видимость вопроса

Вы можете скрыть вопрос из просмотра с помощью выражения, используя body::esri:visible. Этот столбец скрывает вопрос, если выражение, которое он содержит, не соответствует истине, но содержимое самого вопроса сохраняется. Например, выражение ${edit_location}='yes' заставляет вопрос отображаться только в том случае, если вопрос edit_location задан как yes.

Это поведение аналогично столбцу relevant, поскольку оба столбца скрывают вопрос, пока выражение в столбце не будет оценено как истинное. Основное отличие заключается в том, что body::esri:visible не очищает значение ответа на вопрос, который сделан выражением невидимым и отправляет имеющееся значение в векторный слой. Используйте столбец relevant вместо body::esri:visible, если хотите, чтобы в вопросе не было вычисляемых или сохраняемых значений, если они не релевантны.

При использовании столбцов body::esri:visible и relevant для управления видимостью вопроса, ограничения доступа, настройки по умолчанию, подсказки и обязательный статус вопросов применяются только тогда, когда вопрос является видимым.

Вы также можете контролировать видимость вопросов, используя тип вопроса скрытый и оформление скрытый, но эти настройки нельзя контролировать с помощью выражения.

Примечание:

Вопросы типа Изображение, Аудио и Файл не поддерживают скрытие столбцом body::esri:visible.

Простые выражения

Лучший способ использования одного их таких выражений – изменить поведение или видимость вопроса, если ранее не был дан конкретный ответ. Например, следующее выражение проверяет, верен ли ответ на предыдущий вопрос:

${previous_question} = 'true'

В следующем примере проверяется, был ли ответ на предыдущий вопрос больше или равен 100:

${previous_question} < 100

Вопрос типа select_multiple хранит значения отличным от других типов вопросов образом: каждый отмеченный ответ вводится в том порядке, в котором он был выбран, ответы разделяются запятыми. Например, выбор ответов A и B именно в таком порядке приведет к получению ответа A,B. Для использования вопроса типа "выбрать несколько" как части выражения необходимо использовать функцию selected. Следующий пример проверяет, ответил ли пользователь на предыдущий вопрос значением А, и работает независимо от других выбранных ответов:

selected(${previous_question}, 'A')

Функция count-selected подсчитывает количество вариантов, выбранных при ответе на вопрос типа "выбрать несколько", и предоставляет число для использования в качестве оператора. В следующем примере проверяется, было ли в предыдущем вопросе выбрано более двух вариантов ответа:

count-selected(${previous_question}) > 2

Вы можете использовать функцию count-selected как ограничение для вопросов типа изображение и файл с оформлением multiline, чтобы контролировать количество отправленных файлов.

Математические выражения

В следующем примере сочетается несколько операторов и вопросов:

${previous_question} + ${other_previous_question} <= 100

При использовании математических операторов вам может потребоваться преобразование значений в числа. В предыдущем примере предполагалось, что previous_question и other_previous_question являются целыми или десятичными числами, но если типы вопросов являются строками, преобразуйте их следующим образом:

int(${previous_question}) + int(${other_previous_question}) <= 100

Вы, кроме того, можете выполнить математические выражения для вопросов типа дата, сохраняющиеся как Время эры, которое равно количеству миллисекунд, прошедших с 1 января 1970 г. Следующее выражение показывает вопрос, только если ответ на предыдущий вопрос был дан более чем за две недели до сегодняшнего дня:

if( ${previous_question}='',false,today() - ${previous_question} > 1000*60*60*24*15)

Регулярные выражения

Регулярное выражение — это последовательность символов, используемая для сопоставления шаблонов в строках. В Survey123 в случае совпадения шаблона выражение вернет значение true; в противном же случае - когда шаблон не совпадает - выражение вернет false.

Регулярное выражение может быть построено из подвыражений, список которых представлен в следующей таблице:

ПодвыражениеСопоставить

^

Соответствует началу строки.

$

Соответствует концу строки.

.

Соответствует любому символу, за исключением символу перехода на новую строку.

[...]

Соответствует любому отдельному символу в скобках.

[^...]

Соответствует любому отдельному символу вне скобок.

(re)

Группирует регулярные выражения и запоминает соответствующий текст.

(?: re)

Группирует регулярные выражения без запоминания соответствующего текста.

a| b

Соответствует или a, или b.

\A

Начало всей строки.

\b

Если за скобками, то соответствует границам слова, если в скобках соответствует символу backspace (0x08).

\B

Соответствует границам, не образующим слово.

\d

Соответствует цифрам. Эквивалентно [от 0 до 9].

\D

Соответствует не цифрам.

\G

Соответствует точке, в которой завершено последнее совпадение.

\n, \t, \e и т.д.

Соответствует новой строке, табуляции, выходу и т.д.

\N

Обратная ссылка для операции получения номера группы N.

re*

Соответствует 0 или более случаям появления предшествующего выражения.

re+

Соответствует 1 или более случаям появления предшествующего выражения.

re?

Соответствует 0 или 1 случаям появления предшествующего выражения.

re{ n}

Соответствует точному количеству случаев появления предшествующего выражения, заданному вместо n.

re{ n,}

Соответствует n или более случаям появления предшествующего выражения.

re{ n, m}

Соответствует как минимум количеству случаев, заданных n, и как максимум, заданных m, в предшествующем выражении.

\s

Соответствует символу пробела; табулятор, ввод линии, ввод формы, возврат каретки или пробел.

\S

Соответствует не пробелам.

\w

Соответствует символам слов.

\W

Соответствует символам, не образующим слово.

\z

Конец всей строки.

\Z

Конец всей строки, за исключением допустимого разделителя конечных строк.

Регулярные выражения можно использовать в любом столбце, поддерживающем выражения, чтобы изменять поведение вопроса, если строка, предоставленная другим вопросом, находится в заданном формате. В следующем примере при размещении в столбце relevant вопрос отображается только в том случае, если на другой вопрос был дан ответ буквой:

regex(${question},'[A-Za-z]')

В следующем примере, помещенном в столбец фильтр выбора вопроса типа выбрать один для названий улиц, будут показаны только те улицы, которые содержатся в списке citystreets и соответствуют названию города, выбранному в предыдущем вопросе с именем city:

regex(citystreets,${city})

Дополнительные примеры использования регулярных выражений для добавления ограничения к вопросу опроса см. в разделе Формулы.

Условные выражения

Условное выражение используется для определения того, возвращает ли утверждение (условие) значение true или false, и для возврата указанного значения для каждого случая следующим образом:

if(condition, value if true, value if false)

В примере ниже, если ответ на question_one будет «да», то ответ на текущие вопросы также будут «да». Если ответ на question_one будет отличен от «да», то ответ на текущий вопрос будет нет»:

if(selected(${question_one}, 'yes'), 'yes', 'no')

В условии можно использовать два вопроса. В следующем примере, если ответ и на вопрос question_one, и на вопрос question_two будет «да», то ответ на текущий вопрос тоже будет «да»:

if(selected(${question_one}, 'yes') and selected(${question_two}, 'yes'), 'yes', 'no')

В следующем примере, если ответ на question_one или question_two — «да», то ответ на текущий вопрос — также «да»:

if(selected(${question_one}, 'yes') or selected(${question_two}, 'yes'), 'yes', 'no')

Условные выражения также могут быть вложенными, но важно всегда включать значение как для случая true, так и для случая false. В следующем примере, если ответ на question_one не будет "да", то оценивается question_two. Если на question_two будет также будет получен отрицательный ответ, то оценивается question_three. Если ответы на вопросы question_one, question_two и question_three не будут утвердительными, ответ на вопрос, использующий это выражение, будет "нет".

if(selected(${question_one}, 'yes'), 'yes', if(selected(${question_two}, 'yes'), 'yes', if(selected(${question_three}, 'yes'), 'yes', 'no')))