Триггер по электронной почте на основе критериев - PullRequest
0 голосов
/ 12 января 2019

Это мои данные: enter image description here

Теперь я хочу отправить себе электронное письмо, когда будут выполнены 2 критерия:

  1. Столбец «Дата» D - это вчерашняя дата.
    И
  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 голосов
/ 13 января 2019

Вы можете попробовать что-то вроде этого:

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. Что вчера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...