字符串函数

rtSurvey 支持各种函数,包括:

  1. string(field):将字段转换为字符串。

    • 示例:string(34.8) 将转换为 '34.8'
  2. string-length(field):返回字符串字段的长度。

    • 示例:string-length(.) > 3 and string-length(.) < 10 可用于确保当前字段在 3 到 10 个字符之间。
  3. substr(fieldorstring, startindex, endindex):返回从 startindex 开始到 endindex 之前结束的子字符串。索引从字符串第一个字符的 0 开始。

    • 示例:substr(${phone}, 0, 3) 将返回电话号码的前三位。
  4. concat(a, b, c, ...):将字段(和/或字符串)连接在一起。

    • 示例:concat(${firstname}, ' ', ${lastname}) 将通过组合 firstnamelastname 字段的值返回全名。
  5. linebreak():返回换行符。

    • 示例:concat(${field1}, linebreak(), ${field2}, linebreak(), ${field3}) 将返回三个字段值的列表,值之间带有换行符。
  6. lower():将字符串转换为全小写字符。

    • 示例:lower('Street Name') 将返回"street name"。
  7. upper():将字符串转换为全大写字符。

    • 示例:upper('Street Name') 将返回"STREET NAME"。

select_one 和 select_multiple 函数

  1. count-selected(field):返回 select_multiple 字段中选定项目的数量。

    • 示例:count-selected(.) = 3 可用作约束表达式,确保恰好选择三个选项。
  2. selected(field, value):根据是否在 select_one 或 select_multiple 字段中选择了指定值,返回 true 或 false。

    • 示例:selected(${color}, 'Blue') 可用作相关性表达式,仅在受访者选择了"蓝色"作为最喜欢颜色时显示组或字段。
    • 注意:第二个参数应始终指定选项值,而不是选项标签。使用表单定义 choices 工作表值列中的值。
  3. selected-at(field, number):返回 select_multiple 字段中指定位置的已选项目。当传递的数字为 0 时,返回第一个已选项目;为 1 时返回第二个,以此类推。

    • 示例:selected-at(${fruits}, 0) = 'Apple' 可用作相关性表达式,仅在第一个已选选项为"苹果"时显示组或字段。
    • 注意:返回值将是选项值,而不是选项标签。
  4. choice-label(field, value):返回 select_one 或 select_multiple 字段选项的标签。

    • 示例 1:choice-label(${country}, ${country}) 将返回名为 country 字段中当前选定选项的选项标签。
    • 示例 2:choice-label(${languages}, selected-at(${languages}, 0)) 将返回名为 languages 字段中第一个已选选项的标签。

重复字段函数

在 rtSurvey 中,如果您想多次提出相同的问题,可以将字段放在重复组内。这将产生同一字段的多个实例。以下函数可以帮助您处理这些重复字段及其产生的重复数据。

  1. join(string, repeatedfield):对于重复组内的字段,生成以字符串分隔的值列表。第一个参数指定用于分隔值的分隔符。

    • 示例:join(', ', ${member_name}) 将从所有输入的名称生成一个以逗号分隔的列表。
  2. join-if(string, repeatedfield, expression):与 join() 完全相同,但它使用提供的表达式检查重复组中的每个实例。如果表达式评估为 false,该项目将从输出中省略。

    • 示例:join-if(', ', ${member_name}, ${age} >= 18) 将生成仅包含成年成员(年龄 18 岁及以上)姓名的逗号分隔列表。
  3. count(repeatgroup):返回重复组当前重复的次数。

    • 示例:count(${groupname}) 将返回该组的实例数量。
  4. count-if(repeatgroup, expression):与 count() 完全相同,但它使用提供的表达式检查重复组中的每个实例。

    • 示例:count-if(${members}, ${age} >= 18) 将根据"members"重复组内的年龄字段返回成年成员的数量。
  5. sum(repeatedfield):对于重复组内的字段,计算所有值的总和。

    • 示例:sum(${loan_amount}) 将返回所有贷款的总价值。
  6. sum-if(repeatedfield, expression):与 sum() 完全相同,但它使用提供的表达式检查重复组中的每个实例。

    • 示例:sum-if(${loan_amount}, ${loan_amount} > 500) 将返回所有超过 500 的贷款总价值。
  7. min(repeatedfield):对于重复组内的字段,计算所有值的最小值。

    • 示例:min(${member_age}) 将返回组中最年轻成员的年龄。
  8. min-if(repeatedfield, expression):与 min() 完全相同,但使用提供的表达式过滤。

    • 示例:min-if(${member_age}, ${member_age} >= 18) 将返回组中最年轻成年人的年龄。
  9. max(repeatedfield):对于重复组内的字段,计算所有值的最大值。

    • 示例:max(${member_age}) 将返回组中最年长成员的年龄。
  10. max-if(repeatedfield, expression):与 max() 完全相同,但使用提供的表达式过滤。

    • 示例:max-if(${member_age}, ${member_age} >= 18) 将返回组中最年长成年人的年龄。
  11. index():在重复组内调用时,返回当前组或实例的索引号。

    • 示例:在重复组内使用 index() 时,第一个实例返回 1,第二个实例返回 2,以此类推。
  12. indexed-repeat(repeatedfield, repeatgroup, index):从重复组外部引用重复组内的字段或组。

    • 示例 1:indexed-repeat(${name}, ${names}, 1) 将在 name 字段位于名为"names"的先前重复组内时返回第一个可用名称。
    • 示例 2:indexed-repeat(${name}, ${names}, index()) 将提取与当前重复组实例编号对应的名称。
  13. rank-index(index, repeatedfield):计算重复字段指定实例的序数排名,供在重复组外部使用。排名 1 分配给具有最高值的实例,排名 2 分配给下一个最高值的实例,以此类推。

    • 示例:rank-index(1, ${random_draw}) 根据其 random_draw 字段的值与其他实例相比计算第一个实例的排名。
  14. rank-index-if(index, repeatedfield, expression):与 rank-index() 类似,但使用提供的表达式过滤。

    • 示例:rank-index-if(1, ${age}, ${age} >= 18) 在只考虑年龄大于或等于 18 的实例的情况下计算成年人组中的年龄排名。

