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

Google Sheets邮件脚本添加校验后仅发首行邮件的修复咨询

解决Google Apps Script仅发送第一行符合条件邮件的问题

嘿,我一眼就揪出你代码里的问题啦!你遇到的“只给第一行符合条件的用户发邮件”的核心原因,是在dpt == r(RIM部门)的分支里写了return(i);——这个语句会直接终止整个函数的执行!也就是说,只要循环到第一个属于RIM部门且标记为TRUE的行,函数就会立刻停掉,后面的行根本没机会被处理。

另外,你的代码还有个效率问题:每次循环都单独调用getRange()获取单元格值,这会让脚本运行得很慢,尤其是数据量变大的时候,最好一次性把所有需要的数据读入内存再处理。

修改后的完整代码

function testing() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const targetSheet = ss.getSheetByName("Form Responses 4");
  const lastRow = targetSheet.getLastRow();
  // 一次性读取第2行到最后一行的第2-36列数据(对应你需要的所有字段)
  const allData = targetSheet.getRange(2, 2, lastRow - 1, 35).getValues();
  
  // 用对象存部门常量,代码更整洁
  const departments = {
    HR: "HR",
    DMS: "DMS",
    RIM: "RIM"
  };

  // 遍历每一行数据(注意数组索引从0开始)
  allData.forEach(row => {
    // 从数组中提取对应字段,索引对应原表列:原表第2列=索引0,第36列=索引33
    const currentEmail = row[0];
    const currentName = row[1];
    const userDept = row[2]; // 原表第4列
    const requestPurpose = row[3]; // 原表第5列
    const isApproved = row[33]; // 原表第36列(TRUE/FALSE)
    const approvalRemark = row[32]; // 原表第35列
    // 这里补充你需要的其他字段,比如qty1、ap1等,按索引对应即可
    const qty1 = row[5]; // 原表第7列
    const ap1 = row[6]; // 原表第8列
    const S1 = row[4]; // 原表第6列

    // 先判断是否审批通过,没通过直接跳过当前行
    if (isApproved !== true) return;

    let emailTemplate = "";
    // 根据部门选择对应的模板
    if (userDept === departments.HR) {
      emailTemplate = /* 你的HR部门HTML模板内容 */;
    } else if (userDept === departments.DMS) {
      emailTemplate = /* 你的DMS部门HTML模板内容 */;
    } else if (userDept === departments.RIM) {
      emailTemplate = /* 你的RIM部门HTML模板内容 */;
      // 这里移除了原来的return语句!
    }

    // 如果有模板,就替换变量并发送邮件
    if (emailTemplate) {
      const emailContent = emailTemplate.replace("name", currentName)
                                        .replace("purpose", requestPurpose)
                                        // 继续补充你需要的所有replace逻辑
                                        .replace("remark", approvalRemark);
      
      MailApp.sendEmail({
        to: currentEmail,
        subject: "UPDATES: KIT EXCHANGE REQUISITION FORM",
        htmlBody: emailContent
      });
    }
  });
}

关键修改点说明

  1. 移除了return(i);语句:这是解决问题的核心,现在循环会完整遍历所有符合条件的行,不会中途终止。
  2. 批量读取数据:用getRange().getValues()一次性获取所有需要的行和列,避免多次调用getRange(),大幅提升脚本运行效率。
  3. 优化判断顺序:先检查是否标记为TRUE,不符合直接跳过,减少不必要的逻辑处理。
  4. 代码结构优化:用对象存储部门常量,用forEach遍历数组,让代码更简洁易读。
  5. 统一邮件发送逻辑:把邮件发送的代码抽出来,避免重复编写冗余代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:22:15