简介 #
给表单中的某个字段编辑公式后,在填写表单或修改表单数据时,可以使该字段的值根据公式自动计算出来,不需要再手动填写。
应用场景 #
- 提高填写表单的效率,将一些数据自动计算出来,减少需要填写的内容。
如,分数管理中,需要设置分数在 90 以上时等级为 A,否则为 B。那么在输入分数之后,等级是 A 或 B 就能根据公式自动判断出来。
- 可避免手工计算,减少错误。
- 如,薪酬管理中,总工资=基础工资+奖金-扣款。那么在基础工资、奖金、扣款输入之后,总工资就能根据公式自动计算出来,避免手工计算出错。
设置入口 #
目前支持编辑公式的字段有 4 个:单行文本、多行文本、数字 和 日期选择。
进入 表单设计,选中要编辑公式的字段,在「字段属性 >> 默认值」处设置默认值为公式编辑,点击下方会「编辑公式」,即可开始公式编辑:

公式规则 #
简介 #
公式,可以使字段的值根据函数自动计算出来,不需要再手动填写。本文将介绍公式编辑中的编写规则,帮助您更好的设计和使用公式。
公式的组成 #
公式通常由字段、函数、运算符和标点符号组成,以如下公式为例:
ROUND(总价/数量,2)
- 字段:公式计算的数据来源,在表单字段中点击选择,如示例公式中的「总价」、「数量」;
- 函数:可以直接输入函数名称,或在函数列表中选择使用,如示例公式中的「ROUND」;
- 运算符:“+、-、*、/”等数据运算符号,直接在公式编辑区手动输入,如示例公式中的「/」;
- 标点符号:完整的公式常常需要添加标点符号进行完善,如示例公式中的逗号、括号。
公式规则 #
字段的添加规则 #
在公式编辑中,所有的字段实际上都有一个内置的 ID,而所能看见的字段名称,也仅仅是一个名称。如需在公式中插入字段,通过在字段列表中选择:在左下角的字段列表中点击字段,进行添加;

在当前/所有表单字段中选择字段 #
公式所要用到的字段,绝大多数情况下是从当前表单字段中选择。只有 MAPX 函数的最后 2 个参数会用到所有表单字段。
1)添加当前表单字段
在字段列表的「当前表单」中,选择需要添加的字段:

2)添加所有表单字段
在字段列表处切换应用-切换表单,选择对应表单中的字段:

注:从当前表单字段中选择的字段是蓝色的,从所有表单字段中选择的字段是绿色的。
运算符号 #
公式编辑中,支持的运算操作符和比较操作符如下:
| 运算规则 | 运算符号 |
| 加 | + |
| 减 | – |
| 乘 | * |
| 除 | / |
| 大于 | > |
| 小于 | < |
| 等于 | ==(注意不是=) |
| 不等于 | != |
| 大于等于 | >= |
| 小于等于 | <= |
字符数量限制 #
编辑公式时需要注意,每个公式最多添加 2000 行,且单行不能超过 10000 个字符,单行字符较多时建议使用回车键换行,而非超出编辑框自动换行。
当超出每个公式 2000 行或单行 10000 个字符限制时,会导致公式内容保存不全和无法运行公式的情况。
日期函数 #
简介 #
日期时间字段 的返回值为时间戳(timestamp),单位是毫秒;本文中的日期函数的参数均可直接使用日期字段。如,YEAR(日期时间字段)。
下面介绍关于日期函数的两个基本概念:
- 时间戳(timestamp):时间戳是计算机记录时间的一种格式。通常是一个字符序列,唯一地标识某一刻的时间。在表单中,「日期时间」字段便是由这样的序列来存储的。
- 日期对象:可以理解为年月日时分秒;日期对象的格式为 Sat Aug 01 2015 00:00:00 GMT+0800,即北京时间 2015 年 8 月 1 日 00:00:00,日期对象可以进行各种运算,比如日期加减法等等。
DATE #
DATE 函数可用于将时间戳转换为日期对象。
函数用法:
DATE(timestamp)
通过以下公式可将年月日(时分秒)转换为日期对象:
DATE(year,month,day)
DATE(year,month,day,hour,minute,second)
其中各参数的含义如下:
year: 必需,年份;
month: 必需,月份;
day: 必需,天数;
hour: 非必需,小时;
minute: 非必需,分钟;
second: 非必需,秒。
函数示例:如 2023 年 1 月 1 日的日期对象可以用如下公式表示:
- DATE(日期时间)
- DATE(2023,1,1)
- DATE(2023,1,1,0,0,0)
这三个公式都表示“Sun Jan 01 2023 00:00:00 GMT+0800”。

DAY #
DAY 函数可用于返回日期中的天数, 值是介于 1 到 31 之间的整数。
函数用法:
DAY(timestamp)
函数示例:如计算签到日期中对应的天数,可设置公式为DAY(签到日期),即 2023-01-20 对应的天数为 20。

DAYS #
DAYS 函数可计算两个日期之间的天数。
函数用法:
DAYS(end_timestamp, start_timestamp)
其中各参数的含义如下:
- end_timestamp: 必需,结束日期;
- start_timestamp: 必需,起始日期。
函数示例:如考勤请假场景中,手动输入请假开始、结束日期,设置公式为DAYS(结束日期,开始日期),即可计算出请假天数。

DAYS360 #
DAYS360 函数可按照一年 360 天的算法(每个月 30 天,一年 12 个月),返回两个日期间相差的天数。
函数用法:
DAYS360(end_timestamp, start_timestamp, method)
其中各参数的含义如下:
end_timestamp: 必需,结束日期;
start_timestamp: 必需,起始日期;
method: 可选,用于指定在计算中采用美国方法或欧洲方法,具体规则如下:
| 方法 | 定义 |
| false 或不填 | 美国 (NASD) 方法。 如果起始日期是一个月的最后一天,则等于同月的 30 号。 如果终止日期是一个月的最后一天,并且起始日期早于 30 号,则终止日期等于下一个月的 1 号,否则,终止日期等于本月的 30 号。 |
| true | 欧洲方法。 如果起始日期和终止日期为某月的 31 号,则等于当月的 30 号。 |
函数示例:在会计计算中,财会系统一般按照一年 12 个月,每月 30 天计算,可使用 DAYS360 函数计算支付款项等。

