如何用Google Apps Script实现Google Sheet更新时同步而非新增Google Slides
解决Google Slides模板生成幻灯片冗余问题的脚本修改方案
核心思路:保留第一张模板幻灯片,更新现有非模板幻灯片的数据,仅新增缺少的幻灯片,而非每次都复制所有行生成新幻灯片,以此实现非模板幻灯片数量与Sheet数据行数完全对应。
修改后的完整脚本:
function fillTemplateV3() { // 幻灯片模板ID var PRESENTATION_ID = "PRESENTATION ID HERE"; // 打开演示文稿和表格 var presentation = SlidesApp.openById(PRESENTATION_ID); var values = SpreadsheetApp.getActive().getDataRange().getValues(); // 分离表头和数据行 let hdr = values.shift(); let dataRows = values; // 获取现有幻灯片:第一张是模板,剩下的是已生成的数据幻灯片 let slides = presentation.getSlides(); let templateSlide = slides[0]; let existingDataSlides = slides.slice(1); // 从第二张开始是数据幻灯片 // 遍历所有数据行,更新或新增幻灯片 dataRows.forEach((row, index) => { let targetSlide; // 判断当前索引对应的幻灯片是否已存在 if (index < existingDataSlides.length) { targetSlide = existingDataSlides[index]; // 先清除原有内容的变量标记(避免旧数据残留) hdr.forEach(field => { targetSlide.replaceAllText(field, ""); }); targetSlide.getShapes().forEach(s => { if (s.getText().asString().trim() === "") { // 如果是之前替换过logo的形状,先删除(避免重复叠加) if (s.getImage()) s.remove(); } }); } else { // 不存在则复制模板幻灯片 targetSlide = templateSlide.duplicate(); } // 填充文本变量 for (var i = 0; i < 4; i++) { let templateField = hdr[i]; let templateValue = row[i]; targetSlide.replaceAllText(templateField, templateValue); } // 替换logo图片 let logoUrl = row[4]; targetSlide.getShapes().forEach(s => { if (s.getText().asString().trim() === "{{logo}}") { s.replaceWithImage(logoUrl); } else if (s.getImage()) { // 如果是已存在的logo图片,更新为新的URL s.getImage().replace(logoUrl); } }); }); // (可选)如果Sheet数据行数减少,删除多余的幻灯片 // 如果需要严格保持数量一致,取消下面的注释 /* if (existingDataSlides.length > dataRows.length) { let slidesToDelete = existingDataSlides.slice(dataRows.length); slidesToDelete.forEach(slide => slide.remove()); } */ }
关键逻辑说明:
- 分离模板与数据幻灯片:始终保留第一张幻灯片为模板,后续所有幻灯片视为数据幻灯片。
- 更新优先:对于已存在的数据幻灯片,先清空原有变量内容,再填充新数据(避免旧数据残留)。
- 按需新增:仅当数据行数量超过现有数据幻灯片数量时,才复制模板生成新幻灯片。
- logo处理优化:支持更新已存在的logo图片,而非重复替换形状。
- 可选的冗余删除:如果需要严格保持非模板幻灯片数量与数据行数一致(比如数据行数减少时删除多余幻灯片),可以取消最后一段代码的注释。
内容的提问来源于stack exchange,提问作者HP-Nunes
相关产品推荐
相关产品推荐

