谷歌Quiz表单自动生成仅含错题补考卷的GAS实现求助
实现思路
核心流程分为4个可直接落地的环节,不需要额外的第三方依赖:
- 第一步:先确认原有测验表单已开启「测验模式」,并将表单的响应结果绑定到Google Sheets,所有学生的作答情况、对错标记、得分会自动同步到该表格。
- 第二步:通过GAS读取响应表格的内容,按学生唯一标识(邮箱/学号)分组,筛选出每个学生得分低于题目满分的错题ID集合。
- 第三步:遍历原测验表单的所有题目,匹配筛选出的错题ID,将对应题目的题干、选项、正确答案、分值、错题反馈等配置原封不动复制到新表单。
- 第四步:新表单开启测验模式后,可直接导出链接,也可配置自动发送给对应学生。
可直接复用的示例代码
打开原Quiz表单,点击右上角三个点→选择「脚本编辑器」,把下方代码粘贴进去,按照注释修改对应参数即可运行:
function generateMakeupQuiz() { // 替换为原测验表单ID,可从表单URL的/d/和/edit之间的字符串获取 const ORIGINAL_QUIZ_ID = "填写你的原表单ID"; const originalForm = FormApp.openById(ORIGINAL_QUIZ_ID); // 替换为绑定的响应数据表ID,可从Sheet URL的/d/和/edit之间的字符串获取 const RESPONSE_SHEET_ID = "填写你的响应Sheet ID"; const responseSheet = SpreadsheetApp.openById(RESPONSE_SHEET_ID).getActiveSheet(); // 跳过表头读取所有响应数据 const responseData = responseSheet.getDataRange().getValues().slice(1); // 此处为示例逻辑:生成包含所有学生答错次数≥1题目的统一补考试卷,如需生成单人专属试卷可自行调整分组逻辑 const wrongQuestionIds = new Set(); const formResponses = originalForm.getResponses(); formResponses.forEach(res => { const itemResponses = res.getGradableItemResponses(); itemResponses.forEach(itemRes => { // 得分低于本题满分即判定为答错 if (itemRes.getScore() < itemRes.getItem().asQuizItem().getPoints()) { wrongQuestionIds.add(itemRes.getItem().getId()); } }) }) // 新建补考试卷并开启测验模式 const makeupQuiz = FormApp.create("补考试卷-XX测验") .setIsQuiz(true) .setDescription("本次试卷仅包含上次测验答错的题目,请认真作答"); // 复制错题到新试卷,支持选择题、判断题、简答题,其他题型可参考逻辑自行扩展 const allOriginalItems = originalForm.getItems(); allOriginalItems.forEach(item => { if (wrongQuestionIds.has(item.getId())) { switch(item.getType()) { case FormApp.ItemType.MULTIPLE_CHOICE: const originalMc = item.asMultipleChoiceItem(); const newMc = makeupQuiz.addMultipleChoiceItem(); newMc.setTitle(originalMc.getTitle()) .setChoices(originalMc.getChoices()) .setPoints(originalMc.getPoints()) .setRequired(originalMc.isRequired()) .setFeedbackForCorrect(originalMc.getFeedbackForCorrect()) .setFeedbackForIncorrect(originalMc.getFeedbackForIncorrect()); break; case FormApp.ItemType.TRUE_FALSE: const originalTf = item.asTrueFalseItem(); const newTf = makeupQuiz.addTrueFalseItem(); newTf.setTitle(originalTf.getTitle()) .setPoints(originalTf.getPoints()) .setRequired(originalTf.isRequired()); break; case FormApp.ItemType.SHORT_ANSWER: const originalSa = item.asShortAnswerItem(); const newSa = makeupQuiz.addShortAnswerItem(); newSa.setTitle(originalSa.getTitle()) .setPoints(originalSa.getPoints()) .setRequired(originalSa.isRequired()); break; } } }) // 运行后可在脚本编辑器的「执行日志」中查看生成的补考试卷链接 console.log("补考试卷生成成功,访问链接:" + makeupQuiz.getPublishedUrl()); }
注意事项
- 首次运行代码需要完成Google账号授权,按照提示完成权限授予即可,属于官方安全校验流程,不会泄露数据。
- 如需生成每个学生的专属补考试卷,只需在遍历作答记录时按学生邮箱分组,每个分组单独生成表单即可。
- 多选题、填空题等其他题型的复制逻辑可参考代码中switch分支的格式扩展,调用对应题型的官方API即可完成配置。
内容的提问来源于stack exchange,提问作者user17468293
相关产品推荐
相关产品推荐