DATEDIF #
DATEDIF 函数可用于计算两个时间的差值。
函数用法:
DATEDIF(start_timestamp, end_timestamp, [unit])
其中各参数的含义如下:
- start_timestamp:必需, 开始时间;
- end_timestamp:必需,结束时间;
- Unit:可选,默认为 “d”,可设置的参数如下:
- “y”:年数
- “M”:月数
- “d”:天数
- “h”:小时数
- “m”:分钟数
- “s”:秒数
注:如结束日期小于开始日期,则计算不出结果。
函数示例:通过 DATEDIF 函数计算时间差的年数、月数、天数等,可应用于计算项目的消耗天数、活动的举办天数等。

DATEDELTA #
DATEDELTA 函数可以在指定日期的基础上增加/减少天数。
函数用法:
DATEDELTA(timestamp, deltadays)
其中各参数的含义如下:
- timestamp:必需,初始日期;
- deltadays:必需,需要加减的天数,正数为增加,负数为减少。
函数示例:如生产场景中,录入生产日期和保质期后,可通过 DATEDELTA 函数计算产品的过期时间。点击体验效果

注:DATEDELTA 函数须在日期时间字段内使用。
HOUR #
HOUR 函数可用于返回日期时间中的小时数。
函数用法:
HOUR(timestamp)
函数示例:如计算打卡时间中对应的小时数,可设置公式为HOUR(打卡时间),即 2023-01-01 14:38:01 对应的小时数为 14。点击体验效果

ISOWEEKNUM #
ISOWEEKNUM 函数可用于计算日期在全年中的 ISO 周数。
其中,ISO 周数根据 ISO 8601 的规则计算得出,具体计算方法如下:
- 每年可能有 52 周或 53 周;
- 周一至周日为一个完整周;
- 每周的周一是该周的第 1 天,周日是该周的第 7 天;
- 每年的第一周为当年的第一个周四所在的周:如 2017 年 1 月 5 日为当年的第一个周四,那么 2017-01-02 至 2017-01-08 为 2017 年第一周;
- 每年的最后一周为当年最后一个周四所在的周:如 2016 年 12 月 29 日为当年的最后一个周四,那么 2016-12-26 至 2017-01-01 为 2016 年的最后一周。
函数用法:
ISOWEEKNUM(timestamp)
函数示例:ISOWEEKNUM 函数可用于计算政府和商务的会计年度,用以维持时序。

MINUTE #
MINUTE 函数可用于返回日期时间中的分钟数。
函数用法:
MINUTE(timestamp)
函数示例:如计算打卡时间中对应的分钟数,可设置公式为MINUTE(打卡时间),即 2023-01-05 16:14:24 对应的小时数为 14。点击体验效果

MONTH #
MONTH 函数可用于返回日期中的月份, 值是介于 1 到 12 之间的整数。
函数用法:
MONTH(timestamp)
函数示例:如计算考勤日期对应的月份,可设置公式为MONTH(考勤时间),即 2023-01-02 对应的月份为 1。点击体验效果

NETWORKDAYS #
NETWORKDAYS 函数可计算两个日期之间完整的工作日数值,其中,工作日不包括周末和专门指定的假期。
函数用法:
NETWORKDAYS(start_timestamp, end_timestamp, [holidays])
其中各参数的含义如下:
- start_timestamp:必需, 开始日期;
- end_timestamp:必需,结束日期;
- holidays:可选,可填写需要从工作日中排除的一个或多个日期,如各种省/市/自治区和国家/地区的法定假日及非法定假日。
注:holidays 参数可通过如下两种方式输入:
- 使用 DATE 函数或作为其他函数的结果输入;如,使用函数 DATE(2012,5,23) 输入 2012 年 5 月 23 日;
- 直接调用子表单中的日期时间字段,主表中的日期时间字段暂不支持直接调用。
函数示例:如,计算某员工 6 月外包工资时,需将 2023 年 6 月 22 日和 2023 年 6 月 23 日制定为假期,则设置公式为NETWORKDAYS(开始时间,结束时间,[DATE(2023,6,22),DATE(2023,6,23)]),即可根据开始、结束时间计算出对应的工作天数和工资。

NOW #
NOW 函数可返回当前时间。
函数用法:
NOW()
函数示例:如签到场景中,可通过 NOW 函数生成当前时间,完成签到。点击体验效果

注:在日期时间字段中使用 NOW 函数时,时间类型可在字段属性中设置。
SYSTIME #
SYSTIME 函数可返回当前服务器时间。即使客户端的时间被人为调整了,SYSTIME 函数不受影响,获取的仍然是服务器时间。
函数用法:
SYSTIME()
函数示例:如签到、打卡等场景中,可通过 SYSTIME 函数完成记录系统时间,有效避免作弊的情况。点击体验效果

注:在日期时间字段中使用 SYSTIME 函数时,时间类型可在字段属性中设置。
SECOND #
SECOND 函数可用于返回日期时间中的秒数。
函数用法:
SECOND(timestamp)
函数示例:如计算签到时间中对应的秒数,可设置公式为SECOND(签到时间),即 2023-02-03 08:49:44 对应的秒数为 44。

TIMESTAMP #
TIMESTAMP 函数可将日期对象转换成时间戳。
函数用法:
TIMESTAMP(date)
函数示例:在日期时间字段自定义时间时,可通过 TIMESTAMP 函数将日期对象转换为时间戳格式,以便于字段生成具体时间。

TIME #
TIME 函数可返回特定时间的十进制数字。时间值为日期值的一部分,并用十进制数表示(例如 12:00 PM 可表示为 0.5,因为此时是一天的一半)。
函数用法:
TIME(hour, minute, second)
其中各参数的含义如下:
- hour: 必需,代表小时;任何大于 23 的值都会除以 24,商作为天数,余数作为小时数。 例如,TIME(27,0,0) = 1.125, TIME(3,0,0) = 0.125,即天数不同,小数部分的时间相同;
- minute: 必需,代表分钟;任何大于 59 的值将转换为小时和分钟。 例如,TIME(0,750,0) = TIME(12,30,0) = 0.520833;
- second: 必需,代表秒;任何大于 59 的值将转换为小时、分钟和秒。 例如,TIME(0,0,2000) = TIME(0,33,20) = 0.023148。
函数示例:如,生产场景中,可通过 TIME 函数计算产品的待机时长。

