Google Apps Script .setChoices报重复选项值错误
报错根因
.setChoices() 抛出 cannot have duplicate choice values 是因为传入的同题目选项列表存在重复值,Google Forms 不支持多选题出现完全相同的选项,结合你的代码,触发场景有三类:
- 未做空值过滤:如果某道题的C-F错误选项列存在未填写的空单元格,脚本会读入多个空字符串直接造成重复
- 表格内容本身重复:包括正确答案和某错误选项文本一致、两个错误选项文本一致、选项首尾带多余空格被Forms自动裁剪后内容重合
- 原洗牌函数直接修改数组原引用,极端场景下会出现值覆盖导致重复
修复后代码
替换原有全部脚本即可,新版本做了空行跳过、选项去空格、去重、自动识别正确答案位置的优化,去掉了冗余的多分支判断:
function popForm() { var ss = SpreadsheetApp.getActive(); var sheet = ss.getSheetByName('Sheet1'); var numberRows = sheet.getDataRange().getNumRows(); var myQuestions = sheet.getRange(1,1,numberRows,1).getValues(); var myAnswers = sheet.getRange(1,2,numberRows,1).getValues(); var myGuesses = sheet.getRange(1,2,numberRows,5).getValues(); var form = FormApp.create('States and Capitals Quiz'); form.setIsQuiz(true); for(var i=0;i<numberRows;i++){ var questionTitle = myQuestions[i][0]?.toString().trim(); var correctAns = myAnswers[i][0]?.toString().trim(); // 跳过题目或答案为空的无效行 if (!questionTitle || !correctAns) continue; // 预处理选项:去首尾空格、过滤空值、去重 var rawChoices = myGuesses[i] .map(c => c?.toString().trim() || '') .filter(c => c !== ''); // 选项中找不到正确答案则跳过当前题 if (!rawChoices.includes(correctAns)) { Logger.log(`第${i+1}行题目选项缺失正确答案,已跳过`); continue; } var uniqueChoices = [...new Set(rawChoices)]; var shuffledChoices = shuffleEachRow(uniqueChoices); var addItem = form.addMultipleChoiceItem(); // 自动生成选项,无需手动判断正确答案位置 var choices = shuffledChoices.map(ans => addItem.createChoice(ans, ans === correctAns)); addItem.setTitle(questionTitle) .setPoints(1) .setChoices(choices); } } function shuffleEachRow(array) { // 拷贝数组后再打乱,避免修改原数组引用 var arr = [...array]; var i, j, temp; for (i = arr.length - 1; i > 0; i--) { j = Math.floor(Math.random() * (i + 1)); temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } return arr; }
后续排查指引
如果替换代码后仍报错,查看脚本执行日志里输出的跳过行号,回到Sheet对应行检查:
- 确认所有选项文本没有完全重复的内容
- 清理选项首尾的多余空格,注意区分肉眼难以识别的全角空格、不可见特殊字符
- 确认每道题的正确答案和错误选项都已填写,没有整行留空的情况
内容的提问来源于stack exchange,提问作者Juan
相关产品推荐
相关产品推荐

