1.案例背景说明
使用云表平台搭建一个考试系统,其核心功能是实现从题库中随机抽取题目生成试卷。为确保考核的全面性,系统采用分段抽取机制,使试卷能够均衡覆盖所有知识点。以包含70道单选题的题库为例,系统需从中随机抽取15道不重复的题目组成一份试卷。以下将详细说明如何利用云表平台的填表公式与数据接口,设计并实现这一分段随机抽题模型
2.实现逻辑
(1)核心逻辑
先赋值需要生成的题目个数,同时每一个题目序号对应一个随机题号,再根据随机到的题号与题库中的题号进行匹配,最后更新题号对应的题目内容,完成试卷的生成

实现逻辑流程图
(2)实现逻辑详解
①生成试卷的实现逻辑详解
在本案例中,准备两个模板,分别为题库模板与考试模版
从题库模板中随机抽取题目至考试模板中生成试卷
以下为生成试卷的详细流程

②计算得分的实现逻辑详解
考生作答后,在试卷中更新正确答案与解析,并计算分数,最后得出总分
以下为计算得分的详细流程

3.前期准备
(1)题库模板
基本信息数据项:题号、题目、选项、正确答案、解析(解析可根据场景选择是否需要)
明细信息数据项:题库模板无需设计明细表

在题号数据项中,可以设计一个自动编号,顺序号位数为1,使用Excel批量导入时,可以使其自动编号
(2)考试模板
基本信息数据项:考生姓名、单选题总分
明细信息数据项:序号、题目、选项、答案、正确答案、得分、解析

考试模板基本信息数据项

单选题明细数据项
在答案数据项中,可以设计一个下拉列表,用于选择答案

4.生成试卷的填表公式设计
本案例中的生成试卷共需要两个填表公式进行实现,分别为生成随机数与插入题目,均在考试模板中进行设计
在进行填表公式设计之前,需要先了解本次设计使用的函数
本次案例中使用的随机数函数为:RANDBETWEEN(参数1 , 参数2)
(1)生成随机题目的填表公式设计
在本案例中,需要从70个中抽取15道题至试卷中,所以开始序号为1,结束序号为15。
全局.序号列表的使用方式请参考教程:
序号列表
赋值设计:
对单选题这个目标表执行插入操作,勾选插入前删除所有行列
对题号进行赋值,调用randbetween函数
在本案例中,采取的是分段抽取的方式,从70道题里面抽取15道题,前10道题,每5道题中抽取一道题,后5道题,在每4道题中抽取一道