TODAY #
TODAY 函数可用于获取当前系统的日期,可精确到秒。
函数用法:
TODAY()
函数示例:
1)TODAY 函数可直接在日期时间字段中使用,显示的日期精度由日期时间字段的「字段属性 >> 类型」决定:

如,当设置日期时间字段类型为「年-月-日-时-分-秒」时,TODAY 函数的使用效果如下:

2)也可搭配 TEXT 函数 将获取的日期转换为文本格式,如设置公式为TEXT(TODAY(),”yyyyMMddhhmmss”),即可获取日期的年月日时分秒。

注:日期与文本格式的相互转换,可参考文档:文本与日期格式相互转换。
WEEKDAY #
WEEKDAY 函数可用于计算日期的星期数,返回 0 到 6 之间的数值。
函数用法:
WEEKDAY(日期时间)
函数示例:如计算签到日期对应的星期数,可设置公式为WEEKDAY(签到日期),即 2023-05-26 对应的星期数为 5(星期五),2023-05-28 对应的星期数为 0(星期日)。

WEEKNUM #
WEEKNUM 函数可用于计算某日期在一年中处于第几周。
函数用法:
WEEKNUM(timestamp, return_type)
其中各参数的含义如下:
- timestamp: 必需,指定日期;
- return_type:可选参数,确定一周从哪一天开始,具体参数值对应的日期如下表:
| return-type | 一周的第一天为 |
| 1/17/为空 | 星期日 |
| 2/11 | 星期一 |
| 12 | 星期二 |
| 13 | 星期三 |
| 14 | 星期四 |
| 15 | 星期五 |
| 16 | 星期六 |
注:当 return_type 的值不在上述表格范围内或未填写该参数时,默认为从星期日开始计算。
函数示例:当时间选定为 2023 年 1 月 2 日时,分别以星期日和星期一作为一周的第一天,得到的周次结果是不同的。

WORKDAY #
WORKDAY 函数可计算在某日期(起始日期)之前或之后、与该日期相隔指定工作日的某一日期的日期值。 工作日不包括周末和专门指定的假日。
函数用法:
WORKDAY(start_timestamp, days, [holidays])
其中各参数的含义如下:
- start_timestamp: 必需,起始日期;
- days: 必需,起始日期之前或之后不含周末及节假日的天数。 Days 为正值将生成未来日期;为负值则生成过去日期;
- holidays:可选,其中包含需要从工作日历中排除的一个或多个日期,例如各种省/市/自治区和国家/地区的法定假日及非法定假日。该列表可以是由日期所构成的数组常量。
注:holidays 参数可通过如下两种方式输入:
- 使用 DATE 函数或作为其他函数的结果输入;如,使用函数 DATE(2012,5,23) 输入 2012 年 5 月 23 日;
- 直接调用子表单中的日期时间字段,主表中的日期时间字段暂不支持直接调用。
函数示例:如,计算交货时间时,需将 2023 年 4 月 5 日制定为假期,则设置公式为WORKDAY(下单时间,处理工作日,[DATE(2023,4,5)]),扣除周末和假期,即可根据下单时间计算出对应的交货时间。

YEAR #
YEAR 函数可用于返回日期时间中的年份。
函数用法:
YEAR(timestamp)
函数示例:如计算生产时间中对应的秒年份,可设置公式为YEAR(生产日期),即 2023-02-10 对应的年份为 2023。

数学函数 #
ABS #
ABS 函数可用于返回数字的绝对值
函数用法:
ABS(number)
函数示例:如,ABS(-12)和ABS(12)的返回结果均为 12。

AVERAGE #
AVERAGE 函数可用于计算一组数值的算术平均值。
函数用法:
AVERAGE(数字1,数字2,…)
函数示例:
AVERAGE(1,3,5),返回结果为 3
CEILING #
CEILING 函数可以将参数 number 向上/向下舍入为最接近的指定基数的倍数。
函数用法:
CEILING(number, significance)
其中各参数的含义如下:
- number: 必需。 要舍入的值。
- significance: 必需。 要舍入到的倍数。
对于不同符号的参数搭配,具体计算规则如下:
- 当 number 为正时,不管 significance 为正或为负,对值按远离 0 的方向进行向上舍入;
- 当 number 为负,significance 为正时,对值按朝向 0 的方向进行向上舍入;
- 当 number 和 significance 都为负时,对值按远离 0 的方向进行向下舍入。
应用示例:
| 公式 | 说明 | 结果 |
| CEILING(10, 3) | 将 10 向上舍入到最接近的 3 的倍数 | 12 |
| CEILING(10, -3) | 将 10 向上舍入到最接近的 -3 的倍数 | 12 |
| CEILING(-10, 3) | 将 -10 向上舍入到最接近的 3 的倍数 | -9 |
| CEILING(-10, -3) | 将 -10 向下舍入到最接近的 -3 的倍数 | -12 |
COS #
COS 函数可用于计算角度的余弦值,返回 -1 到 1 之间的数值。
函数用法:
COS(弧度)
使用该函数时,需要将角度转化为弧度参与计算,可通过 RADIANS 函数 将角度转化为弧度。
函数示例:如计算 COS(60°) 的值,可设置公式为COS(RADIANS(60)),返回 0.5。

COT #
COT 函数可用于计算角度的余切值。
函数用法:
COT(弧度)
使用该函数时,需要将角度转化为弧度参与计算,可通过 RADIANS 函数 将角度转化为弧度。
函数示例:如计算 COT(45°) 的值,可设置公式为COT(RADIANS(45)),返回 1。

