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

sendEmails函数报Range not found错误,请求调试排查指导

问题:SendEmails函数抛出"Exception: Range not found"错误
  • 错误触发位置:rows.forEach(function(row)及var eventEmail = eventsData.getRange(row[5]).getValue();
  • 表格列结构:复选框列、Title、StartDate、EndDate、Description、Email、Contact person
  • 问题背景:函数原本运行正常,修改为仅处理复选框选中的行后出现异常,能识别选中行但第一次循环后报错,调整范围引用后仍未解决

用户提供的原代码:

function SendEmails ()
{
// Extract events data
  var eventsData = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("SHEET_NAME"); 
  var rows = eventsData.getDataRange().getValues();
  var templateText = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("SHEET_NAME_2").getRange(1, 1).getValue();

// Discount header row
  var headers = rows.shift();
 
// Identify only rows that are checked to apply function and run log
  rows.forEach(function(row) 
  {
    if(row[0])
    {
      Logger.log(JSON.stringify(row));

// Extract reminder template and send reminder emails for selection
      var eventEmail = eventsData.getRange(row[5]).getValue();
      var eventTitle = eventsData.getRange(row[1]).getValue();
      var eventPOC = eventsData.getRange(row[6]).getValue();
      var eventDesc = eventsData.getRange(rows[4]).getValue();
      var messageBody = templateText.replace("{name}",eventPOC).replace("{title}",eventTitle).replace("{description}",eventDesc);
      var subjectLine = "Reminder: " + eventTitle + " Upcoming Event";

      MailApp.sendEmail(eventEmail, subjectLine, messageBody);
    }
  });
}
问题原因与修复

核心错误

  1. getRange()参数完全用错:row[5]是Email列的单元格内容(比如xxx@xx.com),但getRange()需要的是行号+列号或者A1格式的单元格地址,用邮箱字符串当参数肯定找不到对应范围,直接报错。
  2. 数组引用错误:rows[4]是整个表格的第5行数据,不是当前循环行里的Description值,应该用row[4]。
  3. 没必要重复调用API:已经通过getDataRange().getValues()把所有数据读到内存数组里了,直接从row数组取对应索引的值就行,反复调用getRange()既低效又容易出错。

修正后的代码

function SendEmails ()
{
  // 获取工作表数据
  var eventsData = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("SHEET_NAME"); 
  var rows = eventsData.getDataRange().getValues();
  var templateText = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("SHEET_NAME_2").getRange(1, 1).getValue();

  // 移除表头行
  rows.shift();
 
  // 遍历仅处理复选框选中的行
  rows.forEach(function(row) 
  {
    if(row[0])
    {
      Logger.log(JSON.stringify(row));

      // 直接从当前行数组中读取对应列的值
      var eventEmail = row[5]; // Email列对应索引5
      var eventTitle = row[1]; // Title列对应索引1
      var eventPOC = row[6]; // Contact person列对应索引6
      var eventDesc = row[4]; // Description列对应索引4
      
      var messageBody = templateText.replace("{name}",eventPOC).replace("{title}",eventTitle).replace("{description}",eventDesc);
      var subjectLine = "Reminder: " + eventTitle + " Upcoming Event";

      MailApp.sendEmail(eventEmail, subjectLine, messageBody);
    }
  });
}

额外优化建议

  • 加个错误捕获,避免某一行出错导致整个函数停掉:
    rows.forEach(function(row) 
    {
      if(row[0])
      {
        try {
          Logger.log(JSON.stringify(row));
          var eventEmail = row[5];
          var eventTitle = row[1];
          var eventPOC = row[6];
          var eventDesc = row[4];
          
          var messageBody = templateText.replace("{name}",eventPOC).replace("{title}",eventTitle).replace("{description}",eventDesc);
          var subjectLine = "Reminder: " + eventTitle + " Upcoming Event";
    
          MailApp.sendEmail(eventEmail, subjectLine, messageBody);
        } catch(e) {
          Logger.log("处理行失败: " + JSON.stringify(row) + ",错误信息: " + e.message);
        }
      }
    });
    
  • 确认SHEET_NAME和SHEET_NAME_2是实际的工作表名称,别拼写错了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 23:53:13