)
在使用致远 OA 搭建表单时各位同事可能会遇到一些标准公式无法实现的需求比如跨明细表校验、提取文本字段中某种类型的数据比如“费用化12138”需要将文本中的数字提取出来放在另一个文本或者数字控件上亦或者需要判断这个文本是中文还是英文……诸如此类的需求。有些朋友可能实现不了就止步于此或者请求开发支援去了。在小编刚接触这个系统时也只会使用标准公式直到有一天项目上遇到了没办法配置的校验有位前辈说其实致远开了个口子也就是自定义函数可以用脚本代码实现校验和计算但很多实施不具备代码能力。碰巧小编大学学的软件工程略懂 Java 和 Python抱着琢磨琢磨的心态小试牛刀从此打开新世界的大门。不说废话开始分享。后续小编遇到其他场景需要其他函数也会持续更新记得关注。目录一、把文本中的数字拿出来放到数字控件上二、去除网页复制的零宽非连接符三、判断这个文本输入的是中文还是英文四、明细表去重拼接自定义函数五、明细某个字段不能为空一、把文本中的数字拿出来放到数字控件上需求是把文本控件中的数字提取出来放到一个数字控件上文本和数字都得在主表或者都在明细上一个主表一个明细这个函数用不了。效果def str param[0] if (str null || str.toString().trim() ) { return 0 } def matcher (str.toString() ~ /\d/) def digits while (matcher.find()) { digits matcher.group() } if (digits ) { return 0 } return digits.toLong()原理就是取到文本类型参数如果不为空则使用正则 ~ 匹配器全局匹配连续数字 \d循环提取所有数字片段拼接。如果没有提取到数字返回0否则把拼接后的数字字符串转长整型返回。这个函数因为返回值是整型类型公式必须做在数字类型控件上。二、去除网页复制的零宽非连接符联行号等字段客户可能去网页复制网页数据可能存在零宽非连接符它是一个看不见的格式控制字符主要用于防止特定语言中的字符连写比如网页复制招商银行某支行联行号308100005344 实际数据是308100005344\u200c 但表单上不显示。接口传输报文出错导致数据接收方校验报错。解决方式1.提示用户手动删除加个文本字段用来替换掉原数据零宽非连接符以其他方式展示然后做校验如果用户输入数据和这个函数结果不一致提示用户修改。def bankNo param[0] if (bankNo.contains(\u200c)) { /*将文本里的\200c替换为[ZWSP]后再配置校验去校验原数据和原数据全两个字段是否一致*/ return bankNo.replaceAll(/\u200c/, 【ZWSP】) } return bankNo结果2.直接用函数去除零宽非连接符和多余数据联行号全为数字格式不存在其他字符可以直接去除掉除了数字外的其他一切字符def bankNo param[0] if (!bankNo) { return } String temp bankNo.replaceAll(/\u200c/, ) String cleanNo temp.replaceAll(/[^0-9]/, ) return cleanNo方式2的计算公式会修改用户填写数据建议配合方式1使用弱校验提示用户系统修改了数据。三、判断这个文本输入的是中文还是英文一张涉及国际公司使用的表单需要判断某字段是中文还是英文需求中中文和英文是不混用的所以可以判断出来。小编在此基础上增加了混合判断和数字判断可以参考下面返回值表格。def str param[0] // 空值、空白直接返回0 if (!str?.trim()) { return empty // 统一返回字符串避免类型混乱 } String text str.toString() // 判断是否存在中文 boolean hasChinese (text ~ /[\u4e00-\u9fa5]/).find() // 判断是否存在英文字母 boolean hasEnglish (text ~ /[a-zA-Z]/).find() if (hasChinese hasEnglish) { return mix } else if (hasChinese) { return chinese } else { return english }\u4e00是 Unicode 编码汉字或者字母介于一个范围之内所以用正则判断输入的字符每个值是不是都在这个范围内即可判断出是中文还是英文或者是混合类型。测试用例参数值返回空empty你好 worldmix今天天气很好chineseHello SpringBootenglish123456english测试 123abcmix四、明细表去重拼接自定义函数需要在主表上展示明细行某一列出现了哪些数据如果直接在主表加字段给公式等于明细会出现重复数据这个函数可以去重后输出。后续很多明细表校验都会用到这个函数。比如下面这个表需要统计物料明细中出现哪些物料名称def data param[0]; String res ; resdata.unique(); return res.replace([, ).replace(], ).replace(, , 、).trim();参数直接选明细字段就行效果如下五、明细某个字段不能为空这个需求有点扯淡场景是和外部系统对接时候明细表上某个文本字段双方约定都不能为空咱们这边实施配置操作权限不能为空实际业务使用中用户不知道这个字段该填啥反手打了个空格上去离谱的是校验就给跳过去了。。。开发老师一顿吵吵做不了。本以为这类误操作基本不会出现然鹅后续又出现好几单。无奈之下有了这个函数。这是一个组合函数参数用到上一点的 明细表去重拼接自定义函数原理是组合后的数据都是A、B、C、D 这样格式的文本如果中间有一个空格则输出是A、B、 、D 同样也是空格。只需要使用字符串的trim方法去除空格后按、组成列表再校验每一项是否为空即可def data param[0] /* 2. 校验1字符串以顿号开头/结尾证明第一行或最后一行为空格 → 直接返回2不通过*/ if (data.startsWith(、) || data.endsWith(、)) { return 2 } // 3. 校验2包含顿号的情况说明不止一行 if (data.contains(、)) { // 按顿号分割成列表 def list data.split(、).toList() // 检查分割后的元素是否有空白/空值trim后为空 def hasEmptyOrWhitespace list.any { it.trim().isEmpty() } // 有空白/空值返回2否则返回1 return hasEmptyOrWhitespace ? 2 : 1 } else { // 4. 校验3无顿号的情况一行数据 → 字符串trim后为空返回2否则返回1 return data.trim().isEmpty() ? 2 : 1 }注意各类情况开头为空结尾为空等特殊情况。本次给大家分享五个函数小编下班回家睡觉了。如果有解决不了得场景记得关注并留言哦