如何基于Google Sheets O列条件修改Apps Script实现Slides邮件合并
解决方案:按指定条件触发Slides邮件合并并解决超时问题
一、核心修改:仅当O列含"x"时生成幻灯片
修改mailMergeSlidesFromSheets函数的条件判断逻辑,同时保留「未生成过幻灯片(第3列为空)」的原有规则,避免重复生成。
修改后的完整脚本
function mailMergeSlidesFromSheets() { // 加载表格数据 var dataRange = SpreadsheetApp.getActive().getDataRange(); var sheetContents = dataRange.getValues(); // 保存表头 var header = sheetContents.shift(); // 用于存储要写回表格的更新数据 var updatedContents = []; updatedContents.push(header); // 记录开始时间,避免触发6分钟执行限制 const startTime = new Date().getTime(); const MAX_EXECUTION_TIME = 250000; // 设为4分钟左右,留缓冲空间 // 遍历每一行数据 sheetContents.forEach(function(row) { // 检查是否即将超时,提前终止 if (new Date().getTime() - startTime > MAX_EXECUTION_TIME) { SpreadsheetApp.getUi().alert("执行即将超时,已暂停,下次运行将继续处理剩余行"); return; } // 条件判断:第3列为空(未生成幻灯片)且O列含"x"(兼容大小写、首尾空格) const oColumnValue = row[14]?.trim().toLowerCase() || ""; if(row[2] === "" && oColumnValue === "x") { // 生成幻灯片 var slides = createSlidesFromRow(row); var slidesId = slides.getId(); // 拼接幻灯片链接 var slidesUrl = `https://docs.google.com/presentation/d/${slidesId}/edit`; // 更新当前行的幻灯片链接 row[2] = slidesUrl; updatedContents.push(row); } else { // 未满足条件的行直接保留原有数据 updatedContents.push(row); } }); // 将更新后的数据写回表格 dataRange.setValues(updatedContents); } function createSlidesFromRow(row) { // 复制幻灯片模板 var deck = createCopyOfSlidesTemplate(); // 重命名幻灯片 deck.setName(row[0] + " " + row[5] + row[4] + row[10]); // 替换模板变量 deck.replaceAllText("{{id}}", row[0]); deck.replaceAllText("{{tag}}", row[4]); deck.replaceAllText("{{besetzung}}", row[5]); deck.replaceAllText("{{beginn}}", row[6]); deck.replaceAllText("{{ende}}", row[7]); deck.replaceAllText("{{halle}}", row[8]); deck.replaceAllText("{{stand}}", row[9]); deck.replaceAllText("{{firma}}", row[2]); deck.replaceAllText("{{veranstaltung}}", row[10]); // 替换QR码图片 deck.getSlides()[0].getShapes().find(s => s.getText().asString().trim().toUpperCase() == "{{IMAGE}}").replaceWithImage(`https://chart.googleapis.com/chart?chs=300x300&cht=qr&chl=${row[13]}`); return deck; } function createCopyOfSlidesTemplate() { var TEMPLATE_ID = "1bcIS7K-CH9KH0IixCKehFniCgAReZEH3m84pd5UxhFg"; // 复制模板文件 var copy = DriveApp.getFileById(TEMPLATE_ID).makeCopy(); // 打开复制后的幻灯片 var slides = SlidesApp.openById(copy.getId()); return slides; } function onOpen() { // 创建自定义菜单 SpreadsheetApp.getUi().createMenu("⚙️ Create BWN by Pavlos") .addItem("Create Slides","mailMergeSlidesFromSheets") .addToUi(); }
二、关键修改点说明
条件判断更新
- O列对应数组索引
14(列从0开始计数),通过row[14]?.trim().toLowerCase() === "x"实现:兼容大小写输入(如X)、忽略首尾空格的校验逻辑 - 保留原有「第3列(索引2)为空」的判断,确保已生成过幻灯片的行不会重复处理
- O列对应数组索引
超时问题处理
- 加入执行时间监控,设置最大执行时间为4分钟(预留缓冲避免触发平台6分钟强制停止规则)
- 超时前弹出提示,下次运行时会自动跳过已处理的行(因为已生成的幻灯片链接已写入第3列)
三、批量处理优化建议
如果需要自动完成所有符合条件行的处理,可设置时间驱动触发器:
- 打开脚本编辑器 → 点击左侧「触发器」图标 → 添加触发器
- 选择
mailMergeSlidesFromSheets函数,触发事件选「时间驱动」,设置为每10分钟执行一次,直到所有符合条件的行处理完成
内容的提问来源于stack exchange,提问作者Pavlos
相关产品推荐
相关产品推荐

