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

Google Apps Script幻灯片转PDF数据丢失问题求助

解决Google Apps Script幻灯片转PDF后内容丢失的问题

问题根源

你遇到的核心问题是:用SlidesApp修改幻灯片后,没有显式保存修改就直接通过DriveApp导出PDF。SlidesApp对文档的修改先存在内存中,不会自动实时同步到Drive,单纯加延迟根本没用——Drive获取的还是修改前的原模板文件。

修复方案

只需要在修改完幻灯片后,调用saveAndClose()方法强制保存修改,替换掉原来的Utilities.sleep(3000)即可。另外,改用SlidesApp自带的导出PDF方法,比DriveApp的getAs更可靠。

修改后的完整代码

function createPDFsAndGenerateLinks() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const rows = sheet.getDataRange().getValues();
  const folderIdForPDFs = '1up5Z6bwO4K_PuiNjgN0DRh_pNnU_Q6tQ';
  const templatePresentationId = '1sZ2HWnf1feqCzOOy17txAvRXyhhs0xCecxHPxvvR6gI';
  const imagesFolderId = '1zhWR4ADwvgT63uv23z7SSySYZTaZCkeq';

  Logger.log("Starting to process rows");

  rows.forEach((row, index) => {
    if (index === 0 || !row[0]) {
      Logger.log("Skipping row " + (index + 1) + " (header or empty)");
      return;
    }

    const name = row[0].trim();
    Logger.log("Processing " + name);
    
    const pdfFile = createTicketPDF(name, templatePresentationId, folderIdForPDFs, imagesFolderId);

    if (pdfFile) {
      Logger.log("Created PDF for " + name);
      sheet.getRange(index + 1, 6).setValue(pdfFile.getUrl());
    } else {
      Logger.log("Failed to create PDF for " + name);
    }
  });

  Logger.log("Finished processing rows");
}

function createTicketPDF(name, templatePresentationId, folderIdForPDFs, imagesFolderId) {
  const copiedPresentation = DriveApp.getFileById(templatePresentationId).makeCopy();
  const presentationId = copiedPresentation.getId();
  Logger.log("Copied template for " + name);

  const slidesAppPresentation = SlidesApp.openById(presentationId);
  const slide = slidesAppPresentation.getSlides()[0];
  slide.replaceAllText('{{Name}}', name);
  Logger.log("Replaced placeholder with " + name);

  const imageFile = findImageByName(name + '.png', imagesFolderId);
  if (imageFile) {
    Logger.log("Found image for " + name);
    const imageBlob = imageFile.getBlob();
    insertImageAtPosition(slide, imageBlob, 5.05, 23.43, 19, 19);
  } else {
    Logger.log("No image found for " + name);
  }

  // 关键修复:保存并关闭幻灯片,确保修改同步到Drive
  slidesAppPresentation.saveAndClose();

  // 用SlidesApp的导出方法生成PDF,更可靠
  const pdfBlob = SlidesApp.openById(presentationId).getAs('application/pdf');
  const pdfName = `${name}_Ticket.pdf`;
  const pdfFile = DriveApp.getFolderById(folderIdForPDFs).createFile(pdfBlob).setName(pdfName);

  DriveApp.getFileById(presentationId).setTrashed(true);
  Logger.log("Created PDF for " + name);

  return pdfFile;
}

function findImageByName(name, imagesFolderId) {
  const folder = DriveApp.getFolderById(imagesFolderId);
  Logger.log("Searching for image in folder: " + folder.getName());
  const files = folder.getFilesByName(name);
  if (files.hasNext()) {
    const file = files.next();
    Logger.log("Found file: " + file.getName());
    return file;
  }
  Logger.log("No file found for " + name);
  return null;
}

function insertImageAtPosition(slide, imageBlob, xCm, yCm, widthCm, heightCm) {
  const xPoints = xCm * 28.3465;
  const yPoints = yCm * 28.3465;
  const widthPoints = widthCm * 28.3465;
  const heightPoints = heightCm * 28.3465;
  slide.insertImage(imageBlob, xPoints, yPoints, widthPoints, heightPoints);
}

额外说明

  1. saveAndClose()会强制把内存中的修改写入Drive,确保后续导出PDF时能获取到最新内容。
  2. 改用SlidesApp.openById(presentationId).getAs('application/pdf')导出PDF,直接基于已保存的幻灯片生成,比DriveApp的方法更适配Slides的修改场景。
  3. 完全不需要Utilities.sleep(),因为保存操作是同步的,执行完就可以立即导出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 03:21:08