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

使用Google Apps Script发送幻灯片PDF附件时无法获取更新内容

问题解决与代码优化

核心问题分析

你遇到的PDF是原始模板而非更新后内容,原因有两个关键错误:

  1. 幻灯片修改后未保存:替换文本后没有将内存中的更改写入Drive文件,所有修改仅停留在临时状态。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 13:30:04