You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Apps Script报错Cannot read property 'getResponse' of undefined怎么解决

问题原因分析
  • 报错的根本原因是代码中通过固定索引[2]取itemResponses数组元素时,实际数组长度不足3,导致itemResponsePhoto为undefined,调用getResponse()方法就触发了类型错误。
  • 最常见的触发原因:你误将表单默认的提交时间戳当成了表单项响应,占了索引[0]的位置。实际上表单提交时间戳不属于用户填写的表单项,不需要从itemResponses中获取,直接调用formResponse.getTimestamp()方法就能拿到,你的索引计算从一开始就错位了。
  • 其他可能的原因:
    • 你调整过Google表单的问题顺序,上传文件的问题位置和你预设的索引不匹配
    • 部分旧响应是你添加上传文件问题之前提交的,没有对应上传项的响应数据
    • 上传文件问题设置为非必填,有用户提交时未上传文件,没有对应项的响应数据
修复方案

代码修改说明

  1. 改为直接从formResponse对象获取提交时间戳,不再占用itemResponses的索引
  2. 改为通过表单项标题匹配对应响应,不再依赖固定索引,避免表单调整顺序后再次出错
  3. 增加非空判断,无对应上传项时自动跳过,不会触发报错
  4. 自动获取原文件后缀,不需要硬编码写死.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 20:45:03