每小时(仅在工作日)每小时运行一次Google App脚本脚本

时间:2019-06-03 14:03:17

标签: google-apps-script google-sheets

我只需要在工作日的每小时每小时运行一次Google App脚本脚本。

这两者似乎很容易,但是结合起来我不确定...

每小时触发一次:

 ScriptApp.newTrigger("RefreshRates").timeBased().inTimezone("GMT").everyHours(1).nearMinute(0).create();

它需要每小时运行一次,并尽可能接近该小时。 例如09:00、10:00、11:00等。我知道App Script不太准确,但是尽可能接近小时。

我发现这可能有助于解决工作日问题,但是可以将以上内容与类似的内容结合起来

 function createWeeklyTrigger() {
    var days = [ScriptApp.WeekDay.MONDAY, ScriptApp.WeekDay.TUESDAY,
                ScriptApp.WeekDay.WEDNESDAY, ScriptApp.WeekDay.THURSDAY,                                            
                ScriptApp.WeekDay.FRIDAY];
    for (var i=0; i<days.length; i++) {
       ScriptApp.newTrigger("your_function_name")
                .timeBased().onWeekDay(days[i])
                .atHour(11).create();
    }
 }

理想状态实际上是格林尼治标准时间周五9:45 pm至10:15 pm,此时外汇市场休市...

编辑: 我想我在最初的问题中对每个工作日的每小时(不是某些小时)做了一些不太清楚的事情。但是市场一周从格林尼治标准时间周日22:00开始,到格林尼治标准时间周五22:00结束。因此,理想的情况是每小时大约从每小时22:00 GMT到星期五22:00 GMT ...

1 个答案:

答案 0 :(得分:2)

我认为,最好的选择是在要设置脚本运行时间的每个小时设置一个Trigger,在设置工作日的那一小时内使用第二个循环,因为everyHours()不接受开始和结束参数。

请注意,这会创建在一周的同一天触发的单独触发器

function setWeekdaysTrigger() {

  var startHour = 9;
  var endHour   = 13;
  var daysWeek  = []; //put Enums for days of the week here;

  //set trigger to specific week days;
  daysWeek.forEach(function(day){
    //set trigger for 9AM to 13PM;
    for(var h=startHour; h<endHour; h++) {
      var tg = ScriptApp.newTrigger('doSomething').timeBased();
          tg.onWeekDay(day);
          tg.atHour(h).nearMinute(15).create(); //arbitrary precision (minutes);
    }        
  });

}

作为答案的更新-请注意,很遗憾,您可以代表一个一个用户为该项目创建的how many triggers上有配额(当前等于每个用户20个)每个项目的用户)。

可配置的触发器

正如注释中所阐明的那样,配置自定义日期 + 自定义小时触发器需要更复杂的处理。提议的解决方案(不计算明确的日期时间检查)是动态触发器配置(因为由于重复重叠而无法同时设置onWeekDay(day)everyHours(n) [我发现onWeekDay(day)设置了隐式{{ 1}}重复模式]):

首先,创建一个主触发函数来设置天数重复

everyWeeks(1)

第二,创建一个触发器更改函数,该触发器将按设置的重复发生次数触发,该函数将清除先前设置的触发器并创建新的触发器:

function custom24trigger() {
  var days  = [ScriptApp.WeekDay.TUESDAY]; //put Enum values here;

  //create trigger for each date (arbitrary hours);
  days.forEach(function(day){
    for(var offset = 0; offset < 23; offset=offset+4) { //every 4 hours;
      var tg = ScriptApp.newTrigger('changeTriggers').timeBased();
          tg.onWeekDay(day).atHour(offset).create(); //change every N hours;
    }
  });

}