50.随机抽查的实现

通过JS随机数函数与填表公式配合,实现指定范围内的不重复随机抽取。

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的说明
数据源._rowNo 是数据源自带的系统字段,表示每条记录在查询结果中的行号,从1开始依次递增。在本文中用于赋值给明细表的顺序号,作为每条记录的唯一编号;同时取最后一条记录的 _rowNo 值作为抽取范围总数(行号等于记录总条数),传入随机数函数作为抽取范围上限。后续随机数结果再与顺序号比对,定位被抽中的行。
选中"报工单号"单元格按钮,按顺序添加以下2条公式
①报工单号
操作:赋值
数据源:报工单列表接口 (数据接口1)
对"本表单.报工单号数"赋值为数据源.报工单号
作用:用户选择报工单号进行填入,后续作为参数调取报工单明细
②获取抽取范围总数
操作:赋值
数据源:获取报工明细接口 报工单号:本表单.报工单号对
对"抽取范围总数"赋值为数据源._rowNo
作用:获取接口中的明细数量,更新到抽查范围总数,作为随机数函数的参数
选中"随机抽签"单元格按钮,按顺序添加以下4条公式。
①生成顺序号
操作:赋值
数据源:获取报工明细接口(数据接口2) 报工单号:本表单.报工单号
对本表单.明细进行插入数据源中的对应数据;勾选插入前删除所有行(列)--(防止重复点击时明细行叠加)
作用:在明细表中插入抽查范围,顺序号分别为1、2、3…N,作为抽检候选池。
插入所有待抽公式
②生成随机数
操作:赋值
更新本表单 字段:随机数 值:generateUniqueRandom(本表单.抽查数, 1, 本表单.抽查范围总数)
作用:调用自定义函数,从1~总数中抽取指定个数的不重复数,返回逗号分隔的字符串存入"随机数"字段。
调用随机函数示意图
③拆分并标记抽中行
操作:赋值
数据源:文本列表接口 字符串:本表单.随机数 分割符号:","  是否去重:常量.是
对目标表:明细
匹配条件:本表单.明细.顺序号 = 文本转数值(数据源.文本)--(由于文本列表拆分出来默认是文本类型,与明细表整数类型的顺序号匹配时需要转换类型)
将本表单.明细.是否抽中 赋值为 常量.是
作用:将生成的随机数,例如:"3,8,15,22,31",拆成多行,逐行匹配明细表顺序号,命中的行标记常量.是。
拆分并标记
④删除未抽中行
操作:删除行
删除条件:本表单.明细.是否抽中 <> 常量.是
作用:遍历明细表,删除所有未标记为"是"的行,最终仅保留抽中结果。
删除行公式示意

5.扩展

(1)分层抽检

(按班组/产线) 当同一批次包含多个班组或产线的产品时,可在主表加"分组数"字段,先按班组分组,每组分别调用一次随机数函数抽取。
思路:用逐组生成随机数。适合需要覆盖各班组而非全批次混抽的场景。

(2)抽检结果签字确认

抽检完成后,明细表增加"质检员"(用户类型字段)和"抽检时间"(系统日期)。
思路:加一个更新本表单公式,自动填入当前操作员姓名和系统时间,形成可追溯的抽检记录。

(3)辅助项隐藏

本案例中,所有的辅助字段皆可以设计成不显示在表单和总表的状态,提升用户使用感受。
思路:取消在数据表管理中,辅助数据项的绑定位置;并勾选在总表隐藏

(4)报工单列表接口

在本案例中,未设计报工单列表的过滤,可以增加已抽检报工单列表的过滤
思路:成品报工单中增加已抽检字段,随机抽检后,使用报工单号进行匹配,将已抽检状态回写至成品报工单中,再使用接口中的过滤条件将已抽检的报工单进行过滤。
2026-06-08
1 0