COUNT #
COUNT(value1, value2, …)
统计参数个数,value 代表不同的值。示例:COUNT(“张三”,”李四”,”王五”,”田二”),返回结果为 4
COUNTIF #
COUNTIF(value1, value2, …, criteria)
统计满足条件的参数个数,value 代表不同的值,criteria 为判断条件。示例: COUNTIF([1,2,3,4], “>2”),返回结果为2
COUNTIF([1,2,3,4], “!=2”),返回结果为3
COUNTIF([1,2,3,4], “>=1”),返回结果为4
COUNTIF([“a”, “b”, “c”], “d”),返回结果为0
FLOOR #
FLOOR(number, significance)
将参数 number 向下舍入为最接近的 significance 的倍数。
- number: 必需。 要舍入的数值。
- significance: 必需。 要舍入到的倍数。
用法同 CEILING
FIXED #
FIXED(number, [decimals])
将数字舍入到指定的小数位数,以十进制数格式对该数进行格式设置,并以文本形式返回结果。
- number: 必需。 要进行舍入并转换为文本的数字。
- decimals: 可选。 小数点右边的位数。
INT #
INT(number)
将数字向下舍入到最接近的整数。


LARGE #
LARGE(array,k)
- Array: 必需。 需要确定第 k 个最大值的数组或数据区域。
- k:必需。 返回值在数组中的位置(从大到小排)。
返回数据集中第 k 个最大值。示例:
LARGE([89,98,76],1),返回结果为 98
LOG #
LOG(number, [base])
根据指定底数返回数字的对数。
- number:必需。 想要计算其对数的正实数。
- base: 可选。 对数的底数。 如果省略 base,则假定其值为 10。
MOD #
MOD(number, divisor)
返回两数相除的余数。 结果的符号与除数相同。
- number: 必需。 要计算余数的被除数。
- divisor:必需。 除数。


MAX #
MAX(number1, number2, …)
返回一组值中的最大值。示例:
MAX(1,5,3),返回结果为 5
MIN #
MIN(number1, number2, …)
返回一组值中的最小值。示例:
MIN(1,5,3),返回结果为 1
POWER #
POWER(number, power)
返回数字乘幂的结果。
- number: 必需。 基数。 可为任意实数。
- power: 必需。 基数乘幂运算的指数。
PRODUCT #
PRODUCT(number1, [number2], …)
函数使所有以参数形式给出的数字相乘并返回乘积。

当然,也可以直接相乘

两种效果是一样的

RADIANS #
RADIANS 函数可用于将角度转化为弧度。
函数用法:
RADIANS(角度)
函数示例:如计算 180° 对应的弧度,可设置公式为RADIANS(180),返回 3.14159265。

RAND #
RAND()
返回大于等于 0 且小于 1 的均匀分布随机实数。每一次触发计算都会变化。
用法举例:
| 公式 | 含义 |
| RAND() | 大于等于 0 但小于 1 的一个非整数的随机数 |
| RAND()*100 | 大于等于 0 但小于 100 的一个非整数的随机数 |
| RAND()*(b-a)+a | 大于等于 a 但小于 b 的非整数的随机数 |
| INT(RAND()*(b-a)+a) | 大于等于 a 但小于 b 的随机整数 |
场景举例:
| 抽题方式 | 分析 | 公式 |
| 在第 20 到第 30 道题目中随机抽取一题(包括第 20 题,不包括第 30 题) | 大于等于 20 但小于 30 | INT(RAND()*(30-20)+20) |
| 在第 20 到第 30 道题目中随机抽取一题(包括第 20 题和第 30 题) | 大于等于 20 但小于 31 | INT(RAND()*(31-20)+20) |
| 在第 20 到第 30 道题目中随机抽取一题(不包括第 20 题,包括第 30 题) | 大于等于 21 但小于 31 | INT(RAND()*(31-21)+21) |
| 在第 20 到第 30 道题目中随机抽取一题(不包括第 20 题和第 30 题) | 大于等于 21 但小于 30 | INT(RAND()*(30-21)+21) |
应用举例:
通过 rand 函数给应考人员随机抽取一道题试题,具体可以参考案例详解「如何随机抽取题目」。
ROUND #
ROUND(number, num_digits)
- number: 必需。 要四舍五入的数字。
- num_digits: 必需。 要进行四舍五入运算的位数。
将数字四舍五入到指定的位数。示例:
ROUND(88/3,2),返回结果为 29.33
SIN #
SIN 函数可用于计算角度的正弦值,返回 -1 到 1 之间的数值。
函数用法:
SIN(弧度)
使用该函数时,需要将角度转化为弧度参与计算,可通过 RADIANS 函数 将角度转化为弧度。
函数示例:如计算 SIN(30°) 的值,可设置公式为SIN(RADIANS(30)),返回 0.5。

SMALL #
SMALL(array,k)
- Array: 必需。 需要确定第 k 个最小值的数组或数据区域。
- k: 必需。 返回值在数组中的位置(从小到大排)。
返回数据集中第 k 个最小值,用法同 LARGE 函数。示例:
SMALL([89,98,76],1),返回结果为 76
SQRT #
SQRT(number)
返回正的平方根。
SUM #
SUM(number1, [number2], …)
函数使所有以参数形式给出的数字相加并返回和。


SUMIF #
SUMIF 函数可用于计算子表单中满足某一条件的数字相加并返回和。
函数用法:
SUMIF(range, criteria, [sum_range])
其中各参数的含义及使用方法如下:
- range:必需;根据 criteria 的条件规则进行检测的判断字段。支持的字段包括:子表单中的数字、单行文本、下拉框、单选按钮组;
- criteria:必需;用于判断的条件规则。支持的形式和使用规则如下表:
| 支持形式 | 是否需要加引号 | 示例 | 注意事项 |
| 数字 | 不需要 | 20、32 | |
| 表达式 | 需要 | “>32”、”!=苹果” | 支持的运算符号包括:>、<、==、!=、>=、<= |
| 文本 | 需要 | “苹果”、”水果” | |
| 字段 | 不需要 | 字段 | 1)在主表字段中使用 SUMIF 函数时,只能选择主表字段2)在子表字段中使用 SUMIF 函数时,只能选择择主表字段和当前子表字段 |
- sum_range:非必需;用于求和的计算字段,省略此参数时,即自动对 range 进行求和计算。支持的字段包括:子表单中的数字、单行文本、下拉框、单选按钮组。
函数示例:如,计算入库明细中产品类型为「水果」的全部入库数量,则可以在「水果类数量总计」字段设置公式为:
SUMIF(入库明细.产品类型,”水果”,入库明细.数量)

