Google Apps Script运行无报错但Gmail未收到邮件问题求助
问题根因
你遇到的邮件不发送问题,确实是你标注的判断逻辑及周边调用错误导致的,核心错误有4个:
getDisplayValues()返回值类型错误:该方法返回的是二维数组,对应你选中的Q2:Q整列多行结构,格式为[[Q2单元格值], [Q3单元格值], ...],你直接用数组和"On-going"/空字符串做全等比较,结果永远为false,if块永远不会执行,自然不会触发邮件发送。- 逻辑运算符优先级错误:
&&的优先级高于||,你原有的判断写法实际执行逻辑为「只要Q列值等于On-going就进入判断,否则才校验Q列为空且T列≥80%」,和你预期的「(Q列为On-going 或 空)且 T列≥80%」逻辑完全不符。 - 比较逻辑错误:你代码中写的
>= "80%"是字符串按字符编码比较,不是数值比较,比如"9%"的字符串会被判定为大于"80%",结果完全不符合要求。 - 缺少行遍历逻辑:你当前的判断是针对整列范围,没有逐行校验对应PO的状态和完成度,就算前面的问题修复,也无法对应到具体符合条件的PO行。
修正后完整代码
function sendEmail(){ var ss = SpreadsheetApp.getActiveSpreadsheet(); var spreadsheetURL = ss.getUrl(); var SpreadsheetID = spreadsheetURL.split("/")[5]; var filterViewName = 'PO_Log Precentage'; var filterViewID = filterId(SpreadsheetID, filterViewName); var url = createURL(spreadsheetURL, filterViewID); var poSheet = ss.getSheetByName("Purchase Orders List"); // 一次性取Q到T列所有有效值,减少接口调用次数 var allRows = poSheet.getRange(2, 17, poSheet.getLastRow() -1, 4).getDisplayValues(); var emailDataSheet = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/17G0QohHxjuAcZzwRtQ6AUW3aMTEvLnmTPs_USGcwvDA/edit#gid=1242890521").getSheetByName("TestA"); var emailData = emailDataSheet.getRange("A2:G").getDisplayValues(); var po_numID = poSheet.getRange("A2").getDisplayValue().substr(0,3); var subject = po_numID + " Po Log Daily Notification "; var options = { htmlBody: "Hi All, 以下<a href=\"" +url+ "\">采购订单</a>已消耗超过80%预算" }; // 逐行校验条件 allRows.forEach(row => { let status = row[0]; // 取当前行Q列值 let rateStr = row[3]; // 取当前行T列值,去掉%转为数值 let rate = parseInt(rateStr.replace("%","")) || 0; // 加括号控制逻辑优先级,修正判断条件 if((status === "On-going" || status === "") && rate >= 80){ // 匹配对应收件人 emailData.forEach(dataRow => { if(dataRow[0].substr(0,3) === po_numID){ let email = dataRow[6]; if(email) MailApp.sendEmail(email, subject, '', options); } }) } }) }
验证建议
修改后可以先在判断逻辑前加Logger.log()打印变量实际值,确认取值符合预期后再执行,同时注意检查脚本的Gmail发送权限是否已经授权。
内容的提问来源于stack exchange,提问作者Junior
相关产品推荐
相关产品推荐

