如何通过Google App Script实现Google Form响应自动写入Google Spreadsheet
问题结论
该需求完全可实现,不需要采用「从电子表格生成表单」的方案,直接在Google App Script中调用表单原生的目标绑定方法即可完成配置,效果和手动在表单后台设置响应存储位置完全一致。
实现逻辑
核心调用Form服务提供的setDestination()方法,即可给已独立创建的表单绑定响应存储的目标电子表格。如果需要指定存储到电子表格内的某张特定工作表,只需要在首次绑定后,把表单自动生成的默认响应表替换为你指定的工作表即可,全程不需要自己写响应同步逻辑,原生同步的稳定性远高于自定义触发器。
可复用代码
function configFormResponseTarget() { // 替换为你实际的表单ID const formId = '请填入你的Google Form ID'; // 替换为你实际的目标电子表格ID const targetSpreadsheetId = '请填入你的Google Spreadsheet ID'; // 替换为你要存储响应的指定工作表名称 const targetSheetName = '请填入目标工作表名称'; const form = FormApp.openById(formId); const targetSpreadsheet = SpreadsheetApp.openById(targetSpreadsheetId); // 首次绑定目标电子表格,系统会自动生成一张默认的响应存储表 form.setDestination(FormApp.DestinationType.SPREADSHEET, targetSpreadsheetId); // 定位系统自动生成的默认响应表 const defaultResponseSheet = form.getResponses().length > 0 ? targetSpreadsheet.getSheets().find(sheet => sheet.getRange(1,1).getValue() === '时间戳') // 表单响应表第一列固定为时间戳表头 : targetSpreadsheet.getSheets().slice(-1)[0]; // 无历史响应时,最新生成的表就是默认响应表 // 检查指定的目标工作表是否存在,不存在则新建 let targetSheet = targetSpreadsheet.getSheetByName(targetSheetName); if (!targetSheet) { targetSheet = targetSpreadsheet.insertSheet(targetSheetName); } // 把默认响应表的表头、已有历史响应全部复制到指定工作表 const existingData = defaultResponseSheet.getDataRange().getValues(); if (existingData.length > 0) { targetSheet.getRange(1, 1, existingData.length, existingData[0].length).setValues(existingData); } // 删除系统自动生成的默认响应表 targetSpreadsheet.deleteSheet(defaultResponseSheet); }
注意事项
- 运行脚本前请确认你对操作的表单、电子表格均拥有编辑权限,首次运行需要授权对应服务的访问权限
- 脚本执行完成后,所有新提交的表单响应会自动追加到你指定的工作表中,不需要额外配置触发器
- 如果你不需要保留历史响应,也不需要提前创建指定工作表,直接运行
form.setDestination(FormApp.DestinationType.SPREADSHEET, targetSpreadsheetId),之后把系统自动生成的默认响应表重命名为你需要的表名即可,效果完全一致 - 不要给同一个表单重复绑定多个电子表格作为响应目标,会导致响应同步异常
内容的提问来源于stack exchange,提问作者Linus Nox
相关产品推荐
相关产品推荐

