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); } }); }
问题原因与修复
核心错误
getRange()参数完全用错:row[5]是Email列的单元格内容(比如xxx@xx.com),但getRange()需要的是行号+列号或者A1格式的单元格地址,用邮箱字符串当参数肯定找不到对应范围,直接报错。- 数组引用错误:
rows[4]是整个表格的第5行数据,不是当前循环行里的Description值,应该用row[4]。 - 没必要重复调用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
相关产品推荐
相关产品推荐

