Google 对话长度较长时循环电子邮件中的应用程序脚本问题

Google App Script problem in Loop emails when conversation length are long

参考上一题

我在下面创建了一个 google 应用脚本并设置了每 5 分钟触发一次:

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 sheet = ss.getActiveSheet();
  var MasterSheet = ss.getSheetByName("Master");
  var index = 2;
  var aa = 0; // count already update entries
  var na = 0; // count not update entries
  var lasttime = MasterSheet.getRange("Z1").getValue(); // in spreadsheet i record the last time of email scanned, so next trigger will search after that
  Logger.log(lasttime);
  var cdate = new Date();
  var ctime = cdate.getTime();
  var qDate = MasterSheet.getRange("Z1").getValue();
  Logger.log("QDATE IS " + qDate);
  
  //problem # 1: from filter is not working.
  // SEARCH EMAIL
  var query = 'from: email id, subject: email subject, after:' + Math.floor((qDate.getTime()) /1000);
  var threadsNew = Gmail.search(query);
  Logger.log(threadsNew.length);


  //loop all emails
  for(var n in threadsNew){
    var thdNew  = threadsNew[n]; 
    var msgsNew = thdNew.getMessages(); 
    var msgNew = msgsNew[msgsNew.length-1];
  // GET ATTACHMENT
    //var bodyNew = msgNew.getBody();
    var plainbody  = msgNew.getPlainBody();
    var subject = msgNew.getSubject();
    var Etime = msgNew.getDate();
    //var attachments = msgNew.getAttachments();
    //var attachment = attachments[0];
    
    Logger.log(Etime);
    Logger.log(subject);
    //Logger.log(plainbody);
    var tdata = plainbody.trim();
    var data = parseEmail001(tdata);
    //Logger.log(data);

    // First Check Email Date
  var newdate = new Date();
  var dd = newdate.getDate();
  var mm = newdate.getMonth() + 1;
  var yyyy  = newdate.getFullYear();
  var cd = dd + "-" + mm + "-" + yyyy
  //Logger.log(new Date());
  //Logger.log(cd);
  if (Etime.getDate() != dd) {return}

  // first check current sheet exist or not 
  // DATE DECLARATION IS  ABOVE
  var itt = ss.getSheetByName(cd); 
  if (!itt) {

    ss.insertSheet(cd);
    var itt = ss.getSheetByName(cd); 
    var ms = ss.getSheetByName("Master");
    var hlc = ms.getLastColumn();
    var headings = ms.getRange(1,1,1,hlc).getValues();
    itt.getRange(1,1,1,hlc).setValues(headings);
  }

  var MasterSheet = ss.getSheetByName(cd);
  var mlr = MasterSheet.getLastRow();
  var mlc = MasterSheet.getLastColumn();


  //check data already updated or not
  var NewDepositSlipNumber = Number(data[2]).toFixed(0);
  //Logger.log(Number(data[2]).toFixed(0));
  
  var olddata = MasterSheet.getDataRange().getValues();
  //Logger.log(olddata[1][2]);
  for(var i = 0; i<olddata.length;i++){
    if(olddata[i][2] == NewDepositSlipNumber){
        //Logger.log(i + 1);
        var status = 'Already Update'
        Logger.log(status);
        break;
    }
    else{
      var status = 'Not Update'
      //Logger.log(status);
    }
 }

 // count how many updated and how many not.
 if(status == 'Not Update'){
   na = na + 1;
 } 
 else{
   aa = aa + 1;
 }

 if(status == 'Not Update'){
  MasterSheet.appendRow(data);
  Logger.log("Data Updated");
 }
  }
  
  //problem # 2:  if conversation length are long, it is not reaching there
    var lastscantime = threadsNew[0].getLastMessageDate();
    var master = ss.getSheetByName("Master");
    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());

}

这个脚本工作正常,但我有两个问题:

  1. 我在查询 1) from 2) subject 3) after 中放置了三个过滤器 但有时它会给我来自相同 ID 但主题不同的电子邮件。

  2. 根据我的观察,如果对话长度很长,我会使用调试模式验证它,我猜超过 30 它不会到达脚本的结尾部分。它跳过了我的最后一步,因为我也在上面的脚本中标记了它。如果对话长度较短,则可以顺利进行。

解释:换句话说,从早上到晚上每五分钟就可以正常工作,但是第二天就出现问题,然后我手动更新我的spreadsheet master sheet Z1截至今天日期和时间的值,然后它可以正常工作到今晚。

您可能会达到 script limitation。可能自定义函数 runtime.But 它可以是任何一个,如果它没有完成,你应该会看到一个错误。