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

Google App Script日期过滤排班表未触发邮件问题求助

问题分析与修复

你的脚本没发邮件的核心原因是过滤逻辑完全错误,导致没有匹配到任何行(due数组为空),自然不会执行邮件发送的循环。以下是具体问题和修复方案:

主要问题点

  • 在filter回调里,你每次都获取整个I列的Range对象(schedule.getRange("I2:I")),然后直接和字符串格式的currentDate比较——Range对象和字符串永远不可能相等,所以过滤结果为空。
  • 重复调用getRange("A:J").getValues(),造成不必要的性能浪费。
  • 设置日期格式的代码放在了filter循环里,会重复执行多次,效率极低且毫无必要。
  • 硬编码邮箱地址,没有从表格中读取对应员工的邮箱。

修复后的代码

var ss = SpreadsheetApp.getActiveSpreadsheet();
var schedule = ss.getSheetByName("Duties & Timelines");

function sendReminderEmail() {
  // 获取表格时区,格式化当前日期为字符串
  const timeZone = ss.getSpreadsheetTimeZone();
  const currentDate = Utilities.formatDate(new Date(), timeZone, "yyyy-MM-dd");

  // 统一设置I列的日期格式(只需执行一次)
  schedule.getRange("I:I").setNumberFormat('yyyy-MM-dd');

  // 获取所有数据,跳过表头(假设第一行是表头)
  const data = schedule.getRange(2, 1, schedule.getLastRow() - 1, 10).getValues();

  // 过滤出I列日期等于当前日期的行
  const dueRows = data.filter(row => {
    // 格式化行中I列(索引8,因为数组从0开始)的日期为字符串
    const rowDate = Utilities.formatDate(row[8], timeZone, "yyyy-MM-dd");
    return rowDate === currentDate;
  });

  // 遍历匹配行发送邮件
  dueRows.forEach(row => {
    // 假设表格中某列是员工邮箱(比如J列,索引9,根据实际调整)
    const recipientEmail = row[9];
    // 可以从表格中获取更多信息自定义邮件内容,比如A列的值班任务
    const duty = row[0];
    
    const subject = `值班提醒:${duty}`;
    const body = `您好,今天您的值班任务是:${duty},请留意。`;

    MailApp.sendEmail({
      to: recipientEmail,
      subject: subject,
      body: body
    });
  });
}

额外说明

  • 请根据你的表格结构调整邮箱列的索引(示例中用了J列,索引9),以及任务名称的列位置。
  • 使用getLastRow()获取实际数据行,避免处理空行,提升性能。
  • 日期比较时,确保两边都是相同格式的字符串,或者直接比较Date对象(需注意时区问题)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 12:03:13