Google Forms脚本报错:gridItem.getValidation未定义及答案匹配问题
问题描述
我有一个运行在Google Forms上的App Script,功能是将行数或列数大于3的多项选择网格(Multiple Choice Grid)转换为单项选择题。表单已设置每行一个答案及答案密钥,但运行脚本时出现两个错误:
gridItem.getValidation is not a functionInvalid data updating form
目前脚本虽能生成包含3个选项的单项选择题,但正确答案通常不在这3个选项中。需要修正脚本实现:
- 从答案密钥中提取正确答案
- 生成的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
相关产品推荐
相关产品推荐

