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

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]会抛出数组越界错误,中断函数执行,无法完成时间更新

核心修改点

  1. 将日期校验的return改为continue,仅跳过当前不符合要求的邮件
// 原代码:if (Etime.getDate() != dd) {return}
// 修改后:
if (Etime.getDate() != dd) {continue}
  1. 增加搜索结果非空判断,避免空数组报错
// 原末尾更新时间代码替换为如下内容
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 23:27:02