使用getSheetByName获取已存在的工作表返回null的问题求助
问题分析与解决方案
核心问题
- 未定义的
form变量:代码中直接调用form.setDestination,但form从未被赋值,会先触发ReferenceError,导致后续代码执行异常。 - 电子表格对象未刷新:设置表单响应目标后,原
sheetCopy对象并未同步新创建的工作表,导致getSheetByName无法找到刚生成的表。 - 工作表名称匹配问题:默认的表单响应表名称可能因模板设置、语言环境或重复创建而变化,硬编码名称容易匹配失败。
修正后的代码
var sheetTemplate = SpreadsheetApp.openById('0123456789'); var sheetCopy = sheetTemplate.copy('Spreadsheet name'); var sheetCopyId = sheetCopy.getId(); var formTemplateId = '987654321'; var formFolder = DriveApp.getFolderById('123123123'); var formName = 'Form name'; var formCopy = DriveApp.getFileById(formTemplateId).makeCopy(formName, formFolder); // 打开复制后的表单对象,修复未定义的form变量 var form = FormApp.openById(formCopy.getId()); form.setDestination(FormApp.DestinationType.SPREADSHEET, sheetCopyId); // 重新获取电子表格对象,确保加载新创建的响应工作表 sheetCopy = SpreadsheetApp.openById(sheetCopyId); // 方案1:尝试匹配默认名称(可根据实际情况调整) var formResponsesSheet = sheetCopy.getSheetByName('Form Responses 1'); // 方案2:备选遍历匹配(避免名称差异) if (!formResponsesSheet) { var sheets = sheetCopy.getSheets(); for (var i = 0; i < sheets.length; i++) { var sheet = sheets[i]; if (sheet.getName().indexOf('Form Responses') !== -1) { formResponsesSheet = sheet; break; } } } // 确保找到工作表后再重命名 if (formResponsesSheet) { formResponsesSheet.setName('New sheet name'); } else { throw new Error('未找到表单响应工作表'); }
额外说明
- 若你的Google账户语言非英文,表单响应表的默认名称可能是本地化的(比如中文环境下是“表单响应 1”),需对应调整匹配的名称。
- 若模板表单原本已关联过电子表格,复制后的表单可能保留旧关联,建议在复制表单后先调用
form.setDestination覆盖旧关联。
内容的提问来源于stack exchange,提问作者Elliot L. Richardson
相关产品推荐
相关产品推荐