SUMIFS #
SUMIFS 函数用于计算子表单中满足多个条件的数字相加并返回和。
函数用法:
SUMIFS(sum_range, criteria_range1, criteria1, [criteria_range2, criteria2], …)
- sum_range:必需;用于求和的计算字段。支持的字段包括:子表单中的数字、单行文本、下拉框、单选按钮组;
- criteria_range1:必需;根据 criteria1 的条件规则进行检测的判断字段 1。支持的字段包括:子表单中的数字、单行文本、下拉框、单选按钮组;
- criteria1:必需;用于判断的条件规则 1。支持的形式和使用规则如下表:
| 支持形式 | 是否需要加引号 | 示例 | 注意事项 |
| 数字 | 不需要 | 20、32 | |
| 表达式 | 需要 | “>32”、”!=苹果” | 支持的运算符号包括:>、<、==、!=、>=、<= |
| 文本 | 需要 | “苹果”、”水果” | |
| 字段 | 不需要 | 字段 | 1)在主表字段中使用 SUMIFS 函数时,只能选择主表字段2)在子表字段中使用 SUMIFS 函数时,只能选择择主表字段和当前子表字段 |
- [criteria_range2, criteria2], …:非必需;规则同上。
注:
1)所有的 criteria_range 必须与 sum_range 来自同一个子表单,否则将计算失败;criteria_range 可以与 sum_range 选择同一字段;
2)数量上限:最多可以输入 127 个条件对,即本函数最少需要3个参数,最多可输入 255 个参数。
函数示例:如,计算入库明细中水果名称为「苹果」,且种类为「红富士」的全部入库数量,则可以在「红富士苹果数量总计」字段设置公式为:
SUMIFS(入库明细.数量,入库明细.水果名称,”苹果”,入库明细.水果种类,”红富士”)

SUMPRODUCT #
SUMPRODUCT(array1, [array2])
在给定的数组中,将数组间对应的元素相乘,并返回乘积之和。
array: 可选。多个数字数组。
主要可用于计算加权和。例如:SUMPRODUCT([1,2,3],[0.1,0.2,0.3]),相当于 1×0.1 + 2×0.2 + 3×0.3=1.4

TAN #
TAN 函数可用于计算角度的正切值。
函数用法:
TAN(弧度)
使用该函数时,需要将角度转化为弧度参与计算,可通过 RADIANS 函数 将角度转化为弧度。
函数示例:如计算 TAN(45°) 的值,可设置公式为TAN(RADIANS(45)),返回 1。

MAPX #
MAPX 函数是一个“跨表单”函数。即其他所有函数都是在当前表单运算的函数,无法调用当前表单中已经提交的或其他表单中数据;而 MAPX 函数可以在一定程度上弥补这样的不足。
函数用法:
MAPX(operation, map_value, map_field, result_field)
其中各参数的含义如下:
- operation: 聚合操作,必填;
- map_value: 条件字段值,即检索值,必填;
- map_field: 条件字段名,即检索范围,必填;
- result_field:字段返回值,必填。
当指定表单的 map_field 列的值为 map_value 时,返回 result_field 的所有值,然后根据指定的聚合操作 operation 得到对应的返回值。
可以理解为:在检索范围中,找到检索值对应的返回值,并对返回值进行聚合操作。
MAPX(“聚合操作”,检索值,检索范围,返回值)
注意检索值来自当前表单中(蓝底),检索范围和返回值来自所有表单字段中的同一表单(绿底)。

具体操作步骤如下:

参数限制:
1)聚合操作(operation)
operation 参数(聚合操作)为字符串,可选值如下::
| 参数值 | 含义 |
| first | 获取返回值的第一个 |
| last | 获取返回值的最后一个 |
| max | 最大值 |
| min | 最小值 |
| avg | 平均值 |
| sum | 求和 |
| count | 获取返回值的个数 |
2)检索值(map_value)、检索范围(map_field)
支持设置检索值的字段,及其对应支持的检索范围字段如下表所示:
| 检索值 | 检索范围 |
| 单行文本 | 单行文本、多行文本、单选按钮组、复选框组、下拉框、下拉复选框、流水号、微信昵称、微信 OpenID、扩展字段 |
| 数字 | 数字 |
| 多行文本 | 单行文本、多行文本、单选按钮组、复选框组、下拉框、下拉复选框、流水号、微信昵称、微信 OpenID、扩展字段 |
| 日期时间 | 日期时间、提交时间、更新时间 |
| 单选按钮组 | 单行文本、多行文本、单选按钮组、复选框组、下拉框、下拉复选框、流水号、微信昵称、微信 OpenID、扩展字段 |
| 复选框组 | 复选框组、下拉复选框(全等) |
| 下拉框 | 单行文本、多行文本、单选按钮组、复选框组、下拉框、下拉复选框、流水号、微信昵称、微信 OpenID、扩展字段 |
| 下拉复选框 | 复选框组、下拉复选框(全等) |
| 微信昵称 | 单行文本、多行文本、单选按钮组、复选框组、下拉框、下拉复选框、流水号、微信昵称、微信 OpenID、扩展字段 |
| 微信 OpenID | 单行文本、多行文本、单选按钮组、复选框组、下拉框、下拉复选框、流水号、微信昵称、微信 OpenID、扩展字段 |
| 扩展字段 | 单行文本、多行文本、单选按钮组、复选框组、下拉框、下拉复选框、流水号、微信昵称、微信 OpenID、扩展字段 |
注:当检索值为日期时间字段时,需要设置为 DATE(检索值),才能检索成功,检索范围直接使用日期时间字段即可;如:MAPX(“COUNT”,DATE(日期时间),日期时间,单行文本)。
3)返回值(result_field)
以 A 表设置 MAPX 公式,跨表取 B 表数据:MAPX(“聚合操作”,字段1,字段2,“返回值”)为例,根据不同的聚合操作,支持设置返回值的字段如下:
| 聚合操作 | 支持的返回值字段 | 返回值计算方法 |
| first | 单行文本、多行文本、数字、日期时间、单选按钮组、复选框组、下拉框、下拉复选框、流水号、微信昵称、微信 OpenID、提交时间、更新时间、扩展字段 | 取字段 1=字段 2时,B 表中第一条入库的数据对应的返回字段值 |
| last | 单行文本、多行文本、数字、日期时间、单选按钮组、复选框组、下拉框、下拉复选框、流水号、微信昵称、微信 OpenID、提交时间、更新时间、扩展字段 | 取字段 1=字段 2时,B 表中最后入库的数据对应的返回字段值 |
| max | 数字 | 取字段 1=字段 2时,B 表所有数据数字字段的最大值 |
| 单行文本、多行文本、日期时间、单选按钮组、复选框组、下拉框、下拉复选框、流水号、微信昵称、微信 OpenID、提交时间、更新时间、扩展字段 | 取字段 1=字段 2时,B 表所有数据按照字符串比较,返回对应字符串最大值 | |
| min | 数字 | 取字段 1=字段 2时,B 表所有数据数字字段的最小值 |
| 单行文本、多行文本、日期时间、单选按钮组、复选框组、下拉框、下拉复选框、流水号、微信昵称、微信 OpenID、提交时间、更新时间、扩展字段 | 取字段 1=字段 2时,B 表所有数据按照字符串比较,返回对应字符串最小值 | |
| avg | 数字 | 取字段 1=字段 2时,B 表所有数据数字字段的平均值 |
| sum | 数字 | 取字段 1=字段 2时,B 表所有数据数字字段的求和 |
| count | 单行文本、多行文本、数字、日期时间、单选按钮组、复选框组、下拉框、下拉复选框、流水号、地址、定位、微信昵称、微信 OpenID、提交人、提交时间、更新时间、扩展字段 | 取字段 1=字段 2时,B 表录入了多少条匹配的数据 |
注:
1)检索范围和返回值中的字段不能选择子表单字段;
2)检索值不能为成员字段,当需要以成员字段计算时,可以先将成员字段转成文本字段保存编号,然后以文本字段来计算,检索范围字段也是一样的设置。
函数示例:
跨表有两种情况:
1)同 1 张表单,录入数据时调用之前已经提交的数据;
2)2 张表单,A 表录入数据时,调用 B 表已经录入的数据。
应用举例:单条件
有一张选课表,在选择课程时,需要计算出自己是第几个报名的,即计算出某一课程的已报名人数,再+1。
可以看出,此处的检索值为课程,选了哪门课程,就统计这门课程的已报名人数。则公式为:
MAPX(“COUNT”,课程,课程,姓名)
对“我是第几个报名的”字段进行编辑函数:
MAPX(“COUNT”,课程,课程,姓名)+1

