Вы можете использовать выражение в опросе для управления поведением ответов по умолчанию. Вопрос или группу вопросов можно скрывать и показывать, в зависимости от предыдущих ответов, используя выражения в столбце relevant. Вопрос, спрятанный в выражении в столбце relevant, не предоставляет данные.
Примечание:
В полевом приложении ArcGIS Survey123 при вводе ответа на вопрос, который позже будет скрыт из-за выражения 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 для управления видимостью вопроса, ограничения доступа, настройки по умолчанию, подсказки и обязательный статус вопросов применяются только тогда, когда вопрос является видимым.
Вы также можете контролировать видимость вопросов, используя тип вопроса hidden и оформление hidden, но эти настройки нельзя контролировать с помощью выражения.
Примечание:
Вопросы типа Изображение, Аудио и Файл не поддерживают скрытие столбцом body::esri:visible.
Простые выражения
Лучший способ использования одного их таких выражений – изменить поведение или видимость вопроса, если ранее не был дан конкретный ответ. Например, следующее выражение проверяет, верен ли ответ на предыдущий вопрос:
${previous_question} = 'true'
В следующем примере проверяется, был ли ответ на предыдущий вопрос больше или равен 100:
${previous_question} < 100
Вопрос типа select_multiple хранит значения отличным от других типов вопросов образом: каждый отмеченный ответ вводится в том порядке, в котором он был выбран, ответы разделяются запятыми. Например, выбор ответов A и B именно в таком порядке приведет к получению ответа A,B. Для использования вопроса select_multiple как части выражения необходимо использовать функцию selected. Следующий пример проверяет, ответил ли пользователь на предыдущий вопрос значением А, и работает независимо от других выбранных ответов:
selected(${previous_question}, 'A')
Функция count-selected подсчитывает количество вариантов, выбранных при ответе на вопрос select_multiple, и предоставляет число для использования в качестве оператора. В следующем примере проверяется, было ли в предыдущем вопросе выбрано более двух вариантов ответа:
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.
Регулярные выражения можно использовать в любом столбце, поддерживающем выражения, чтобы изменять поведение вопроса, если строка, предоставленная другим вопросом, находится в заданном формате. В следующем примере при размещении в столбце relevant вопрос отображается только в том случае, если на другой вопрос был дан ответ буквой:
regex(${question},'[A-Za-z]')
В следующем примере, помещенном в столбец choice_filter вопроса типа select_one для названий улиц, будут показаны только те улицы, которые содержатся в списке 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. В следующем примере, если ответ на первый вопрос будет отрицательный, то оценивается второй вопрос. Если на второй вопрос будет также будет получен отрицательный ответ, то оценивается третий вопрос. Только если ответы на вопросы один, два и три не будут утвердительными, ответ на вопрос, использующий это выражение, будет отрицательным.
if(selected(${question_one}, 'yes'), 'yes', if(selected(${question_two}, 'yes'), 'yes', if(selected(${question_three}, 'yes'), 'yes', 'no')))