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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 03:25:15