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
相关产品推荐
相关产品推荐

