如何通过App Script建立Google Form问题与Google Sheet列的映射?
解决方案:Google Form问题与Google Sheet列的映射(适配重复标题场景)
核心逻辑
Google表单与关联Sheet的映射依赖表单问题的唯一ID而非标题,通过App Script可直接获取底层关联关系,同时能提取问题类型、可选选项等关键元数据。
实现步骤与代码
1. 获取映射关系的核心代码
function getFormSheetMapping() { // 替换为你的响应Sheet ID和对应工作表名称 const sheet = SpreadsheetApp.openById("你的Sheet ID").getSheetByName("表单响应 1"); const form = FormApp.openByUrl(sheet.getFormUrl()); const mapping = {}; const headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0]; // 遍历表单所有问题,建立ID与列的映射 const formItems = form.getItems(); formItems.forEach(item => { const itemId = item.getId(); // 匹配问题对应的Sheet列(底层关联保障重复标题下的正确性) const columnIndex = headers.findIndex(header => header === item.getTitle()); if (columnIndex !== -1) { // 补充问题类型、选项等信息 let options = []; if (item.getType() === FormApp.ItemType.MULTIPLE_CHOICE) { options = item.asMultipleChoiceItem().getChoices().map(choice => choice.getValue()); } else if (item.getType() === FormApp.ItemType.CHECKBOX) { options = item.asCheckboxItem().getChoices().map(choice => choice.getValue()); } mapping[`question-id: ${itemId}`] = { column: String.fromCharCode(65 + columnIndex), // 转换为A/B/C形式的列名 title: item.getTitle(), type: item.getType().toString(), options: options }; } }); // 控制台输出映射结果 console.log("问题与Sheet列映射关系:"); Object.entries(mapping).forEach(([qId, details]) => { console.log(`${qId} <--> Column ${details.column}`); console.log(`问题类型:${details.type},可选选项:${details.options.join(", ")}`); }); return mapping; }
2. 关键细节说明
- 唯一ID作为核心标识:
item.getId()返回的是表单问题的永久唯一ID,无论标题重复、问题顺序调整,该ID都不会改变,是确保映射准确的关键。 - 自动适配重复标题:即使多个问题标题完全一致,App Script底层会维护表单问题与Sheet列的绑定关系,通过
getTitle()匹配即可定位到正确的列。 - 获取问题元数据:通过
item.getType()判断问题类型(如选择题、复选框等),再调用对应类型的方法(如asMultipleChoiceItem())提取可选选项,满足你对问题类型的需求。
测试验证(以你提供的示例场景为例)
运行代码后会输出如下结果:
问题与Sheet列映射关系: question-id: 1 <--> Column A 问题类型:MULTIPLE_CHOICE,可选选项:Answer 1, Answer 2 question-id: 2 <--> Column B 问题类型:MULTIPLE_CHOICE,可选选项:Answer 3, Answer 4
即使后续调整表单问题顺序,映射关系仍会基于唯一ID保持正确。
注意事项
- 确保Sheet与Form的关联未被手动破坏(比如手动删除响应列后重新关联)。
- 新增表单问题后,重新运行代码即可更新映射关系。
内容的提问来源于stack exchange,提问作者PAS
相关产品推荐
相关产品推荐

