AppScript生成表单对应工作表重命名及响应汇总到总表咨询
Google 表单批量生成场景下的响应数据存储解决方案
需求1:自动重命名新生成的表单对应工作表
原生setDestination方法会自动在目标电子表格中新增对应工作表,你可以在设置完目标表格后,直接捕获最新生成的工作表完成重命名,参考代码如下:
const destination = SpreadsheetApp.openById('你的电子表格ID'); form.setDestination(FormApp.DestinationType.SPREADSHEET, destination.getId()); // 确保前面的写入操作生效 SpreadsheetApp.flush(); // 自定义工作表名称,可按你自己的规则拼接,比如表单ID+表单名称 const customSheetName = `${form.getId()}_${form.getTitle()}`; // 新增的工作表默认排在所有工作表末尾,直接取最后一个即可 const newResponseSheet = destination.getSheets()[destination.getSheets().length - 1]; newResponseSheet.setName(customSheetName);
注意:如果存在短时间内批量创建大量表单的场景,可添加1-2秒的延迟避免工作表读取顺序错误
需求2:所有表单响应统一写入同一个总表
原生setDestination不支持多表单共享同一个响应工作表,你可以改用「表单提交触发器+自定义写入逻辑」实现该需求,不需要调用setDestination方法,实现步骤如下:
- 编写表单提交事件的处理函数,统一将响应写入总表
- 批量创建表单时,为每个表单绑定提交触发器
参考代码
表单创建阶段绑定触发器
// 批量创建表单的逻辑中,创建完表单实例后添加下面的代码 ScriptApp.newTrigger("handleFormSubmit") .forForm(form) .onFormSubmit() .create();
响应提交处理函数
function handleFormSubmit(e) { // 替换为你的总表ID和总表工作表名称 const SUMMARY_SPREADSHEET_ID = "你的总表ID"; const TARGET_SHEET_NAME = "响应总表"; const targetSheet = SpreadsheetApp.openById(SUMMARY_SPREADSHEET_ID).getSheetByName(TARGET_SHEET_NAME); // 获取本次提交的所有数据 const response = e.response; const itemResponses = response.getItemResponses(); // 组装行数据,可按需添加表单标识字段方便区分不同表单的提交 const outputRow = [ response.getTimestamp(), // 提交时间 e.source.getTitle(), // 所属表单名称 e.source.getId(), // 所属表单ID ...itemResponses.map(item => item.getResponse()) // 按顺序返回所有问题的答案 ]; // 写入总表最后一行 targetSheet.appendRow(outputRow); }
注意:独立脚本需要持有所有表单和目标电子表格的编辑权限,触发器创建有单日配额限制,批量生成前请确认配额余量
内容的提问来源于stack exchange,提问作者alb
相关产品推荐
相关产品推荐

