Вы можете использовать выражение в опросе для управления поведением ответов по умолчанию. Вопрос или группу вопросов можно скрывать и показывать, в зависимости от предыдущих ответов, используя выражения в столбце 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')))