对于这个例子,可理解为:在之前录入的数据里,寻找「课程」字段选择了“健身”的对应的姓名,并用COUNT 函数统计对应姓名的个数,得到已经报名的人数;最后加 1,得到“我是第几个报名的”。
看一下效果:
- 选择了健身课,就是在之前录入的课程数据里,查找值为“健身”的,并对选择健身的姓名进行计数,发现前面已经有 3 人报名,自己是第 4 个报名的。
- 同理,选择了音乐,就是在之前录入的课程数据里,查找值为“音乐”的,并对选择音乐的姓名进行计数,发现前面已经有 1 人报名,自己是第 2 个报名的。
- 选择了舞蹈,就是在之前录入的课程数据里,查找值为“舞蹈”的,并对选择舞蹈的姓名进行计数,发现前面已经有 2 人报名,自己是第 3 个报名的。


注:当设置字段公式为 MAPX(“COUNT”,课程,课程,姓名) 时,如返回值为 0,则字段会显示为空值。
文本函数 #
CONCATENATE #
CONCATENATE(text1,[text2], …)
将多个文本字符串合并成一个文本字符串。
例如函数 CONCATENATE(A,B,C),返回值为 ABC。
注:字段或者函数之间,用逗号隔开;如果是字符串,需要用引号包裹起来。
函数示例:将时间、姓名和学号连起来成为一个新的字符串。
CONCATENATE(TEXT(DATE(时间),”yyyyMMdd”),”-“,”姓名”,”-“,”学号”)
CHAR #
CHAR(number)
CHAR 函数可将计算机其他类型的数字代码转换为字符。
Number:用于指定字符的数字。
示例:CHAR(10),即返回值为换行字符”\n”。
目前仅支持以下数字代码:
| Number | 字符 | 含义 |
| 9 | \t | 制表符tab |
| 10 | \n | 换行字符 |
| 34 | “ | 双引号 |
| 39 | ’ | 单引号 |
| 92 | \ | 反斜杠 |
EXACT #
EXACT(text1,text2)
比较两个字符串是否完全相同(区分大小写)。完全相同则返回 true,否则返回 false。示例:

IP #
IP()
获取当前用户的 ip 地址。
ISEMPTY #
ISEMPTY(text)
判断值是否为空字符串、空对象或者空数组。
支持使用 ISEMPTY 函数的字段有:单行文本、多行文本、数字、日期时间、单选按钮组、复选框组、下拉框、下拉复选框、成员字段、组织字段、微信昵称、微信 OpenID、扩展字段。
以下三种方式,均表示该“单选”字段为空值。(注意,判断的是该单选字段被编辑后是否为空值)
ISEMPTY(文本字段);
ISEMPTY(文本字段)==TRUE();
ISEMPTY(文本字段)==1。

ISEMPTY 函数也可用于表单提交校验。

JOIN #
JOIN 函数可通过连接符将数组的值连成文本。
函数用法:
JOIN(数组, “连接符”)
函数示例:如需将复选框中勾选的选项通过”-“组合在一起,则可设置公式为JOIN(复选组,”-“)。

LEFT #
LEFT(text,[num_chars])
从一个文本字符串的第一个字符开始返回指定个数的字符。

LEN #
LEN(text)
返回文本字符串中的字符个数。(空格也将作为字符进行计数)

LOWER #
LOWER(text)
将一个文本字符串中的所有大写字母转换为小写字母。

MID #
MID(text, start_num, num_chars)
返回文本字符串中从指定位置开始的特定数目的字符,该数目由用户指定。
- text: 必需。 包含要提取字符的文本字符串。
- start_num: 必需。 文本中要提取的第一个字符的位置。 文本中第一个字符的 start_num 为 1,以此类推。
- num_chars: 必需。 指定希望从文本中返回字符的个数。
以身份证号中提取生日为例:通过 MID 函数提取身份证号的第 7 到 10 位,后面接“-”,提取身份证号的 11、12 位,接“-”,最后提取身份证号的 13、14 位。最后,采用 CONCATENATE 函数将提取出来数字和“-”连接符相连。

