使用Google Sheet模板生成PDF时遇文档缺失错误求助
问题:Google Sheet模板生成PDF时触发"Document is missing"错误
背景
我是App Script新手,编写脚本实现以下流程:表单提交后表格填充数据→提取条目数据→复制模板生成新文件→保存为PDF并发送邮件。使用Google Doc作为模板时脚本可正常运行,但换成Google Sheet模板后出现错误。
报错信息
Exception: Document is missing (perhaps it was deleted, or you don't have read access?)
报错位置:Create_PDF(Code:32:34) 和 After_Submit(Code:13:21)
核心原因
脚本中使用DocumentApp.openById()尝试打开复制后的Google Sheet文件,但DocumentApp仅支持操作Google Docs文档,无法处理Google Sheets表格,这是触发错误的直接原因。
修复方案
1. 核心修改逻辑
将操作模板的工具从DocumentApp替换为SpreadsheetApp,完成数据替换后再导出为PDF,同时添加页面适配配置。
2. 完整修复代码
function After_Submit(e) { var range = e.range; var row = range.getRow(); var sheet = range.getSheet(); var headers = sheet.getRange(1, 1, 1, 5).getValues().flat(); var data = sheet.getRange(row, 1, 1, headers.length).getValues(); var values = {}; for (var i = 0; i < headers.length; i++) { values[headers[i]] = data[0][i]; } Logger.log(values); const pdfFile = Create_PDF(values); sendEmail(e.namedValues['Your Email'][0], pdfFile); } function sendEmail(email, pdfFile) { GmailApp.sendEmail(email, "Subject", "Message", { attachments: [pdfFile], name: "From Someone" }); } function Create_PDF(values) { const PDF_folder = DriveApp.getFolderById("1t_BYHO8CqmKxVIucap_LlE0MhslpT7BO"); const TEMP_FOLDER = DriveApp.getFolderById("1TNeI1HaSwsloOI4KnIfybbWR4u753vVd"); const PDF_Template = DriveApp.getFileById('1Ye7DyJQOjA3J_EUOQteWcuASBCfqlA-_lzyNw0REjY8'); // 复制Sheet模板到临时文件夹 const newTempFile = PDF_Template.makeCopy(TEMP_FOLDER); // 用SpreadsheetApp打开复制后的表格 const ss = SpreadsheetApp.openById(newTempFile.getId()); // 可替换为模板中实际的工作表名称,比如ss.getSheetByName("模板页") const targetSheet = ss.getActiveSheet(); // 遍历表格替换占位符(格式为{{表头名称}}) const dataRange = targetSheet.getDataRange(); const allValues = dataRange.getValues(); for (let rowIdx = 0; rowIdx < allValues.length; rowIdx++) { for (let colIdx = 0; colIdx < allValues[rowIdx].length; colIdx++) { const cellContent = allValues[rowIdx][colIdx]; if (typeof cellContent === 'string') { for (const key in values) { const placeholder = `{{${key}}}`; if (cellContent.includes(placeholder)) { targetSheet.getRange(rowIdx + 1, colIdx + 1).setValue(cellContent.replace(placeholder, values[key])); } } } } } // 强制保存表格修改 SpreadsheetApp.flush(); // 配置PDF导出参数,适配页面 const exportUrl = `https://docs.google.com/spreadsheets/d/${newTempFile.getId()}/export?` + `exportFormat=pdf&format=pdf` + `&size=A4` + // 页面尺寸 `&portrait=true` + // 纵向 `&fitw=true` + // 适配宽度 `&sheetnames=false&printtitle=false` + // 隐藏工作表名和标题 `&pagenumbers=false&gridlines=false`; // 隐藏页码和网格线 // 授权获取PDF Blob const pdfBlob = UrlFetchApp.fetch(exportUrl, { headers: {'Authorization': 'Bearer ' + ScriptApp.getOAuthToken()} }).getBlob(); // 创建PDF文件并命名 const pdfFile = PDF_folder.createFile(pdfBlob) .setName(`提交记录_${new Date().toLocaleDateString()}`); // 删除临时文件,避免占用空间 TEMP_FOLDER.removeFile(newTempFile); console.log("PDF文件已生成"); return pdfFile; }
3. 额外优化说明
- 新增临时文件自动删除逻辑,防止临时文件夹堆积无用文件
- 使用URL导出方式精细控制PDF页面样式,确保内容适配A4页面
- 明确工作表获取方式,可根据模板实际结构指定具体工作表名称
内容的提问来源于stack exchange,提问作者Zeekane
相关产品推荐
相关产品推荐

