You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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();
}

二、关键修改点说明

  1. 条件判断更新

    • O列对应数组索引14(列从0开始计数),通过row[14]?.trim().toLowerCase() === "x"实现:兼容大小写输入(如X)、忽略首尾空格的校验逻辑
    • 保留原有「第3列(索引2)为空」的判断,确保已生成过幻灯片的行不会重复处理
  2. 超时问题处理

    • 加入执行时间监控,设置最大执行时间为4分钟(预留缓冲避免触发平台6分钟强制停止规则)
    • 超时前弹出提示,下次运行时会自动跳过已处理的行(因为已生成的幻灯片链接已写入第3列)

三、批量处理优化建议

如果需要自动完成所有符合条件行的处理,可设置时间驱动触发器:

  • 打开脚本编辑器 → 点击左侧「触发器」图标 → 添加触发器
  • 选择mailMergeSlidesFromSheets函数,触发事件选「时间驱动」,设置为每10分钟执行一次,直到所有符合条件的行处理完成

内容的提问来源于stack exchange,提问作者Pavlos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 20:50:24