Стоп-цикл Google script после первого совпадения - PullRequest
0 голосов
/ 09 июля 2019

У меня есть скрипт, который сравнивает даты в столбце с сегодняшней датой и отправкой электронной почты.Проблема в том, что он посылает много писем для каждой сравниваемой ячейки.

Вот мой код

function sendEmailAlert3() {

var ss = SpreadsheetApp.openById("ID");
var sheet = ss.getSheetByName("Sheet1");
var sheetname = ss.getSheetByName("Sheet1").getName();
var fValues = sheet.getRange('F2:F20').getValues();
var day = 24*3600*1000
var today = parseInt((new Date().setHours(0,0,0,0))/day);
var user = Session.getActiveUser().getEmail();
var Toemail = 'mail@gmail.com';
var subject = 'Theme - ' + ss.getName();
var body = 'Edited - ' + sheetname + '\nBy - ' + user +
    '\nCheck - ' + ss.getUrl();
var NoEditSubject = 'No ' + ss.getName() + '!';
var NoEditBody = 'No - ' + sheetname +  ss.getUrl();
for (var i = 0; i < fValues.length; i++) {
    var dataday = parseInt(fValues[i][0].getTime()/day)
    Logger.log(dataday+' = '+today)
    if (dataday <= today-5) {MailApp.sendEmail(Toemail,subject, body);}
    else {MailApp.sendEmail(Toemail,NoEditSubject, NoEditBody);}  
    }
}

Мне нужно добавить еще одно условие, например next cell == false.

If (dataday <= today-5 || next cell == false) - для первого совпадения этого условия необходимо один раз отправить электронное письмо и остановить цикл

Else if (dataday <= today-5 || next cell == true) - для первого совпадения с этим условием необходимо один раз отправить электронное письмо и остановить цикл

else - сделатьничего

РЕДАКТИРОВАТЬ после всех ответов мой код выглядит так (нижняя часть):

var dataRange = sheet.getRange(2,7,2,1);
var data = dataRange.getValues();
for (i = 0; i < fValues.length; i++) {
  var dataday = parseInt(fValues[i][0].getTime()/day)
  for (k = 0; k < data.length; k++) {
    Logger.log(dataday)
    if (dataday <= today+5 && data[k][0] == "false") 
    {MailApp.sendEmail(Toemail,subject, body);
          }
  }
}

Но он все еще не работает.Я постараюсь уточнить, в чем проблема.enter image description here

Условие (дата <<сегодня + 5 && data [k] [0] == "false").В этом случае скрипт должен отправить только одно письмо.Потому что оба условия верны только для первого ряда.Но он отправил два электронных письма.Я не знаю, в чем проблема. </p>

1 Ответ

0 голосов
/ 09 июля 2019

Все, что вам нужно сделать, это реализовать оператор return внутри оператора if - это остановит цикл после отправки первого письма. Как это:

 if (dataday <= today-5) {
      MailApp.sendEmail(Toemail,subject, body); 
      return;
    }
    else {MailApp.sendEmail(Toemail,NoEditSubject, NoEditBody);}  

Для второй части вашего вопроса: вы можете выйти из вложенных циклов, если вы их называете, а затем выйти с «break», определяющим, какой цикл вы хотите завершить, как объяснено здесь :

var i, j;

loop1:
for (i = 0; i < 3; i++) {      //The first for statement is labeled "loop1"
   loop2:
   for (j = 0; j < 3; j++) {   //The second for statement is labeled "loop2"
      if (i === 1 && j === 1) {
         break loop1;
      }
   }
}
...