1.使用场景说明
在我们日常生产的过程中,经常会遇到需要随机抽查的场景
(1)生产完工产品随机抽检
质检员每天对当班生产的成品进行抽检。假设当日生产了500件产品(编号1-500),质检标准要求从中随机抽取20件进行检测。通过本技巧,操作员只需输入"抽取数量"和"范围总数",点击按钮即可自动完成随机抽签,并只保留被抽中的行,方便质检员逐条记录检测结果。
(2)质检抽样场景
来料检验时,一批次到货100个零部件,抽检标准为每批抽检20个。仓库管理员在表单中输入"抽查数=20"、"范围总数=100",点击按钮即可从1~100号中随机锁定20个待检零件,无需人工凭感觉挑选。
(3)仓库盘点场景
月度盘点时,仓库共有100个货位,按制度需随机抽查25个货位进行复盘。录入员输入"抽查数=25"、"范围总数=100",系统随机生成25个货位编号,盘点员按编号逐一前往对应货位复核,避免人为选择偏向。
在云表中,可以让系统直接帮我们抽取,不需要人为手动进行
本案例中,将使用生产完工产品随机抽检的场景进行设计,在实际使用场景中可以参考本案例的设计进行实现实际需求。
2.使用效果
用户打开随机抽取单,选择"报工单号",再输入"抽查数=10",单击"随机抽签"按钮,明细表中自动仅保留被随机抽中的10条记录。

随机抽取使用效果示意
3.实现思路流程
(1)整体流程展示

整体流程示意
(2)详细流程拆解

(3)实现思路详解
先在明细表中生成从1到总数(如100)的顺序号池,然后通过自定义JS函数从1~100中随机抽取10个不重复的数字,将抽取结果用填表公式拆解到明细表——按顺序号匹配,命中的行标记常量.是,最后删除未抽中的行,仅保留抽中项供质检员使用。
4.设计步骤
(1)前期模板准备
模板字段设计:
基本信息:
字段名称:报工单号,字段类型:文本,说明:选择报工单号,用户获取报工单的明细数据的参数
字段名称:抽查数,字段类型:整数,说明:用户输入本次需要抽取的样本数量
字段名称:抽查范围总数,字段类型:整数,说明:辅助字段,本次抽检范围内产品数量
字段名称:随机数,字段类型:文本,说明:辅助字段,存放JS函数返回的随机数结果
字段名称:随机抽签,字段类型:文本,说明:单元格格式为按钮,点击触发所有公式执行

基本信息数据项示意
明细:
字段名称:顺序号,字段类型:整数,说明:辅助字段,存放从1到范围总数的序列
字段名称:是否抽中,字段类型:是否型,说明:辅助字段,标记该产品是否被随机抽中
字段名称:成品报工编码,字段类型:文本,说明:从成品报工单中赋值过来的字段,能够对应到每一个产成品的编号
字段名称:成品批次,字段类型:文本,说明:从成品报工单中赋值过来的字段
字段名称:物料编号,字段类型:文本,说明:从成品报工单中赋值过来的字段
字段名称:物料名称,字段类型:文本,说明:从成品报工单中赋值过来的字段

(2)自定义函数设计
本次随机抽取的核心是自定义JS函数,编辑位置在模板的填表公式编辑器中,第三个页签即为自定义函数编写入口。

自定义脚本函数编辑器入口
已准备好的函数如下(函数名generateUniqueRandom,三个参数:抽取个数、范围最小值、范围最大值):
/**
* 生成指定数量的不重复随机数
* @param {number} count - 需要的随机数个数
* @param {number} min - 最小值(包含)
* @param {number} max - 最大值(包含)
* @returns {Array} 不重复的随机数数组
*/
function generateUniqueRandom(count, min, max) {
var output;
output = new Array();
if (count < 1) {
return "";
}
if (min > max) {
var tmp;
tmp = min;
min = max;
max = tmp;
}
var range;
range = max - min;
range = range + 1;
if (count > range) {
return "";
}
var pool;
pool = new Array();
var i;
i = 0;
var val;
val = min;
while (i < range) {
pool[i] = val;
val = val + 1;
i = i + 1;
}
var txt;
txt = "";
var remaining;
remaining = range;
i = 0;
while (i < count) {
var pick;
pick = Math.floor(Math.random() * remaining);
if (i > 0) {
txt = txt + ",";
}
txt = txt + pool[pick];
pool[pick] = pool[remaining - 1];
remaining = remaining - 1;
i = i + 1;
}
return txt;
}
编写成功后可在本模板的填表公式中直接调用。
注意:自定义函数只在本模板中可以调用,其他模板需要使用时,需要在其他模板中再设计一次。

