如何用Apps Script实现Google表单图片导入幻灯片后导出PNG
解决方案:表单提交自动生成幻灯片并导出为PNG
问题说明
需要实现:基于模板创建幻灯片,将Google表单提交的图片设为背景,同时保留模板中的叠加层图片;完成幻灯片创建后自动导出为PNG文件,但无法将生成幻灯片的代码与导出代码结合,核心问题是无法让导出代码获取刚创建的幻灯片ID。
修改后的完整代码
// 替换为你的目标文件夹ID var folderId = "xxxxxxxxxxxxxxxxxxxx"; function onFormSubmit(e) { // 打开模板幻灯片 var templateDoc = DriveApp.getFileById('1bGKJ027bnUCgSpQrunXXBZCgFNXZHtF2ZnsaWHLh8B4'); // 复制模板生成新幻灯片文件 var newTempFile = templateDoc.makeCopy(); var newPresentationId = newTempFile.getId(); // 打开新幻灯片进行编辑 var openSlide = SlidesApp.openById(newPresentationId); var items = e.response.getItemResponses(); // 将表单提交的图片替换模板中的占位符 var imageId = items[0].getResponse(); openSlide.getSlides().forEach(slide => { slide.getShapes().forEach(shape => { if (shape.getText().asString().trim() == '{{image1}}') { const imageFile = DriveApp.getFileById(Array.isArray(imageId) ? imageId[0] : imageId); shape.replaceWithImage(imageFile.getBlob()); } }); }); // 重命名新幻灯片 var slideName = items[0].getResponse(); newTempFile.setName(slideName); // 调用导出函数,传入新幻灯片ID convertToPNG(newPresentationId, slideName); } function convertToPNG(presentationId, slideName) { // 导出第一张幻灯片为PNG(slideId为'p'代表第一张) var slideId = 'p'; var url = `https://docs.google.com/presentation/d/${presentationId}/export/png?id=${presentationId}&pageid=${slideId}`; var options = { headers: { Authorization: 'Bearer ' + ScriptApp.getOAuthToken() } }; var response = UrlFetchApp.fetch(url, options); var imageBlob = response.getAs(MimeType.PNG); // 用幻灯片名称命名PNG文件,避免随机名称 imageBlob.setName(`${slideName}.png`); // 保存到指定文件夹并输出URL var imgUrl = DriveApp.getFolderById(folderId).createFile(imageBlob).getUrl(); Logger.log(imgUrl); }
关键改动说明
- 将导出函数改为带参数形式:
convertToPNG现在接收presentationId(新创建的幻灯片ID)和slideName(用于命名PNG),解决了无法传递ID的核心问题。 - 在表单提交函数中直接调用导出:创建完新幻灯片并完成编辑后,立即调用
convertToPNG,传入刚生成的newPresentationId,无需手动填写ID。 - 优化文件名:用幻灯片的名称作为PNG文件名,替代随机数,更便于识别。
- 简化代码逻辑:整理了变量命名,让代码更易读,同时确保SlidesApp的编辑操作完成后再执行导出。
内容的提问来源于stack exchange,提问作者jaba
相关产品推荐
相关产品推荐

