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

Google Apps Script触发配置需求:新增行后30秒触发及邮件发送脚本触发设置

解决方案:配置Google Apps Script触发机制满足你的邮件脚本需求

嘿,针对你提出的三个触发需求,结合现有的sendEmail()脚本,我整理了具体的实现方案,一步步来:


1. 仅当目标工作表新增行时触发脚本(带30秒延迟)

因为你的目标表是通过query函数同步数据的,直接用onChange触发可能无法识别公式生成的新增行(这类变更不会触发“添加行”的事件),所以更可靠的方式是时间驱动触发+对比历史行数:

步骤1:新增检查行数的辅助函数

在你的脚本编辑器里添加这个函数,用来对比当前行数和上次存储的行数,判断是否有新行:

function checkNewRows() {
  // 替换成你的目标工作表名称
  const targetSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("目标表名称");
  const scriptProps = PropertiesService.getScriptProperties();
  
  // 读取上次存储的行数,初始值设为1(表头行)
  const lastRowCount = parseInt(scriptProps.getProperty('LAST_ROW_COUNT')) || 1;
  const currentRowCount = targetSheet.getLastRow();

  // 如果当前行数大于上次的,说明有新行
  if (currentRowCount > lastRowCount) {
    // 延迟30秒执行邮件脚本
    Utilities.sleep(30000);
    sendEmail();
    // 更新存储的行数,避免重复触发
    scriptProps.setProperty('LAST_ROW_COUNT', currentRowCount.toString());
  }
}

步骤2:设置时间驱动触发器

  1. 在脚本编辑器左侧点击闹钟图标(触发器)
  2. 点击添加触发器,配置如下:
    • 选择函数:checkNewRows
    • 事件源:时间驱动
    • 类型:分钟计时器
    • 间隔:每1分钟(可以根据你的数据同步频率调整,比如5分钟一次)

2. 在数据来源工作表添加按钮触发

如果你想手动触发脚本,可以在来源表加一个可点击的按钮:

步骤1:创建按钮

  1. 打开数据来源电子表格,点击顶部菜单插入 > 绘图
  2. 选择一个矩形形状,调整样式后,添加文字(比如“发送新案件邮件”),保存并关闭绘图编辑器
  3. 把绘图拖动到合适的位置

步骤2:绑定脚本

  1. 右键点击刚才创建的绘图,选择分配脚本
  2. 输入triggerEmailWithDelay(如果需要延迟30秒)或者直接sendEmail(即时触发)

可选:带延迟的按钮触发函数

如果需要点击按钮后延迟30秒发送,添加这个函数:

function triggerEmailWithDelay() {
  Utilities.sleep(30000);
  sendEmail();
}

3. 关于延迟30秒触发的补充

上面两个方案里都用到了Utilities.sleep(30000),这里有个小注意点:

  • 时间驱动触发时,sleep会在后台静默执行,不会有任何提示
  • 按钮触发时,屏幕会显示“正在执行脚本”的弹窗,直到延迟结束,这是正常现象

对原sendEmail脚本的小优化建议

为了避免发送空邮件(当没有未标记的行时),可以在循环结束后加个判断,同时优化循环写法:

function sendEmail() { 
  //setup function 
  var ActiveSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); 
  var StartRow = 2; 
  var RowRange = ActiveSheet.getLastRow() - StartRow + 1; 
  var WholeRange = ActiveSheet.getRange(StartRow,1,RowRange,16); 
  var AllValues = WholeRange.getValues(); 
  var message = ""; 
  //iterate loop 
  // 用for循环替代for...in,避免遍历到数组原型属性
  for (let i = 0; i < AllValues.length; i++) { 
    var CurrentRow = AllValues[i]; 
    var EmailSent = CurrentRow[14]; 
    //if row has been sent, then continue to next iteration 
    if (EmailSent == "sent") continue; 
    //set HTML template for information 
    message += "<p><b>Bank: </b>" + CurrentRow[0] + "</p>" + "<p><b>Branch: </b>" + CurrentRow[1] + "</p>" + "<p><b>Region: </b>" + CurrentRow[2] + "</p>" + "<p><b>Lan Number: </b>" + CurrentRow[3] + "</p>" + "<p><b>Customer Name: </b>" + CurrentRow[4] + "</p>" + "<p><b>Loan Type: </b>" + CurrentRow[5] + "</p>" + "<p><b>Case Worker: </b>" + CurrentRow[11] + "</p>" + "<p><b>Documents Recieved: </b>" + CurrentRow[6] + "</p>" + "<p><b>Initiated Date: </b>" + CurrentRow[7] + "</p>" + "<p><b>Site Visit Status: </b>" + CurrentRow[8] + "</p>" + "<p><b>Site Visit Date: </b>" + CurrentRow[9] + "</p>" + "<p><b>Site Visit Done by: </b>" + CurrentRow[10] + "</p><br><br>"; 
    //set the row to look at 
    var setRow = parseInt(i) + StartRow; 
    //mark row as "sent" 
    ActiveSheet.getRange(setRow, 15).setValue("sent"); 
  } 

  // 新增:如果没有新内容,不发送邮件
  if (message === "") {
    return;
  }

  //define who to send grants to 
  var SendTo = "$$$$$@gmail.com" + "," + "&&&&&&@gmail.com" + "," + "@@@@@@@gmail.com"+ "," + "######@gmail.com "; 
  //set subject line 
  var Subject = "New case initiated to Veena"; 
  //send the actual email 
  MailApp.sendEmail({ 
    to: SendTo, 
    cc: "#######@gmail.com", 
    subject: Subject, 
    htmlBody: message, 
  }); 
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 21:32:49