编写示例
(3)数据接口设计
本案例中,使用的详细场景为:成品质检抽查
生产部门完成了一批成品的生产,质检部门需要在这批货物中进行抽取检查,例如本批产品共100个,已完成本批成品报工,成品报工单设计如下图所示:

在报工单中设计数据接口1,获取所有的报工单号列表

在报工单中设计数据接口2,获取该报工单的所有成品数据,并使用报工单号作为参数

数据源与数据列示意

过滤条件示意
(3)填表公式设计
关于数据源._rowNo的说明
选中"报工单号"单元格按钮,按顺序添加以下2条公式
①报工单号
操作:赋值
数据源:报工单列表接口 (数据接口1)
对"本表单.报工单号数"赋值为数据源.报工单号
作用:用户选择报工单号进行填入,后续作为参数调取报工单明细

②获取抽取范围总数
操作:赋值
数据源:获取报工明细接口 报工单号:本表单.报工单号对
对"抽取范围总数"赋值为数据源._rowNo
作用:获取接口中的明细数量,更新到抽查范围总数,作为随机数函数的参数

选中"随机抽签"单元格按钮,按顺序添加以下4条公式。
①生成顺序号
操作:赋值
数据源:获取报工明细接口(数据接口2) 报工单号:本表单.报工单号
对本表单.明细进行插入数据源中的对应数据;勾选插入前删除所有行(列)--(防止重复点击时明细行叠加)
作用:在明细表中插入抽查范围,顺序号分别为1、2、3…N,作为抽检候选池。

插入所有待抽公式
②生成随机数
操作:赋值
更新本表单
字段:随机数
值:generateUniqueRandom(本表单.抽查数, 1, 本表单.抽查范围总数)
作用:调用自定义函数,从1~总数中抽取指定个数的不重复数,返回逗号分隔的字符串存入"随机数"字段。

调用随机函数示意图
③拆分并标记抽中行
操作:赋值
数据源:文本列表接口
字符串:本表单.随机数
分割符号:"," 是否去重:常量.是
对目标表:明细
匹配条件:本表单.明细.顺序号 = 文本转数值(数据源.文本)--(由于文本列表拆分出来默认是文本类型,与明细表整数类型的顺序号匹配时需要转换类型)
将本表单.明细.是否抽中 赋值为 常量.是
作用:将生成的随机数,例如:"3,8,15,22,31",拆成多行,逐行匹配明细表顺序号,命中的行标记常量.是。

拆分并标记
④删除未抽中行
操作:删除行
删除条件:本表单.明细.是否抽中 <> 常量.是
作用:遍历明细表,删除所有未标记为"是"的行,最终仅保留抽中结果。

删除行公式示意
5.扩展
(1)分层抽检
(按班组/产线)
当同一批次包含多个班组或产线的产品时,可在主表加"分组数"字段,先按班组分组,每组分别调用一次随机数函数抽取。
思路:用逐组生成随机数。适合需要覆盖各班组而非全批次混抽的场景。
(2)抽检结果签字确认
抽检完成后,明细表增加"质检员"(用户类型字段)和"抽检时间"(系统日期)。
思路:加一个更新本表单公式,自动填入当前操作员姓名和系统时间,形成可追溯的抽检记录。
(3)辅助项隐藏
本案例中,所有的辅助字段皆可以设计成不显示在表单和总表的状态,提升用户使用感受。
思路:取消在数据表管理中,辅助数据项的绑定位置;并勾选在总表隐藏
(4)报工单列表接口
在本案例中,未设计报工单列表的过滤,可以增加已抽检报工单列表的过滤
思路:成品报工单中增加已抽检字段,随机抽检后,使用报工单号进行匹配,将已抽检状态回写至成品报工单中,再使用接口中的过滤条件将已抽检的报工单进行过滤。