如何通过固定链接实现Google Sheets填充Google Slides模板并生成PDF
解决方案:搭建自动更新+PDF下载的固定链接服务
基于Google Apps Script实现,用户点击链接即可自动拉取Sheets最新数据更新Slides,并触发PDF下载。
步骤1:准备工作
- 确认Slides模板中的标签(如
{Address})与Sheets数据列标题完全匹配,比如Sheets列名Address对应Slides的{Address}。 - 提取并记录Slides和Sheets的ID(从文件URL中获取,格式为
https://docs.google.com/presentation/d/[SLIDES_ID]/edit)。
步骤2:编写Apps Script代码
打开Slides的脚本编辑器(点击「扩展程序」→「Apps Script」),替换默认代码为以下内容:
function doGet(e) { // 替换为你的Slides、Sheets ID和工作表名称 const SLIDES_ID = "你的Slides模板ID"; const SHEETS_ID = "你的Sheets数据文件ID"; const SHEET_NAME = "数据所在工作表名称"; // 1. 复制模板幻灯片,避免修改原文件 const template = SlidesApp.openById(SLIDES_ID); const tempSlide = template.makeCopy("临时幻灯片_" + new Date().getTime()); const tempSlideId = tempSlide.getId(); // 2. 从Sheets读取最新数据 const sheet = SpreadsheetApp.openById(SHEETS_ID).getSheetByName(SHEET_NAME); const headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0]; const dataRow = sheet.getRange(2, 1, 1, sheet.getLastColumn()).getValues()[0]; // 数据默认取第2行,可自行调整行号 // 构建标签-数据映射 const dataMap = {}; headers.forEach((header, index) => { dataMap[`{${header}}`] = dataRow[index] || ""; }); // 3. 批量替换幻灯片中的所有标签 tempSlide.getSlides().forEach(slide => { slide.getShapes().forEach(shape => { const text = shape.getText(); Object.keys(dataMap).forEach(tag => { if (text.asString().includes(tag)) { text.replaceAllText(tag, dataMap[tag]); } }); }); }); // 4. 生成PDF下载链接并返回自动跳转页面 const pdfUrl = `https://docs.google.com/presentation/d/${tempSlideId}/export/pdf`; const html = HtmlService.createHtmlOutput(` <!DOCTYPE html> <html> <body> <p>正在生成PDF,请稍候...</p> <script> window.location.href = "${pdfUrl}"; // 5秒后自动清理临时幻灯片 setTimeout(() => google.script.run.deleteTempSlide("${tempSlideId}"), 5000); </script> </body> </html> `); return html; } // 辅助函数:删除临时幻灯片 function deleteTempSlide(slideId) { try { DriveApp.getFileById(slideId).setTrashed(true); } catch (e) { console.log("临时文件清理失败:" + e.message); } }
步骤3:部署为Web App
- 点击脚本编辑器右上角「部署」→「新部署」。
- 选择部署类型为「Web 应用」。
- 配置权限:
- 执行:选择「我」(以你的权限运行脚本,确保能访问Slides和Sheets)。
- 访问权限:根据需求选择「任何人,甚至匿名」或「仅限指定用户」。
- 点击「部署」,复制生成的固定链接,这就是要分享给用户的链接。
关键细节
- 临时文件机制:每次请求都会复制新的幻灯片模板,不会修改原文件,避免多人操作冲突。
- 数据行调整:若Sheets数据不在第2行,修改代码中
sheet.getRange(2, 1, 1, ...)的行号即可。 - 权限兼容:若选择匿名访问,需确保脚本权限能读取私有Slides/Sheets(通过「部署」时的执行账户权限实现)。
内容的提问来源于stack exchange,提问作者andreas gallefoss
相关产品推荐
相关产品推荐