REPLACE #
REPLACE(old_text, start_num, num_chars, new_text)
根据指定的字符数,将部分文本字符串替换为不同的文本字符串。
- old_text: 必需。要替换其部分字符的文本。
- start_num: 必需。old_text 中要替换为 new_text 的字符位置。
- num_chars: 必需。old_text 中希望使用 new_text 来进行替换的字符数。
- new_text: 必需。将替换 old_text 中字符的文本。
REPLACE(字符串1,2,4,字符串2),即将字符串 1 中的第 2 位之后的 4 位(即 2,3,4,5 位),用字符串 2 来替换。

REPT #
REPT(text, number_times)
将文本重复一定次数。
- text: 必需。需要重复显示的文本。
- Number_times: 必需。用于指定文本重复次数的正数。

RIGHT #
RIGHT(text,[num_chars])
返回文本值中最右边的字符。
- text: 必需。包含要提取字符的文本字符串。
- num_chars: 可选。指定希望提取的字符数。
如下图,可以获取文本内容中最右侧 4 个字符。

RMBCAP #
RMBCAP 函数可以将金额小写转换为人民币大写金额形式。
函数用法:
RMBCAP(数字)
函数示例:如,在财务结算、报销管理、对公付款等场景中,可以利用 RMBCAP 函数将金额转换为大写,避免被篡改产生的负面影响。

注:人民币大写只到分位(小数点后两位),从厘(小数点后三位)开始舍弃,舍弃部分不进行四舍五入。
SEARCH #
SEARCH(find_text,within_text,[start_num])
返回第一个文本字符串在第二个文本字符串中第一次出现的位置序号,从左到右查找,忽略英文字母的大小写;返回 0 则表示未查找到。
find_text: 必需。要查找的文本。
within_text: 必需。字符所在文本。
start_num: 可选。within_text 中从第几个字符开始查找;未填写则默认从第一个开始查找。

SPLIT #
SPLIT(text, text_separator)
将文本按指定字符串分割成数组。

TRIM #
TRIM(text)
(1)删除字符串首尾的空格。
(2)如果字符串内部存在连续多个空格,还会删除至仅剩一个空格。

TEXT #
TEXT(num,text_format) #
将数字转换成特定格式的文本。
其中 text_format 的含义如下:
- #:数字占位符。只显有意义的数据而不显示无意义的数据。小数点后数字如大于”#”的数量,则按”#”的位数四舍五入。小数点后数字如小于”#”的数量,则显示实际值。例:在文本框中输入:###.##,1 显示为 23.1,23.1578 显示为 23.16。
- 0:数字占位补位符。如果小数点前的数据的长度大于占位符,则显示实际数据,如果小于占位符的数量,则用0补足。小数点后的数据的长度大于占位符,则按“0”的位数四舍五入。小数点后数字如小于“0”的数量,则用“0”补足。例:在文本框中输入:00,23.1 显示为 023.10,23.1578 显示为 023.16。
- ,:千位分隔符。可插入“#”或“0”中使用,数字中插入千位分隔符。合法使用形式:
- 需要在小数点前使用。
- 需要在“#”或“0”之间。
- %:百分比。放在数字占位符或补位符之后。数据以百分比形式显示。例:代码:#%,1 显示为 2310%。
- [Num0] 显示原始数据。
- [Num1] 将数字转为中文小写。123 显示为一百二十三。
- [Num2] 将数字转为中文大写。123 显示为壹佰贰拾叁。
- 直接在 [Num0] 或 # 或 0 的之前加字符即是前缀,支持中文字符、英文大小写、¥、$ 及空格。
可根据自己需要自由组合。
示例:TEXT(123.7895,“#.##”)=123.79

TEXT(date, text_format) #
将日期转换成特定格式的文本。
其中 text_format 的含义如下:
- yy 表示年,显示为 15
- yyyy 表示年,显示为 2015
- M 表示月,显示为 6
- MM 表示月,显示为 06
- MMM 表示月,显示为六月
- d 表示日,显示为 9
- dd 表示日,显示为 09
- HH 表示 24 小时制的时(0 点 10 分将显示为 0:10)
- hh 表示 12 小时制的时(0 点 10 分将显示为 12:10)
- mm 表示分
- ss 表示秒
- E 表示星期,结果为 0~6,分别表示星期日~星期六
- EE 表示星期,例如:日、一、二等
- EEE 表示星期,例如:星期日、星期一、星期二等
使用举例:将日期转换为文本。

UPPER #
UPPER(text)
将一个文本字符串中的所有小写字母转换为大写字母。

UNION #
UNION(文本1,文本2,文本3,文本4) 或 UNION([数组])
通过 UNION() 函数可以将重复数据自动剔除。
例:UNION(张三,李四,王五,张三,李四) 返回值为 [张三,李四,王五]。

VALUE #
VALUE(text)
将内容为数字的文本转化为数字格式。

文本函数综合运用示例
这里给出一个,根据身份证号码自动算性别的函数,用一个典型的函数来给大家启发。
在表单里输入身份证号码,自动生成性别。
需要解释的是,身份证号码第17位为性别位,奇数为男性,偶数为女性。所以此处我们用两种方式来判断性别。
(1)身份证的第17位数为奇数的时候,返回“男”,否则返回“女”。
公式: IF(MOD(VALUE(MID(身份证号,17,1)),2)==1,”男”,”女”)

(2)身份证的第17位数为1,3,5,7,9的时候,返回“男”,否则返回“女”。
IF(OR(MID(身份证号,17,1)==1,MID(身份证号,17,1)==3,MID(身份证号,17,1)==5,
MID(身份证号,17,1)==7,MID(身份证号,17,1)==9),”男”,”女”)

逻辑函数 #
AND #
AND 函数可用于表示:当所有参数逻辑值为 true 时,返回 true;只要有任何一个参数逻辑值为 false,则返回false。
函数用法:
AND(logical1, logical2, …)
函数示例:
1)AND(A,B),表示如果同时满足条件 A,B,则返回 true,否则返回 false。例如:
- AND(1<5,1<6),返回结果为 true;
- AND(1<5,7<6),返回结果为 false。
2)AND 函数可与 IF 函数等组合使用。如成绩判定时,需设置当三科成绩均大于 90 分时为“优秀”,否则为“其他”,则设置公式为IF(AND(语文成绩>90,数学成绩>90,英语成绩>90),”优秀”,”其他”)。

