You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

谷歌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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 22:27:08