使用Google Apps Script发送幻灯片PDF附件时无法获取更新内容
问题解决与代码优化
核心问题分析
你遇到的PDF是原始模板而非更新后内容,原因有两个关键错误:
- 幻灯片修改后未保存:替换文本后没有将内存中的更改写入Drive文件,所有修改仅停留在临时状态。
- PDF生成方式错误:直接从Drive复制的原始文件快照获取Blob,未同步SlidesApp的修改内容。
另外代码存在冗余调用(重复打开幻灯片)、变量命名不够清晰的问题,以下是修复+优化方案:
优化后的代码
function createCertificate(e) { // 提前解构事件参数,简化代码 const { source, range, value } = e; const sheet = source.getActiveSheet(); const targetSheetName = 'SheetName'; const triggerColumn = 9; // 复选框所在列(I列) // 条件判断逻辑简化 if (sheet.getName() !== targetSheetName || range.getColumn() !== triggerColumn || value !== "TRUE") { return; // 不符合触发条件直接退出 } try { const row = range.getRow(); // 一次性获取整行数据,避免多次调用getRange const [date, fullName, programName, , , , completionDate, days] = sheet.getRange(row, 1, 1, 8).getDisplayValues()[0]; const destinationFolderId = "###"; const sourceSlideId = "###"; const recipientEmail = "mailAddress"; // 复制模板幻灯片 const sourceSlideFile = DriveApp.getFileById(sourceSlideId); const copiedSlideFile = sourceSlideFile.makeCopy(`${fullName} 证书`, DriveApp.getFolderById(destinationFolderId)); const presentation = SlidesApp.openById(copiedSlideFile.getId()); const slide = presentation.getSlides()[0]; // 批量替换文本,逻辑更清晰 const textReplacements = [ ['{{Full Name}}', fullName], ['{{Name of Program}}', programName], ['{{Days}}', days], ['{{Date of Completion}}', completionDate], ['{{Date}}', date] ]; textReplacements.forEach(([placeholder, content]) => { slide.replaceAllText(placeholder, content || ''); // 处理空数据情况 }); // 保存修改并关闭文档,确保更改写入Drive presentation.saveAndClose(); // 从保存后的文档生成PDF Blob const pdfBlob = presentation.getAs('application/pdf'); pdfBlob.setName(`${fullName} 证书.pdf`); // 给PDF设置明确文件名 // 发送邮件 GmailApp.sendEmail( recipientEmail, `您的${programName}证书已生成`, `您好,\n附件是您完成${programName}的结业证书,请查收。`, { attachments: [pdfBlob] } ); // 更新状态为已发送 sheet.getRange(row, triggerColumn + 1).setValue("Sent"); } catch (error) { // 错误处理:记录日志并更新状态为失败 console.error('生成证书失败:', error); sheet.getRange(range.getRow(), range.getColumn() + 1).setValue(`失败: ${error.message}`); } }
关键优化点说明
- 强制保存修改:添加
presentation.saveAndClose()确保幻灯片修改写入Drive文件 - 正确生成PDF:从SlidesApp的文档对象直接生成PDF Blob,保证是最新内容
- 简化逻辑:用解构赋值、数组批量替换文本让代码更易读维护
- 错误处理:添加try-catch块,避免脚本崩溃,同时记录错误状态
- 资源优化:减少重复的服务调用(比如只打开一次幻灯片文档)
- 鲁棒性提升:处理空数据情况,给PDF设置明确文件名
内容的提问来源于stack exchange,提问作者EagleEye
相关产品推荐
相关产品推荐