FALSE #
FALSE 函数可直接返回逻辑值 false。
函数用法:
FALSE()
函数示例:FALSE 函数一般不会作为函数单独使用,可与其他函数一起使用,或作为判断逻辑的结果。如,仓储管理中,判断库存数量与盘点数量是否一致时,可设置公式为IF(库存数量==库存盘点数量,TRUE(),FALSE()),即数量一致时返回 true,反之返回 false。

IF #
IF 函数可用于判断一个条件能否满足;如果满足返回一个值,如果不满足则返回另外一个值。
函数用法:
IF(logical_test,value_if_true, value_if_false)
其中各参数的含义如下:
- logical_test:必需,逻辑表达式,要判断是否成立的条件;
- value_if_true:必需,满足条件时的返回值;
- value_if_false:必需,不满足条件时的返回值。
函数示例:
1)IF 函数的基础应用:
IF(A,B1,B2),表示如果满足条件 A,那么返回 B1,否则返回 B2。
如,成绩判定时,规定 60 分以下,为不及格;60 分以上,为及格。则设置公式为IF(成绩<60,”不及格”,”及格”)。

2)IF 函数的多层嵌套应用:
如,成绩判定时,规定 60 分以下,为不及格;60-79 分,为中;80-89 分,为良;90 分以上,为优。则设置公式为IF(成绩<60,”不及格”,IF(成绩<80,”中”,IF(成绩<90,”良”,”优”)))。

3)IF 函数应用于下拉框/单选按钮组:
单选题场景中,在下拉框/单选按钮组中添加题目:”一去二三里”的下一句是什么?“,设置选项为:
- 烟村四五家
- 亭台六七座
- 八九十枝花
当选择 A 时得 3 分,否则 0 分;则可在分数字段中设置公式为IF( 一去二三里 的下一句是什么?==”A.烟村四五家”,3,0)。

4)IF 函数应用于下拉复选框/复选框组:
多选题场景中,在下拉复选框/复选框组中添加题目:”下列说法正确的是?(多选题)“,设置选项为:
- 管理员可以在应用管理界面新建一个表单
- 可以通过导入 excel 创建一个表单
- 可以从当前应用或者其它应用复制一个表单
如全选得 3 分,否则 0 分;则可在分数字段中设置公式为IF(下列说法正确的是?(多选题)==”A.管理员可以在应用管理界面新建一个表单,B.可以通过导入excel创建一个表单,C.可以从当前应用或者其它应用复制一个表单”,3,0)。

IFS #
IFS 函数可用于判断是否满足一个或多个条件,且返回符合第一个 true 条件的值。 IFS 函数可以取代多个嵌套 IF 语句,并且有多个条件时更方便阅读。
函数用法:
IFS(logical_test1, value_if_true1, logical_test2, value_if_true2, … ,logical_testn, value_if_truen)
其中各参数的含义如下:
- logical_test1:必需,计算结果为 true 或 false 的条件;
- value_if_true1:必需,当 logical_test1 的计算结果为 true 时要返回结果,可以为空;
- logical_test2…logical_testn:非必需,计算结果为 true 或 false 的条件;
- value_if_true2…value_if_truen:非必需,当 logical_testn 的计算结果为 true 时要返回结果。 每个 value_if_truen 对应于一个条件 logical_testn,可以为空。
注:n 的最大值为 127,即 IFS 函数最多允许 127 个不同的条件。
函数示例:IFS(A1,B1,A2,B2,A3,B3…),表示满足条件 A1 时,返回结果 B1;满足条件 A2 时,返回结果 B2;满足条件 A3 时,返回结果 B3。依次类推。
如,可通过 IFS 函数来计算成绩的等级,设置公式为IFS(成绩<60,”不及格”,成绩<=79,”及格”,成绩<=89,”良好”,成绩>=90,”优秀”)。

NOT #
NOT 函数可用于对其参数的逻辑求反,当逻辑为 true 时,返回结果 false;当逻辑为 false 时,返回结果 true。
函数用法:
NOT(logical)
函数示例:
1)NOT(A),表示如果 A 为 true 时,则返回 false;A 为 false 时,则返回 true。例如:
- NOT(50<60),返回 false;
- NOT(90<60),返回 true。
2)NOT 函数可与 IF 函数等组合使用,如成绩判定时,当成绩不低于 60 分为及格,否则为不及格,则设置公式为:IF(NOT(成绩<60),”及格”,”不及格”)。

OR #
OR 函数可用于表示:参数组中,任何一个参数逻辑值为 true 时,即返回 true;只有当所有逻辑参数值为 false 时,才返回 false。
函数用法:
OR(logical1,logical2, …)
函数示例:
1)OR(A,B),表示如果满足条件 A,或者满足条件 B(即 2 个条件中满足一个或一个以上),则返回 true,否则返回 false。例如:
- OR(1<2,2<2),返回结果为 true;
- OR(3<2,2<2),返回结果为 false。
- OR 函数可与 IF 函数等组合使用,如成绩判定时,当任意一门成绩大于 90 分时,即为“优秀”,否则为“其他”,则设置公式为IF(OR(语文成绩>90,数学成绩>90,英语成绩>90),”优秀”,”其他”)。

TRUE #
TRUE 函数可直接返回逻辑值 true。
函数用法:
TRUE()
函数示例:TRUE 函数一般不会作为函数单独使用,可与其他函数一起使用,或作为判断逻辑的结果。如,判断字段值是否为空时,设置公式为IF(ISEMPTY(方案选择)==TRUE(),”未选择”,”已选择”),为空时值为TRUE(),即返回“未选择”,反之返回“已选择”。

XOR #
XOR 函数可返回所有参数的异或值。异或的含义是:两个逻辑值相同,返回 false,两个逻辑值不同,则返回 true。
函数用法:
XOR(logical1,logical2, …)
函数示例:如,判断两个答案值是否一致时,可设置公式为XOR(答案1<90,答案2<90),答案一致时返回 false,不一致时返回 true。

