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

Google Apps Script修改后文档转PDF异常,误转原模板文件

问题:Google Apps Script修改文档副本后转PDF,却导出原始模板内容

问题描述

复制Google文档模板并完成文本替换、添加表格和段落的修改后,调用doc.getBlob().getAs('application/pdf')生成的PDF始终是原始模板内容,而非修改后的副本,已确认文件ID正确。

原代码

function convertToPdf(){
    var template = DriveApp.getFileById('1S5-fujBacEZmsCwMy5haxjRXwROJkQNfeEMim3YSk9s');
    var dstFolder = DriveApp.getFolderById('1-yW6jKPC1BctT7pGo1dQSbhvN3wlhxqP');
    var copy = DriveApp.getFileById(template.getId()).makeCopy(`Invoice for ${client_name}`,dstFolder);
    var doc = DocumentApp.openById(copy.getId());

    var tableData = header.concat(services).map(row => row.splice(1,4));
    var replacetxt2 = doc.getBody().replaceText('{Client Name}',client_name);
    var table = doc.getBody().appendTable(tableData);
    var tableHeader = table.getRow(0);
    for (i = 0; i < 4; i++) {
      tableHeader.getCell(i).setBackgroundColor('#FFC0CB')
    }
    tableHeader.editAsText().setBold(true).setForegroundColor('#000000');
    const sumtotal = doc.getBody().appendParagraph('$'+sum);

    var email = GmailApp.sendEmail('email@gmail.com', `Invoice for ${client_name}`, 'Your invoice as requested',
      {
        attachments: [doc.getBlob().getAs('application/pdf')]
      })
}

问题原因

用DocumentApp.openById()打开文档后,所有修改仅存在于内存中的文档实例,并未同步保存到Drive上的实际文件。直接调用getBlob()会基于打开时的初始文档状态(也就是模板副本的原始内容)生成PDF,自然得不到修改后的结果。

解决方案

在生成PDF前,必须调用doc.saveAndClose()将内存中的修改同步到Drive文件,之后再获取文件的Blob生成PDF。同时可以简化代码中冗余的文件获取逻辑。

修改后的代码

function convertToPdf(){
    var template = DriveApp.getFileById('1S5-fujBacEZmsCwMy5haxjRXwROJkQNfeEMim3YSk9s');
    var dstFolder = DriveApp.getFolderById('1-yW6jKPC1BctT7pGo1dQSbhvN3wlhxqP');
    // 简化副本创建:直接用已获取的template实例,无需重复通过ID查询
    var copy = template.makeCopy(`Invoice for ${client_name}`,dstFolder);
    var doc = DocumentApp.openById(copy.getId());

    var tableData = header.concat(services).map(row => row.splice(1,4));
    doc.getBody().replaceText('{Client Name}',client_name);
    var table = doc.getBody().appendTable(tableData);
    var tableHeader = table.getRow(0);
    for (i = 0; i < 4; i++) {
      tableHeader.getCell(i).setBackgroundColor('#FFC0CB')
    }
    tableHeader.editAsText().setBold(true).setForegroundColor('#000000');
    doc.getBody().appendParagraph('$'+sum);

    // 关键步骤:保存修改并关闭文档,同步到Drive
    doc.saveAndClose();

    // 从Drive获取最新的文件Blob,生成PDF
    var pdfBlob = DriveApp.getFileById(copy.getId()).getAs('application/pdf');

    GmailApp.sendEmail('email@gmail.com', `Invoice for ${client_name}`, 'Your invoice as requested',
      {
        attachments: [pdfBlob]
      })
}

额外优化说明

  • 移除了冗余的DriveApp.getFileById(template.getId()),直接使用已获取的template文件实例创建副本,减少API调用次数。
  • 删除了不必要的变量赋值(如replacetxt2、sumtotal),简化代码结构。

内容的提问来源于stack exchange,提问作者Chi Resha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 08:30:35