谷歌表单响应存储至多表格:现有方案执行报错求助
谷歌表单响应同步至多份表格时的报错排查与修复
问题背景
参考Stack Overflow相关方案实现谷歌表单响应存储到多个电子表格,但运行时触发错误。
使用代码
function copyFormResponses(e) { let ss = SpreadsheetApp.openByUrl("Sheet_URL").getSheetByName("SheetName"); let range = e.range; let values = e.values; let lastRow = ss.getLastRow(); for(let i=1; i<=values.length; i++) { ss.getRange(lastRow+1,i).setValue(values[i-1]); } }
报错信息
Error: TypeError: Cannot read properties of null (reading 'getLastRow')
at copyFormResponses(Test_Transfer:6:20)
触发器配置
手动在Apps Script中创建的触发器,配置如下:
报错原因与修复
原因分析
报错提示Cannot read properties of null (reading 'getLastRow'),说明代码中ss变量为null——也就是要么无法通过指定URL打开目标表格,要么找不到指定名称的工作表。
修复步骤
验证目标表格URL与权限
- 确认代码中
Sheet_URL替换为了目标表格的完整、正确URL,复制时不要遗漏字符或多带参数 - 用当前账号手动打开该URL,确保有权限访问(能查看、编辑表格)
- 确认代码中
核对工作表名称
- 确认
SheetName与目标表格中的工作表名称完全一致,包括大小写、空格、特殊字符(比如原工作表叫"客户反馈"就不能写成"客户 反馈")
- 确认
优化代码(可选但推荐)
原代码循环写入单元格效率较低,且无错误处理,建议替换为更健壮的版本:
function copyFormResponses(e) { // 替换为你的目标表格URL和工作表名称 const targetSheetUrl = "https://docs.google.com/spreadsheets/d/xxx..."; const targetSheetName = "表单响应副本"; try { // 打开目标表格并获取工作表 let targetSpreadsheet = SpreadsheetApp.openByUrl(targetSheetUrl); let targetSheet = targetSpreadsheet.getSheetByName(targetSheetName); // 检查工作表是否存在 if (!targetSheet) { throw new Error(`未找到名为【${targetSheetName}】的工作表`); } // 检查表单响应数据是否有效 let responseValues = e.values; if (!responseValues || responseValues.length === 0) { throw new Error("未获取到有效的表单响应数据"); } // 直接追加整行数据,效率更高 targetSheet.appendRow(responseValues); } catch (error) { // 打印错误日志,方便排查 console.error("同步表单响应失败:", error.message); // 可选:添加邮件提醒,及时知晓错误 // MailApp.sendEmail("你的邮箱@xxx.com", "表单同步失败通知", error.message); } }
触发器说明
从截图看,触发器配置为"表单提交时运行"是正确的,修复代码后即可正常触发执行。
内容的提问来源于stack exchange,提问作者Taher Rajkotwala
相关产品推荐
相关产品推荐