题号为随机抽取的数值,对题号赋值为:
IF(数据源.序号 <= 10,RANDBETWEEN(数据源.序号*5-4,数据源.序号*5),RANDBETWEEN(数据源.序号*5-(数据源.序号-10)-3,数据源.序号*5-(数据源.序号-10))
随机数抽取设计拆解:
IF(
数据源.序号 <= 10 , //区分前10道题与后5道题
RANDBETWEEN(
数据源.序号*5-4 , //前10道题,每一题的开始区间
数据源.序号*5), //前10道题,每一题的结束区间,每5道题中抽取一道
RANDBETWEEN(
数据源.序号*5-(数据源.序号-10)-3, //后5道题,每一题的开始区间
数据源.序号*5-(数据源.序号-10)) //后5道题,每一题的结束区间,每4道题中抽取一道
)以第3题与第13题为例,抽取随机数的区间分别为:
第3题:第3题在前10道题内,在每5道题中抽取一道,执行RANDBETWEEN( 数据源.序号*5-4 , 数据源.序号*5)
代入计算:
数据源.序号=3,
第一个参数:数据源.序号*5-4=3*5-4=11,
第二个参数:数据源.序号*5=15,
函数内参数为:RANDBETWEEN( 11 , 15);从题号为11、12、13、14、15中抽取一道题作为第3道题
第13题:在后4道题内,在每4道题中抽取一道,执行RANDBETWEEN( 数据源.序号*5-(数据源.序号-10)-3 , 数据源.序号*5-(数据源.序号-10))
代入计算:
数据源.序号=13,
第一个参数:数据源.序号*5-(数据源.序号-10)-3=13*5-(13-10)-3=59,
第二个参数:数据源.序号*5-(数据源.序号-10)=13*5-(13-10)=62,
函数内参数为:RANDBETWEEN( 59 , 62 );从题号为59、60、61、62中抽取一道题作为第13道题
注意:该设计方案仅适用于从70个题目中抽取15个题的分段式抽取,若抽取总数不一样或者需要抽取的数不一样,则需要按规律设计公式
对序号赋值为“数据源.序号”,数据源每运行一次,就按顺序插入一行序号

随机抽题赋值
(2)插入题目的填表公式设计
通过(1)的设计,已经获得了15个不重复的题号,根据这些题号,从题库中获取数据,并更新该行的题目与选项
在这一步需要设计1个数据接口:
数据接口1:设计数据源为题库模板的数据接口,数据列为题库模板中的题号、问题与选项,需要设计一个参数为题号
数据源与数据列设计:

数据接口1-数据源与数据列
过滤条件设计:

数据接口1-过滤条件
添加值变化的数据项为“本表单.单选题.题号”,在这个数据项下面添加赋值公式
调用数据接口1,绑定参数为本表单.单选题.题号,对单选题明细表执行更新操作
对选项与题目赋值为数据源中的选项与题目

题目赋值
5.计算得分的填表公式设计
本案例中包含计算得分的设计,计算得分的设计共有3个填表公式,分为别显示正确答案与解析、计算得分与计算总分,均在考试模板中进行设计
(1)更新正确答案与解析的填表公式设计
考生在选择了选项之后,可以看到正确答案与解析,并进行得分计算
在这一步骤中需要设计一个数据接口:
数据接口2:设计数据源为题库模板的数据接口,数据列为题库模板中题号、答案与解析,需要设计一个参数为题号
数据源与数据列设计:

数据接口2-数据源与数据列
过滤条件设计:

数据接口2-过滤条件
赋值正确答案的填表公式设计如下:
在值变化事件下添加数据项“本表单.单选题.答案”,在该数据项下添加赋值公式
调用数据接口2,绑定参数为题号,对单选题明细进行更新操作
对解析与正确答案赋值为数据源的数据

(2)赋值得分的填表公式设计
在本表单.单选题.答案的值变化事件下面添加一个赋值公式
目标表选择为单选题明细表,对得分进行赋值
IF(本表单.明细.答案 = 本表单.明细.正确答案 , 2 , 0)
选择正确得分2分,选择错误则为0分

(3)计算总分的填表公式设计
再往下添加一个赋值公式
选择数据源为单选题明细表,勾选多选时合成记录为一条
对本表单中的单选题总分赋值为数据源.得分,实现对每一题的得分相加

6.实现效果
新建模拟考试表单,新建时自动生成试卷,抽取出来的题目不重复
考生回答后,显示正确答案、得分与解析,在最下面计算总分

7.扩展
(1)其余题型扩展
根据单选题的设计方式,还可以设计多选题与判断题,与单选题是一样的设计方式,随机抽取题目后,设计回答后的公式

(2)颜色标记扩展
在云表中,有对单元格行样式设计的公式,可以根据条件,设计正确与错误的行颜色
本案例中,将错误行颜色设置为红色,正确行颜色设置为白色,如下图所示

(3)得分扩展
单选题的得分比较容易计算,但是在多选题中,得分的条件为:全部选对得3分,漏选得1.5分,错选不得分
在该场景中,不仅需要考虑考生错选、漏选得分,还需要考虑考生填写多选题时,答案的顺序,只使用云表内置的函数,需要写多个填表公式,不仅会使系统更复杂,考生的使用体验也会差很多
云表支持使用js语句编写自定义函数,在这里准备了一个js函数,方便大家参考使用:
添加自定义函数方式:
打开填表公式的第三个页签,即可以开始编写

本案例编写的自定义函数内容为:
function calculateMultiChoiceScore(correctAnswers, userAnswers) {
const Correct=correctAnswers.split("");
const User=userAnswers.split("");
const flag;
// 检查是否多选(用户选择了比正确答案更多的选项)
if (userAnswers.length > correctAnswers.length) {
return 0; // 多选,不得分
}
// 检查是否少选(用户选择了比正确答案更少的选项)
if (userAnswers.length < correctAnswers.length) {
return 1.5; // 少选,得一半分(1.5分)
}
// 检查是否有错选(用户选择了不在正确答案中的选项)
for (i=0;i<userAnswers.length;i++)
{
flag=true;
for(j=0;j<correctAnswers.length;j++)
{
if(User[i]!=Correct[j])
{flag=false;}
else
{
flag=true;
break;
}
}
if(flag==false) return 0;
}
// 全部选对
return 3;
// 满分(3分)
}
编写成功后,可以在本模板中的填表公式内调用该函数

注意:自定义函数只在本模板中可以调用,其他模板需要使用时,需要在其他模板中再设计一次