您可以在调查中使用表达式以控制问题的默认行为。 可使用 relevant 列中的表达式基于先前的答案来隐藏和显示一个或一组问题。 当通过 relevant 列中的表达式隐藏问题时,不会为该问题提交任何数据。
注:
在 ArcGIS Survey123 外业应用程序中,如果为其输入答案的问题稍后由于 relevant 表达式而隐藏,则答案将被清除。 因此如果问题再次相关,则必须输入新答案。 在 Web 应用程序中,答案不会被清除,因此如果问题再次相关,将使用之前输入的答案。
您也可以将表达式应用于 readonly 列,这可以根据表达式的结果禁用对问题或群组的输入。 required 列还支持表达式,允许调查仅在特定条件下要求用户回答问题。
注:
Web 应用程序中不支持只读表达式。
在格式为 ${field_name} 的表达式中,必须始终引用先前的问题。
问题可见性
您可以使用 body::esri:visible 列通过表达式从视图中隐藏问题。 如果该列所包含的表达式未评估为 true,则该列将隐藏该问题,同时仍保留该问题的内容。 例如,表达式 ${edit_location}='yes' 可使该问题仅在 edit_location 问题等于 yes 的情况下显示。
该行为与 relevant 列类似,这两个列都隐藏一个问题,直到该列中的表达式评估为 true 为止。 主要区别在于 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。 要将 select_multiple 问题用作表达式的一部分,您必须使用 selected 函数。 以下示例可检查用户是否在前一个问题中回答了“A”,且无论其他答案如何选择都将正常运行:
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
您还可以对日期问题执行数学表达式,这些问题将保存自 1970 年 1 月 1 日起至今的毫秒数,即新纪元时间。 仅当前一个问题的答案距今为止超过两周时,以下表达式才会显示问题:
if( ${previous_question}='',false,today() - ${previous_question} > 1000*60*60*24*15)
正则表达式
正则表达式是用于匹配字符串中的模式的字符序列。 在 Survey123 中,如果模式匹配,则表达式将返回 true;否则,如果模式不匹配,则表达式将返回 false。
可以在接受表达式的任何列中使用正则表达式以更改问题的行为,除非另一个问题提供的字符串采用给定的格式。 如果放置在 relevant 列中,则仅当另一个问题的答案中包含字母时,以下示例才会显示问题:
regex(${question},'[A-Za-z]')
如果放置在街道名称 select_one 问题的 choice_filter 列中时,以下示例将仅显示 citystreets 列表中包含的街道选项,这些街道与在上一个名为 city 的问题中选择的城市名称相匹配:
regex(citystreets,${city})
有关正则表达式的详细信息,请参阅公式。