基于多标准的电子邮件警报触发器

时间:2019-01-12 19:03:39

标签: javascript google-apps-script

这是我的数据 enter image description here

现在,我想在满足两个条件时向自己发送电子邮件:

  1. “日期”列D是昨天的日期。
    AND
  2. “值”列F(其中D列为昨天)大于0.5。

基于此条件,脚本应在20190110触发,因为F中的值为0.7。但是,该脚本不会触发,因为执行时间过长。既然要遍历那么多行,这可能与循环相关吗?

这是我到目前为止所拥有的。我将不胜感激如何真正触发电子邮件。谢谢!

function readCell() {

    var sheet = SpreadsheetApp.getActive().getSheetByName('test');
    var dates = sheet.getRange('D1:D').getValues(); //date column

    var date = null;
    var dateRow = 0;
    var dateCount = dates.length;

    var yesterday = new Date();
    yesterday.setDate(yesterday.getDate() - 1);
    var yesterdayString = yesterday.toDateString();

    for (dateRow; dateRow < dateCount; ++dateCount) {

        date = dates[dateRow];

        if (date instanceof Date) {
            date = date.toDateString();

            if (date === yesterdayString) {
                ++dateRow;
                // To account for zero-based array
                break;
            }
        }
    }

    var value = sheet.getRange('F' + dateRow).getValue();

    if (value >= 0.5) {
      var result = 'Result found on: ' + date;
      MailApp.sendEmail('test@gmail.com', 'Alert', result);
    }
};

这是Stackdriver错误报告
enter image description here

1 个答案:

答案 0 :(得分:0)

您可能想尝试以下方法:

function readCell() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('test');
  var rg=sh.getDataRange()
  var vA=rg.getValues();
  var yesterday=new Date(new Date().getFullYear(),new Date().getMonth(),new Date().getDate()-1);
  var yesterdayString=Utilities.formatDate(yesterday, Session.getScriptTimeZone(), "yyyyMMdd")
  for(var i=0;i<vA.length;i++) {//Start at one if you have a header line
    if (isDate(vA[i][3])) {
      var t1=Utilities.formatDate(new Date(vA[i][3]),Session.getScriptTimeZone(),"yyyyMMdd");
      if(Utilities.formatDate(new Date(vA[i][3]),Session.getScriptTimeZone(),"yyyyMMdd")==yesterdayString && Number(vA[i][5])>=0.5) {
        //MailApp.sendEmail('test@gmail.com','Alert', 'Result found on: ' + Number(i+1))
        SpreadsheetApp.getUi().alert(i+1);
      }
    }
  }
}

function isDate(date){
  return(Object.prototype.toString.call(date) === '[object Date]');
}

我刚刚用这些数据进行了测试。

enter image description here

警报显示在第11行,即昨天。