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

Google Script数组求值为null求助:迟到邮件通知函数故障

学生迟到邮件通知函数故障排查求助

我改编了一个之前可用的函数,用于发送学生迟到次数的邮件通知,但当前无法正常运行。问题出在gradeNameList变量的处理环节:使用for循环和if语句进行匹配扫描时,数组求值为null。执行函数时,期望向"1666@usa.org"发送邮件并抄送g@hotmail.com,以下是相关代码,恳请提供解决思路:

function likeMessage() {
  
  var mainSheet = SpreadsheetApp.openById('1giEC08YlkXhwIibHt30BdDJmuwwlq9ZzfQdhkQETogo'); 
  var tardyTrackerSheet = mainSheet.getSheetByName('new_tardy_tracker_form_responses'); 
  var tardyTrackerLastRow = tardyTrackerSheet.getLastRow(); 
    
  var teacher = tardyTrackerSheet.getRange(tardyTrackerLastRow, 2).getValue();  
  var tardyBlock = tardyTrackerSheet.getRange(tardyTrackerLastRow, 7).getValue();
  var grade = tardyTrackerSheet.getRange(tardyTrackerLastRow, 3).getValue();
      
  var gradeColumn; //declared a variable, so we can tweak it next...
  
  var adminTeam = ""; 

  if (grade == "sixth") { 
    gradeColumn = 3;
    adminTeam = "g@hotmail.com";
  } else if (grade == "seventh") {
    gradeColumn = 4;
    adminTeam = "do@lcps.org";
  } else if (grade == "eighth") {
    gradeColumn = 5;
    adminTeam = "j@lcps.org";
  }

  var studentName = tardyTrackerSheet.getRange(tardyTrackerLastRow, gradeColumn).getValue();
  
  var gradeSheet = mainSheet.getSheetByName(grade); 

  var gradeSheetLastRow = gradeSheet.getLastRow();  
  var gradeNameList = gradeSheet.getRange(2, 1, (gradeSheetLastRow - 1)).getValues();
  var studentRow = 0; //declaring, to use below
  var flag = true;
  
  var i;
  for (i = 0; i < gradeSheetLastRow; i++) { 
    if (gradeNameList[i] == studentName) {
      studentRow = i + 2;
      }
    else {
      flag = false;  
    }
  }
    

  var emailMessage = "";
  var studentId = "";
  var studentEmail = "";
  var currentTotalTardies = "";
  var parentEmails = "";

  if (flag){
    studentId = gradeSheet.getRange(studentRow, 2).getValues();  
    studentEmail = studentId +"@lcps.org";  
    currentTotalTardies = gradeSheet.getRange(studentRow, 19).getValues(); 
    parentEmails = gradeSheet.getRange(studentRow, 20).getValues(); 
      
    emailMessage = "Dear sir, etc.";  

      MailApp.sendEmail({
      to: studentEmail,
      cc: adminTeam,
      subject: receivedLikeSubject,
      htmlBody: receivedLikeMessage
      });
  }     
}

问题分析与修复方案

1. 数组匹配逻辑错误

getValues()返回的是二维数组,gradeNameList[i]实际是一个包含单个元素的数组(如["张三"]),直接与字符串studentName比较永远不相等。需修改为:

if (gradeNameList[i][0] == studentName)

2. 循环中flag的错误赋值逻辑

当前循环只要有一次不匹配就将flag设为false,哪怕之前已找到匹配项。应调整为找到匹配后立即跳出循环,并仅在循环结束后确认未找到时才标记flag为false:

var flag = false; // 初始标记为未找到
for (i = 0; i < gradeNameList.length; i++) { 
  if (gradeNameList[i][0] == studentName) {
    studentRow = i + 2;
    flag = true;
    break; // 找到匹配后终止循环
  }
}

3. 单个单元格取值方法误用

单个单元格应使用getValue()而非getValues()(后者返回数组),否则会导致后续拼接邮箱等操作出现格式错误:

studentId = gradeSheet.getRange(studentRow, 2).getValue();  
currentTotalTardies = gradeSheet.getRange(studentRow, 19).getValue(); 
parentEmails = gradeSheet.getRange(studentRow, 20).getValue(); 

4. 未定义的邮件变量

代码中使用的receivedLikeSubject和receivedLikeMessage未定义,需补充实际内容:

var receivedLikeSubject = `迟到通知:${studentName}累计迟到${currentTotalTardies}次`;
var receivedLikeMessage = `您好,学生${studentName}目前累计迟到${currentTotalTardies}次,请关注。`;

5. 边界情况校验

增加工作表存在性判断,避免因工作表名错误导致的空值异常:

if (!gradeSheet) {
  console.error(`未找到名为${grade}的工作表`);
  return;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 12:33:31