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

Google Forms脚本报错:gridItem.getValidation未定义及答案匹配问题

问题描述

我有一个运行在Google Forms上的App Script,功能是将行数或列数大于3的多项选择网格(Multiple Choice Grid)转换为单项选择题。表单已设置每行一个答案及答案密钥,但运行脚本时出现两个错误:

  • gridItem.getValidation is not a function
  • Invalid data updating form

目前脚本虽能生成包含3个选项的单项选择题,但正确答案通常不在这3个选项中。需要修正脚本实现:

  1. 从答案密钥中提取正确答案
  2. 生成的3个选项里必须包含1个正确答案

报错日志

Jun 18, 2024, 10:50:15 AM   Info    Error updating grid item: gridItem.getValidation is not a function
Jun 18, 2024, 10:50:15 AM   Info    Error: gridItem.getValidation is not a function

原代码片段

// Handle GRID items
try {
  var gridItem = item.asGridItem();
  
  // Get rows and columns from the grid item
  var rows = gridItem.getRows();
  var columns = gridItem.getColumns();
  
  // Check if the grid item has 3 or fewer rows or columns
  if (rows.length <= 3 || columns.length <= 3) {
    continue; // Skip this grid item if it has 3 or fewer rows or columns
  }
  
  // Iterate over each column in the grid
  for (var c = 0; c < columns.length; c++) {
    // Create a new MultipleChoiceItem for each column
    var newMultipleChoiceItem = modifiedForm.addMultipleChoiceItem();
    newMultipleChoiceItem.setTitle(columns[c]);
    
    // Prepare choices based on the grid options for the current column
    var choices = [];
    
    for (var r = 0; r < rows.length; r++) {
      var answerText = gridItem.getValidation().getValidationForCell(r, c).getHelpText(); // Assuming the answer is stored in the help text
      var choiceText = rows[r] + ' - ' + answerText;
      var isCorrect = answerText === 'correct'; // Adjust as per your validation logic
      choices.push(newMultipleChoiceItem.createChoice(choiceText, isCorrect));
    }
    
    // Shuffle the choices
    choices = shuffleArray(choices);
    
    // Limit to 3 choices
    choices = choices.slice(0, 3);
    
    // Log choices before setting
    Logger.log('New multiple-choice item choices: ' + JSON.stringify(choices));
    
    // Set choices for the new MultipleChoiceItem
    newMultipleChoiceItem.setChoices(choices);
    Logger.log('New multiple-choice item created with choices: ' + JSON.stringify(choices));
  }
  
  // Remove the original GridItem from the form
  modifiedForm.deleteItem(item);
} catch (e) {
  Logger.log('Error updating grid item: ' + e.message);
  throw e;
}
解决方案

1. 修复gridItem.getValidation is not a function错误

Google Apps Script的GridItem对象没有getValidation()方法,要获取网格题的答案密钥,应该使用getCorrectAnswers()方法——它会返回一个数组,每个元素对应该行的正确列索引。

替换原代码中获取正确答案的逻辑,直接通过索引匹配判断选项是否正确。

2. 确保3个选项必含正确答案

原逻辑先打乱所有选项再取前3个,可能漏掉正确答案。修正逻辑:

  • 先分离正确选项和错误选项
  • 保留所有正确选项(通常每行对应一个正确列,所以单列只有一个正确选项)
  • 从错误选项中随机选2个,和正确选项组合后再打乱

3. 修复Invalid data updating form错误

该错误多因选项数据无效导致,确保:

  • 选项文本唯一
  • 正确创建Choice对象
  • 避免空选项或无效的正确答案标记

完整修正后的代码

// 数组打乱函数(需确保已定义)
function shuffleArray(array) {
  for (let i = array.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [array[i], array[j]] = [array[j], array[i]];
  }
  return array;
}

// Handle GRID items
try {
  var gridItem = item.asGridItem();
  
  // Get rows, columns and correct answers from the grid item
  var rows = gridItem.getRows();
  var columns = gridItem.getColumns();
  var correctAnswers = gridItem.getCorrectAnswers(); // 获取网格题的正确答案索引
  
  // Skip grid items with 3 or fewer rows/columns
  if (rows.length <= 3 || columns.length <= 3) {
    continue;
  }
  
  // Process each column into a multiple-choice item
  for (var c = 0; c < columns.length; c++) {
    var newMultipleChoiceItem = modifiedForm.addMultipleChoiceItem();
    newMultipleChoiceItem.setTitle(columns[c]);
    
    // Separate correct and incorrect choices
    var correctChoices = [];
    var incorrectChoices = [];
    
    for (var r = 0; r < rows.length; r++) {
      var isCorrect = correctAnswers[r] === c; // 判断当前行是否为该列的正确答案
      var choice = newMultipleChoiceItem.createChoice(rows[r], isCorrect);
      
      isCorrect ? correctChoices.push(choice) : incorrectChoices.push(choice);
    }
    
    // Skip columns without correct answers
    if (correctChoices.length === 0) {
      Logger.log('Skipping column ' + columns[c] + ' - no correct answer found');
      modifiedForm.deleteItem(newMultipleChoiceItem);
      continue;
    }
    
    // Pick 2 random incorrect choices (or all if less than 2)
    var neededIncorrect = 3 - correctChoices.length;
    var randomIncorrect = shuffleArray(incorrectChoices).slice(0, neededIncorrect);
    
    // Combine and shuffle final choices
    var finalChoices = correctChoices.concat(randomIncorrect);
    finalChoices = shuffleArray(finalChoices);
    
    // Log and set choices
    Logger.log('Choices for ' + columns[c] + ': ' + JSON.stringify(finalChoices.map(ch => ch.getValue())));
    newMultipleChoiceItem.setChoices(finalChoices);
  }
  
  // Remove original grid item
  modifiedForm.deleteItem(item);
} catch (e) {
  Logger.log('Error updating grid item: ' + e.message);
  // 注释throw e避免中断整个脚本执行
}

内容的提问来源于stack exchange,提问作者Sam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 01:15:16