Как исправить этот скрипт, чтобы не запускать триггеры в определенные даты - PullRequest
0 голосов
/ 05 мая 2019

Я сейчас использую этот скрипт

function shouldRunTrigger() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var fiestas = ss.getSheetByName("x");
  var data = fiestas.getRange(2,1,fiestas.getLastRow()-1,4).getValues();
  var days = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
  var date = new Date();
  var day = days[date.getDay()];
  var hours = date.getHours();  
  var FiestaEmpieza = date
  var FiestaAcaba = date
  for (var row in data){    
     FiestaEmpieza = data[row][2] ;
    }
  for (var row in data){    
     FiestaAcaba = data[row][3] ;
    }
  // Don't run from Friday 6pm until Saturday 10Pm
   if ((day === "Fri" && hours >= 18) || (day === "Sat" && hours <= 21)){
    return false;
  }

  // Dont turn from specific dates from Tab "x" from 6pm until 10pm
   else if (date >= FiestaEmpieza && hours >= 18 && date <= FiestaAcaba && hours <= 21){
    return false; 
  }

   else {
    return true; 
  }

}

Цель скрипта: мне нужно запускать триггеры каждые 5 минут, но если день между пятницей 18:00 и субботой 22:00, триггер не запускаетсяЭта часть работает.

Мне также нужно, чтобы она не выполнялась в определенные даты (строка 31 скрипта), которая берет даты из моей вкладки электронной таблицы "x", дата начала - это столбец C и конецдата - это столбец D, и данные выглядят так:

enter image description here

Я считаю, что проблема заключается в строке 31 скрипта

else if (date >= FiestaEmpieza && hours >= 18 && date <= FiestaAcaba && hours <= 21){

Что не правильно определяет даты и часы, я не уверен, правильно ли &&.

Любая помощь, как решить эту проблему, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 05 мая 2019

FiestaEmpeiza y FiestaAcaba всегда будет последней строкой, потому что вы перебираете значения даты и присваиваете, но затем не выполняете никаких ваших условных проверок.Вам необходимо объединить циклы в один, а затем переместить операторы if в цикл.

Я рекомендую изменить некоторые имена переменных, чтобы они были более описательными, и передать время запуска вашей функции, чтобы вам было проще ее проверить.

Кроме того, убедитесь, что вы поддерживаете согласованность сВаши проверки даты - объекты даты включают время.То, как вы это написали, вы сравнивали объекты дат, то есть «1 апреля @ 4 вечера» раньше, чем «1 апреля @ 4:01 вечера».Таким образом, ваше условие может не выполниться в зависимости от значения, которое вы определили в date.Это можно исправить просто настройкой часов .(Будьте осторожны с проблемами часовых поясов.)

function test_shouldRunTrigger() {
  var triggerTime = new Date("Fri Apr 19 17:00:00 GMT+08:00 2019"); // Change the date to test
  Logger.log(shouldRunTrigger(triggerTime));
}

function shouldRunTrigger(triggerTime) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("x");
  var fiestas = sheet.getRange(2,1,sheet.getLastRow()-1,4).getValues();
  var days = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
  var triggerDay = days[triggerTime.getDay()]; // Day of the week
  var triggerHour = triggerTime.getHours(); // Hour of the trigger
  var triggerDate = new Date(triggerTime.setHours(0, 0, 0, 0)); // Set time to 00:00:00
  Logger.log(fiestas)
  for (var row in fiestas) {
    var fiestaEmpieza = new Date(fiestas[row][2].setHours(0, 0, 0, 0)); // Set time to 00:00:00
    var fiestaAcaba = new Date(fiestas[row][3].setHours(0, 0, 0, 0)); // Set time to 00:00:00

    // Don't run from Friday 6pm until Saturday 10pm
    if ((triggerDay === "Fri" && triggerHour >= 18) || (triggerDay === "Sat" && triggerHour <= 21)) {
      return false;
    } else if ( // Dont run from specific dates from Tab "x" from 6pm until 10pm
      triggerDate >= fiestaEmpieza && // Compares dates and we know the times are all 00:00:00
      triggerHour >= 18 &&
      triggerDate <= fiestaAcaba && // Compares dates and we know the times are all 00:00:00
      triggerHour <= 21
    ) { 
      return false; 
    } else {
      return true; 
    }
  }
}
0 голосов
/ 05 мая 2019

Я думаю, это может сработать.Если бы у меня был доступ к вашей электронной таблице, чтобы я мог просто скопировать данные, я бы протестировал их.

function shouldRunTrigger() {
  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var sh=ss.getSheetByName("x");
  var vA=sh.getRange(2,1,sh.getLastRow()-1,4).getValues();
  var days=["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
  var today=new Date();
  var day=days[today.getDay()];
  var hours=today.getHours();  
  if((day=="Fri" && hours>=18) || (day=="Sat" && hours<=22)){return false;}
  for(var i=0;i<vA.length;i++){    
    var dt1=new Date(vA[row][2]).valueOf();
    var dt2=new Date(vA[row][3]).valueOf();
    if(today.valueOf()>=dt1 && hours >=18 && today.valueOf() <= dt2 && hours <= 21){
      return false; 
    }
  }
  return true; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...