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; }
关键改动说明
- 范围优化:使用
getLastRow()获取实际有数据的行,避免遍历空行 - 链接处理:新增
extractDocId函数提取文档ID,兼容多种Google Docs链接格式 - 错误处理:用
try-catch包裹文档操作,单个文档失败时记录错误并继续执行 - 批量读写:先收集所有结果再一次性写入,减少API调用次数,避免配额耗尽
- 边界判断:提取文本时添加索引存在判断,避免因文本格式变化导致的报错
内容的提问来源于stack exchange,提问作者Emanuele Mario Marcari
相关产品推荐
相关产品推荐