数字函数

运算符操作示例示例答案
+加法1 + 12
-减法3 - 21
*乘法3 * 26
div除法10 div 25
mod取模9 mod 21

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):返回传入字段或值的以 10 为底的对数。

  • 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():返回 pi 的值。

日期和时间函数

  1. today():以 YYYY-MM-DD 格式的字符串返回今天的日期。在表单打开时评估一次。

    • 示例:today()'2024-03-15'
    • 常见用途:default 列预填今天的日期,或在 relevant/constraint 中与日期字段比较。
  2. now():以 ISO 8601 字符串返回当前日期和时间。每次计算表达式时都会评估。

    • 示例:now()'2024-03-15T14:32:00.000+03:00'
    • 常见用途:记录调查期间特定事件的精确时间戳。
  3. date(value):将值(字符串或数字)转换为日期字符串。

    • 示例:date('2024-03-15')'2024-03-15'
  4. date-time(value):将值转换为日期时间字符串。

    • 示例:date-time(${event_timestamp})
  5. decimal-date-time(value):将日期或日期时间字符串转换为代表自 Unix 纪元以来的毫秒数除以 86400000 的小数(即自 1970-01-01 以来的小数天数)。用于对日期进行算术运算。

    • 示例:两个日期之间的天数: decimal-date-time(${end_date}) - decimal-date-time(${start_date})
    • 示例:两个日期时间之间的分钟数: (decimal-date-time(${end_time}) - decimal-date-time(${start_time})) * 1440
  6. 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'
  7. format-date-time(datetime, format):使用模式字符串格式化日期时间值。接受所有 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 函数

  1. boolean(value):将任意值转换为 boolean。非空字符串、非零数字和 true 返回 true;空字符串、0false 返回 false

    • 示例:boolean(${name}) 如果 name 不为空则返回 true
  2. boolean-from-string(string):如果字符串为 '1''true'(不区分大小写)则返回 true;否则返回 false

    • 示例:boolean-from-string(${enabled_flag}) — 当字段将 'true'/'false' 存储为文本时很有用。
  3. true():返回 boolean 值 true

    • 示例:在 required 列中,true() 等同于 yes
  4. false():返回 boolean 值 false

    • 示例:if(${skip_section} = 'yes', false(), true()) — 动态设置必填。
  5. not(expression):返回表达式的逻辑否定。如果表达式为 false 则返回 true,反之亦然。

    • 示例:not(${consent} = 'yes') — 未获得同意时显示警告。
    • 示例:not(selected(${issues}, 'none')) — 仅在未选择"无"时要求详情。

