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); }
额外说明
saveAndClose()会强制把内存中的修改写入Drive,确保后续导出PDF时能获取到最新内容。- 改用
SlidesApp.openById(presentationId).getAs('application/pdf')导出PDF,直接基于已保存的幻灯片生成,比DriveApp的方法更适配Slides的修改场景。 - 完全不需要
Utilities.sleep(),因为保存操作是同步的,执行完就可以立即导出。
内容的提问来源于stack exchange,提问作者Prinju
相关产品推荐
相关产品推荐

