Google Apps Script报错Cannot read property 'getResponse' of undefined怎么解决
问题原因分析
- 报错的根本原因是代码中通过固定索引
[2]取itemResponses数组元素时,实际数组长度不足3,导致itemResponsePhoto为undefined,调用getResponse()方法就触发了类型错误。 - 最常见的触发原因:你误将表单默认的提交时间戳当成了表单项响应,占了索引
[0]的位置。实际上表单提交时间戳不属于用户填写的表单项,不需要从itemResponses中获取,直接调用formResponse.getTimestamp()方法就能拿到,你的索引计算从一开始就错位了。 - 其他可能的原因:
- 你调整过Google表单的问题顺序,上传文件的问题位置和你预设的索引不匹配
- 部分旧响应是你添加上传文件问题之前提交的,没有对应上传项的响应数据
- 上传文件问题设置为非必填,有用户提交时未上传文件,没有对应项的响应数据
修复方案
代码修改说明
- 改为直接从
formResponse对象获取提交时间戳,不再占用itemResponses的索引 - 改为通过表单项标题匹配对应响应,不再依赖固定索引,避免表单调整顺序后再次出错
- 增加非空判断,无对应上传项时自动跳过,不会触发报错
- 自动获取原文件后缀,不需要硬编码写死
.jpg,适配不同格式的上传文件
修复后代码
function RenameResponses() { // 替换为你自己的表单ID var form = FormApp.openById('MyFormID'); var formResponses = form.getResponses(); var baseString = 'https://drive.google.com/file/d/'; var endString = '/view?usp=drivesdk'; // 替换为你自己的目标文件夹ID var folder = DriveApp.getFolderById('MyFolderID'); var files = folder.getFiles(); // 替换为你表单里对应的表单项标题,要和实际设置完全一致 const NAME_ITEM_TITLE = '姓名'; const UPLOAD_ITEM_TITLE = '上传照片'; while (files.hasNext()) { var file = files.next(); for (var i = 0; i < formResponses.length; i++) { var formResponse = formResponses[i]; var itemResponses = formResponse.getItemResponses(); // 直接获取提交时间戳,不需要从itemResponses取 var submitTime = formResponse.getTimestamp().toLocaleString(); var userName = ''; var photoID = ''; // 遍历响应匹配对应表单项,不依赖固定索引 for (var j = 0; j < itemResponses.length; j++) { var item = itemResponses[j].getItem(); var itemTitle = item.getTitle(); if (itemTitle === NAME_ITEM_TITLE) { userName = itemResponses[j].getResponse(); } else if (itemTitle === UPLOAD_ITEM_TITLE) { photoID = itemResponses[j].getResponse(); } } // 非空判断,没有拿到用户名或上传文件ID就跳过 if (!userName || !photoID) continue; var newName = userName + " - " + submitTime; var url = baseString + photoID + endString; var urlCheck = file.getUrl(); if (url == urlCheck) { // 自动获取原文件后缀,适配所有格式 var fileExt = file.getName().split('.').pop(); var modName = newName + "." + fileExt; file.setName(modName); } } } }
额外优化建议
如果需要实现新提交表单后自动重命名,不需要每次手动运行全量遍历,可以在Apps Script编辑器的左侧「触发器」菜单中,添加一个触发条件为「表单提交时」的触发器,绑定RenameResponses函数即可,运行效率更高。
内容的提问来源于stack exchange,提问作者tTownTom
相关产品推荐
相关产品推荐

