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

Google Sheets脚本报错‘Document is missing’排查求助

解决Google Sheets脚本打开文档报错:Document is missing的问题

问题场景

我借助ChatGPT开发了一款Google Sheets脚本,用于提取表格第一列链接的docx文件中的指定信息。脚本正常运行数月后,突然出现报错:

Exception: Document is missing (perhaps it was deleted, or maybe you don't have read access?)

已确认文件未删除且自身拥有访问权限,但问题仍未解决,原脚本代码如下:

function FineFiller() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getRange("A2:A");
  var links = range.getValues();
  
  for (var i = 0; i < links.length; i++) {
    var doc = DocumentApp.openByUrl(links[i][0]);
    var text = doc.getBody().getText();
    
    var verbaleNum = text.substring(text.indexOf("Verbale n°: ") + 12, text.indexOf("Verbale n°: ") + 30);
    sheet.getRange(i + 2, 2).setValue(verbaleNum);
    
    var giorno = text.substring(text.indexOf("Il giorno ") + 10, text.indexOf("Il giorno ") + 20);
    sheet.getRange(i + 2, 3).setValue(giorno);
    
    var ore = text.substring(text.indexOf("alle ore ") + 9, text.indexOf("alle ore ") + 14);
    sheet.getRange(i + 2, 4).setValue(ore);
    
    var targa = text.substring(text.indexOf("targa ") + 6, text.indexOf("targa ") + 12);
    sheet.getRange(i + 2, 5).setValue(targa);
    
    var totale = text.substring(text.indexOf("per un totale di euro ") + 22, text.indexOf("per un totale di euro ") + 27);
    sheet.getRange(i + 2, 6).setValue(totale);
  }
}

可能的原因

  • 空行/无效链接:脚本遍历A列所有行,包括空行或格式错误的链接,这类无效值会触发文档缺失报错
  • 链接格式兼容性:Google Docs的分享链接有多种格式(如查看链接、嵌入链接),部分格式无法被openByUrl直接识别
  • API配额限制:Google Apps Script有每日API调用配额,超出后会触发权限类报错
  • 隐性权限变更:即使你拥有访问权限,文档的共享设置可能发生细微变化(如从组织内共享改为特定用户)

解决方案及优化代码

针对上述问题,对脚本做以下修改:

  • 过滤空行和无效链接
  • 用文档ID替代URL打开文档(openById比openByUrl更稳定)
  • 添加错误处理,单个文档失败不中断整个脚本
  • 批量读写数据,减少API调用次数提升性能

修改后的代码:

function FineFiller() {
  var sheet = SpreadsheetApp.getActiveSheet();
  // 获取有数据的行范围,避免遍历空行
  var lastRow = sheet.getLastRow();
  if (lastRow < 2) return; // 无数据直接退出
  
  var range = sheet.getRange("A2:F" + lastRow);
  var values = range.getValues();
  var output = [];
  
  for (var i = 0; i < values.length; i++) {
    var link = values[i][0];
    var rowOutput = ["", "", "", "", ""]; // 对应B-F列
    
    if (!link) {
      output.push(rowOutput);
      continue;
    }
    
    try {
      // 从链接中提取文档ID
      var docId = extractDocId(link);
      if (!docId) throw new Error("无效的文档链接");
      
      var doc = DocumentApp.openById(docId);
      var text = doc.getBody().getText();
      
      // 提取信息,添加判断避免索引不存在报错
      var verbaleIndex = text.indexOf("Verbale n°: ");
      if (verbaleIndex !== -1) {
        rowOutput[0] = text.substring(verbaleIndex + 12, Math.min(verbaleIndex + 30, text.length));
      }
      
      var giornoIndex = text.indexOf("Il giorno ");
      if (giornoIndex !== -1) {
        rowOutput[1] = text.substring(giornoIndex + 10, Math.min(giornoIndex + 20, text.length));
      }
      
      var oreIndex = text.indexOf("alle ore ");
      if (oreIndex !== -1) {
        rowOutput[2] = text.substring(oreIndex + 9, Math.min(oreIndex + 14, text.length));
      }
      
      var targaIndex = text.indexOf("targa ");
      if (targaIndex !== -1) {
        rowOutput[3] = text.substring(targaIndex + 6, Math.min(targaIndex + 12, text.length));
      }
      
      var totaleIndex = text.indexOf("per un totale di euro ");
      if (totaleIndex !== -1) {
        rowOutput[4] = text.substring(totaleIndex + 22, Math.min(totaleIndex + 27, text.length));
      }
      
    } catch (e) {
      // 记录错误信息到控制台,不中断脚本
      console.log("处理第" + (i + 2) + "行失败:" + e.message);
    }
    
    output.push(rowOutput);
  }
  
  // 批量写入结果,提升性能
  sheet.getRange(2, 2, output.length, output[0].length).setValues(output);
}

// 提取Google Docs链接中的文档ID
function extractDocId(url) {
  var regex = /[-\w]{25,}/;
  var match = url.match(regex);
  return match ? match[0] : null;
}

关键改动说明

  1. 范围优化:使用getLastRow()获取实际有数据的行,避免遍历空行
  2. 链接处理:新增extractDocId函数提取文档ID,兼容多种Google Docs链接格式
  3. 错误处理:用try-catch包裹文档操作,单个文档失败时记录错误并继续执行
  4. 批量读写:先收集所有结果再一次性写入,减少API调用次数,避免配额耗尽
  5. 边界判断:提取文本时添加索引存在判断,避免因文本格式变化导致的报错

内容的提问来源于stack exchange,提问作者Emanuele Mario Marcari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 04:43:21