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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 16:18:21