Google Apps Script处理Gmail邮件过滤器失效及长会话漏执行问题
Google Apps Script 问题修复方案
问题1:Gmail搜索条件不生效,返回主题不匹配的邮件
原因
你编写的搜索query使用逗号分隔多个过滤条件,不符合Gmail官方搜索语法要求:Gmail多条件需要用空格分隔,包含空格的搜索值需要用双引号包裹,否则会被识别为独立搜索词,导致过滤逻辑失效。
修复代码
将原搜索query定义行替换为如下格式,替换其中的发件人邮箱、主题关键词为你实际的过滤值:
// 注意:主题内容如果包含空格,必须用英文双引号包裹 var query = 'from:实际发件人邮箱地址 subject:"实际主题过滤关键词" after:' + Math.floor((qDate.getTime()) /1000);
问题2:长会话场景下不更新最后扫描时间
原因
存在两处逻辑错误:
- 遍历邮件时,遇到非当日的邮件直接调用
return终止了整个函数,末尾更新扫描时间的代码完全不会被执行,长会话中存在跨天邮件时必然触发该问题 - 当搜索结果
threadsNew为空数组时,直接取threadsNew[0]会抛出数组越界错误,中断函数执行,无法完成时间更新
核心修改点
- 将日期校验的
return改为continue,仅跳过当前不符合要求的邮件
// 原代码:if (Etime.getDate() != dd) {return} // 修改后: if (Etime.getDate() != dd) {continue}
- 增加搜索结果非空判断,避免空数组报错
// 原末尾更新时间代码替换为如下内容 var master = ss.getSheetByName("Master"); if(threadsNew.length > 0){ var lastscantime = threadsNew[0].getLastMessageDate(); master.getRange("Z1").setValue(lastscantime); Logger.log(lastscantime); } master.getRange("Z2").setValue(new Date()); Logger.log(new Date()); Logger.log("Total " + threadsNew.length + " found, out of which " + aa + " are already updated, while " + na + " are updated.");
修正后完整代码
function GetEmailsData(){ // SKIP TO OUT OF OFFICE HOURS AND DAYS var nowH=new Date().getHours(); var nowD=new Date().getDay(); if (nowH>19||nowH<8||nowD==0) { return } // START OPERATION var Gmail = GmailApp; var ss = SpreadsheetApp.getActiveSpreadsheet(); var MasterSheet = ss.getSheetByName("Master"); var aa = 0; // count already update entries var na = 0; // count not update entries var qDate = MasterSheet.getRange("Z1").getValue(); Logger.log("QDATE IS " + qDate); // 修复后的搜索query,替换为实际过滤值即可 var query = 'from:你的实际发件人邮箱 subject:"你的实际主题关键词" after:' + Math.floor((qDate.getTime()) /1000); var threadsNew = Gmail.search(query); Logger.log(threadsNew.length); // 提前获取当天日期、初始化当日工作表,避免循环内重复判断 var newdate = new Date(); var dd = newdate.getDate(); var mm = newdate.getMonth() + 1; var yyyy = newdate.getFullYear(); var cd = dd + "-" + mm + "-" + yyyy var dailySheet = ss.getSheetByName(cd); if (!dailySheet) { ss.insertSheet(cd); dailySheet = ss.getSheetByName(cd); var ms = ss.getSheetByName("Master"); var hlc = ms.getLastColumn(); var headings = ms.getRange(1,1,1,hlc).getValues(); dailySheet.getRange(1,1,1,hlc).setValues(headings); } //遍历所有符合条件的邮件 for(var n in threadsNew){ var thdNew = threadsNew[n]; var msgsNew = thdNew.getMessages(); var msgNew = msgsNew[msgsNew.length-1]; var plainbody = msgNew.getPlainBody(); var Etime = msgNew.getDate(); Logger.log(Etime); Logger.log(msgNew.getSubject()); var tdata = plainbody.trim(); var data = parseEmail001(tdata); // 修复1:非当天邮件仅跳过,不终止整个函数 if (Etime.getDate() != dd) {continue} //校验数据是否已入库 var NewDepositSlipNumber = Number(data[2]).toFixed(0); var olddata = dailySheet.getDataRange().getValues(); var status = 'Not Update' for(var i = 0; i<olddata.length;i++){ if(olddata[i][2] == NewDepositSlipNumber){ status = 'Already Update' Logger.log(status); break; } } if(status == 'Not Update'){ na = na + 1; dailySheet.appendRow(data); Logger.log("Data Updated"); } else{ aa = aa + 1; } } // 修复2:增加非空判断,避免空数组报错 var master = ss.getSheetByName("Master"); if(threadsNew.length > 0){ var lastscantime = threadsNew[0].getLastMessageDate(); master.getRange("Z1").setValue(lastscantime); Logger.log(lastscantime); } master.getRange("Z2").setValue(new Date()); Logger.log(new Date()); Logger.log("Total " + threadsNew.length + " found, out of which " + aa + " are already updated, while " + na + " are updated."); } function parseEmail001(message) { var replaces = [ 'Branch Code', 'Branch Name', 'Slip No', 'BL Number', 'Type Of Payment', 'Customer Name', 'Payer Bank', 'Payer Bank Branch', 'Transaction Type', 'Amount', 'Posting Date', 'Value Date' ]; return message.split('\n').slice(0, replaces.length) .map((c,i) => c.replace(replaces[i], '').trim()); }
内容的提问来源于stack exchange,提问作者Mehdi Abbas
相关产品推荐
相关产品推荐

