如何修改Apps Script实现Google表单按答案跳转分区功能
Google Apps Script 实现表单「根据答案跳转分区」修改方案
核心实现逻辑
要启用按答案跳转功能,需要用到MultipleChoiceItem.createChoice()的导航参数:该方法支持在选项文本、是否正确的布尔值之外,传入跳转目标(支持传入具体分区对象,或是表单内置导航规则比如直接提交)。
原代码所有题目都放在表单初始默认分区下,没有拆分独立分区、也未给选项绑定跳转规则,因此无法实现该功能。以下以最常用的测验跳转逻辑为例修改:
- 第一题放在表单首页,其余每道题单独占用一个独立分区
- 选中正确答案:自动跳转到下一题所在分区,最后一题答对直接跳转提交
- 选中错误答案:自动跳转到统一的答错提示分区,直接结束测验
- 优化原代码冗余的多分支判断,自动识别正确答案位置,简化代码结构
- 优化数据读取逻辑,一次性读取表格所需范围,减少API调用提升运行速度
修改后完整代码
function popForm() { var ss = SpreadsheetApp.getActive(); var sheet = ss.getSheetByName('Sheet1'); var numberRows = sheet.getDataRange().getNumRows(); // 一次性读取所有需要的表格数据,避免多次调用接口 var allData = sheet.getRange(1,1,numberRows,6).getValues(); // 拆分题目、正确答案、选项数组 var myQuestions = allData.map(row => row[0]); var myAnswers = allData.map(row => row[1]); var myGuesses = allData.map(row => row.slice(1,6)); // 横向打乱每行选项顺序 var myShuffled = myGuesses.map(shuffleEachRow); // 创建测验表单 var form = FormApp.create('States and Capitals Quiz'); form.setIsQuiz(true); // 存储所有元素引用,方便后续绑定规则 var itemRefs = []; // 按展示顺序创建所有分区和题目 // 第一题直接放在默认首页,不需要额外加分页 var firstQuestion = form.addMultipleChoiceItem() .setTitle(myQuestions[0]) .setPoints(1); itemRefs.push({ type: 'question', index: 0, obj: firstQuestion }); // 从第二题开始,每道题前添加分页符(独立分区) for (var i = 1; i < numberRows; i++) { var section = form.addPageBreakItem().setTitle(`第${i+1}题`); itemRefs.push({ type: 'section', index: i, obj: section }); var question = form.addMultipleChoiceItem() .setTitle(myQuestions[i]) .setPoints(1); itemRefs.push({ type: 'question', index: i, obj: question }); } // 创建答错提示分区,放在所有题目之后 var wrongSection = form.addPageBreakItem() .setTitle('回答错误') .setHelpText('很遗憾你答错了,测验结束') // 设置该分区浏览完后直接提交表单 .setGoToPage(FormApp.PageNavigationType.SUBMIT); // 逐题绑定选项和跳转规则 for (var i = 0; i < numberRows; i++) { var currentQuestion = itemRefs.find(item => item.type === 'question' && item.index === i).obj; // 确定当前题答对后的跳转目标 var correctTarget; if (i === numberRows - 1) { // 最后一题答对直接提交 correctTarget = FormApp.PageNavigationType.SUBMIT; } else { // 其余题目答对跳转到下一题的分区 correctTarget = itemRefs.find(item => item.type === 'section' && item.index === i+1).obj; } // 答错统一跳转到错误提示分区 var wrongTarget = wrongSection; // 自动识别正确答案位置,生成带得分、跳转规则的选项 var choices = myShuffled[i].map(optionText => { return optionText === myAnswers[i] ? currentQuestion.createChoice(optionText, true, correctTarget) : currentQuestion.createChoice(optionText, false, wrongTarget); }); currentQuestion.setChoices(choices); } } // 每行选项随机打乱函数 function shuffleEachRow(array) { var i, j, temp; for (i = array.length - 1; i > 0; i--) { j = Math.floor(Math.random() * (i + 1)); temp = array[i]; array[i] = array[j]; array[j] = temp; } return array; }
自定义调整说明
- 如果需要实现不同错误选项跳转到不同讲解分区的逻辑,可以在表格中新增列配置每个选项对应的跳转规则,生成选项时读取对应配置传入
createChoice即可 - 如果不需要答错直接结束,可以在错误分区后添加解析内容,再将错误分区的跳转目标改为下一题分区,实现答错看解析后继续答题的效果
- 所有分区支持自定义标题、说明文本、插入图片/视频等元素,可以按需扩展
内容的提问来源于stack exchange,提问作者Juan
相关产品推荐
相关产品推荐