其他字符串函数

  1. starts-with(string, prefix):如果 stringprefix 开头则返回 true

    • 示例:starts-with(${phone}, '+254') 检查电话号码是否以肯尼亚国家代码开头。
  2. contains(string, substring):如果 string 包含 substring 则返回 true

    • 示例:contains(${email}, '@') 检查邮箱地址是否有 @ 符号。
    • 示例:contains(${notes}, 'urgent') 如果备注中提到"urgent"则触发后续问题。
  3. substring-before(string, needle):返回 string 中第一次出现 needle 之前的部分。

    • 示例:substring-before(${full_name}, ' ') 提取第一个词(名字)。
  4. substring-after(string, needle):返回 string 中第一次出现 needle 之后的部分。

    • 示例:substring-after(${email}, '@') 提取邮箱地址的域名部分。
  5. normalize-space(string):去除前后空格,并将所有内部空格序列折叠为单个空格。

    • 示例:normalize-space(${name}) — 清理可能带有多余空格输入的名称。
  6. translate(string, search_chars, replace_chars):将 string 中出现在 search_chars 中的每个字符替换为 replace_chars 中对应的字符。在 search_chars 中没有对应字符的字符将被删除。

    • 示例:translate(${code}, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') 转换为大写(等同于 upper())。
    • 示例:translate(${phone}, ' -()', '') 从电话号码中删除空格、连字符和括号。

其他数学函数

  1. floor(number):返回小于或等于 number 的最大整数(向负无穷方向舍入)。

    • 示例:floor(4.9) = 4,floor(-2.1) = -3
  2. ceiling(number):返回大于或等于 number 的最小整数(向正无穷方向舍入)。

    • 示例:ceiling(4.1) = 5,ceiling(-2.9) = -2
  3. random():返回 0.0(含)到 1.0(不含)之间的随机小数。通常在 calculate 字段中使用以分配随机值或随机化问题顺序。

    • 示例:random() → 例如 0.7341
    • 示例:int(random() * 6) + 1 → 随机数 1–6(骰子)
  4. coalesce(a, b):如果 a 非空则返回 a;否则返回 b。当字段可能为空时用作回退值很有用。

    • 示例:coalesce(${preferred_name}, ${full_name}) — 如果设置了首选名称则使用,否则回退到全名。
  5. once(value):评估 value 并存储它,但仅在当前字段为空时。如果字段已有值(例如之前已设置),once() 返回现有值不变。这防止重新计算覆盖用户输入。

    • 示例:在 default 列中的 once(today()) 设置一次今天的日期,如果调查员重新打开表单也不会更新。
    • 示例:once(uuid()) 生成一次 UUID,并在重新编辑时保持稳定。

地理函数

  1. area(geoshape_value):计算 geoshape(多边形)值围成的面积(平方米)

    • 参数是格式为 lat1 lon1 0 0; lat2 lon2 0 0; ... 的 geoshape 字段值
    • 示例:area(${field_boundary}) — 计算调查田地的面积(平方米)。
    • 示例:round(area(${field_boundary}) div 10000, 2) — 转换为公顷。
  2. distance(coordinates):计算 geotrace(线)的总路径长度(米),或两个 geopoint 之间的距离。

    • 对于 geotrace:distance(${route}) 返回总路径长度(米)。
    • 对于两个 geopoint:distance(concat(${point_a}, ' ', ${point_b})) 返回它们之间的距离。
    • 示例:round(distance(${road_trace}) div 1000, 3) — 道路长度(公里)。

验证函数

  1. regex(value, pattern):如果 value 与正则表达式 pattern 匹配则返回 true。在 constraint 列中用于基于模式的验证。

    • 该模式使用标准 regex 语法(POSIX ERE 子集)。
    • 示例:regex(., '^[0-9]{10}$') — 验证 10 位数字。
    • 示例:regex(., '^[A-Z]{2}[0-9]{6}$') — 验证护照号码格式(2 个大写字母后跟 6 位数字)。
    • 示例:regex(., '^[^@]+@[^@]+\.[^@]{2,}$') — 基本邮箱格式检查。
  2. checklist(min, max, v1, v2, ...):评估 boolean 表达式列表,如果 true 值的数量在 minmax(含)之间则返回 true。传递 -1minmax 以跳过该边界。

    • 示例:checklist(2, 3, ${q1} = 'yes', ${q2} = 'yes', ${q3} = 'yes') — 如果三个条件中恰好有 2 或 3 个为真则通过。
    • 示例:checklist(1, -1, ${smoke_alarm}, ${fire_ext}, ${emergency_plan}) — 至少一个安全措施必须为真。
  3. weighted-checklist(min, max, v1, w1, v2, w2, ...):与 checklist() 类似,但每个值有一个权重。true 值的权重之和必须在 minmax 之间。

    • 示例:weighted-checklist(10, -1, ${has_toilet}, 4, ${has_sink}, 3, ${has_shower}, 5) — 现有设施的权重之和必须至少为 10。

实用函数

  1. uuid():生成随机 UUID(RFC 4122 v4 格式)字符串。

    • 示例:uuid()'a3f8b2c1-4d5e-6f7a-8b9c-0d1e2f3a4b5c'
    • 通常与 once() 一起使用以生成稳定的唯一 ID:once(uuid())
  2. version():返回 settings 工作表中设置的表单 version 属性的值。

    • 示例:version()'3.1'
    • calculate 字段中用于将表单版本嵌入导出数据中很有用。
  3. position():在重复组内调用时,返回当前重复实例的从 1 开始的索引。

    • 示例:在第一个实例中 position() 返回 1,在第二个实例中返回 2,以此类推。
    • 另请参见:index()(别名),indexed-repeat() 用于从组外部引用重复值。
  4. thousandsep(length, separator, value):用千位分隔符格式化数字。length 是最小总字符串长度(如果较短则用空格填充),separator 是要使用的字符(例如 ','),value 是要格式化的数字。

    • 示例:thousandsep(0, ',', 1234567)'1,234,567'
    • 示例:thousandsep(0, '.', ${income}) → 使用句点作为千位分隔符格式化收入。
  5. substr-jsonpath(value, jsonpath):使用 JSONPath 表达式从 JSON 字符串中提取子字符串。

    • 示例:substr-jsonpath(${api_response}, '$.data.name') — 从存储在 api_response 中的 JSON 字符串中提取 name 字段。
    • 通常与 callapi() 一起使用以从 API 响应中提取特定值。
此页面有帮助吗?