通过Apps Script用多Sheets标签A列数据填充Google Form及报错修复
故障根因
getQuestionValues()无有效返回值:forEach回调内的return只会终止当前轮次的循环,不会给外层函数返回结果,导致googleSheetsQuestions实际为undefined,访问[0]索引时直接触发TypeError。- 原逻辑调用
getDataRange()拉取工作表全量数据,不符合「仅提取两个Sheet A列数值填充2个问题」的需求,也没有做Sheet和表单问题的对应映射。
修复方案
- 重构
getQuestionValues()逻辑,显式收集两个Sheet的A列数据,按「问题标题-选项列表」的结构返回结果。 - 调整表单填充逻辑,直接匹配问题标题和对应数据源,减少无效遍历。
- 增加空值过滤逻辑,避免空单元格被加入选项列表。
修复后完整代码
function openForm(e) { populateQuestions(); } function populateQuestions() { var form = FormApp.getActiveForm(); var questionConfig = getQuestionValues(); var itemsArray = form.getItems(); itemsArray.forEach(function(item) { var itemTitle = item.getTitle(); // 仅处理匹配到数据源的问题 if (questionConfig.hasOwnProperty(itemTitle)) { // 过滤空值 var choiceArray = questionConfig[itemTitle].filter(function(val) { return val !== '' && val != null; }); // 若题目不是复选框,替换asCheckboxItem为对应题型方法即可 // 单选题用asMultipleChoiceItem(),下拉题用asListItem() item.asCheckboxItem().setChoiceValues(choiceArray); } }); } function getQuestionValues() { // 替换为你实际的Google表格ID var ss = SpreadsheetApp.openById('1234567890'); // 配置映射关系:工作表名称 => 对应表单问题的完整标题 var sheetQuestionMap = { "Sheet1": "替换为Sheet1对应的表单问题标题", "Sheet2": "替换为Sheet2对应的表单问题标题" }; var result = {}; Object.keys(sheetQuestionMap).forEach(function(sheetName) { var sheet = ss.getSheetByName(sheetName); if (!sheet) return; // 仅提取A列全量数据,不需要拉取其他列 var aColumnValues = sheet.getRange(1, 1, sheet.getLastRow(), 1).getValues().flat(); // A列第1行可作为备注,从第2行开始为实际选项 var options = aColumnValues.slice(1); result[sheetQuestionMap[sheetName]] = options; }); return result; }
使用注意事项
- 运行前替换代码中三处占位内容:实际的Google表格ID、两个Sheet分别对应的表单问题完整标题。
- 若表单问题不是复选框类型,将
asCheckboxItem()替换为对应题型的方法即可。 - 确保脚本运行账号同时拥有目标Google表单和Google表格的编辑权限。
内容的提问来源于stack exchange,提问作者Brooke Taylor
相关产品推荐
相关产品推荐

