1

我有一个用于工资单的谷歌电子表格,其中包含需要每隔一周运行一次的脚本。现在,我正在手动运行它。我想使用时间驱动的触发器,但我想不出任何组合可以在每隔一个星期四凌晨 1 点执行。任何人都知道这样做的方法吗?

4

5 回答 5

3

您可以原型扩展日期对象以给您一个星期数,然后选择仅在偶数周(或显然是奇数)调用

Date.prototype.getWeekNumber = function() {
  var firstDay = new Date(this.getFullYear(),0,1);
  return Math.ceil((((this - firstDay) / 86400000) + firstDay.getDay()+1)/7);
}

然后在你每周星期四的触发器中,将整个批次包装在一个条件中

if (today.weekNumber() % 2 === 0) {
  // triggered function here
}

但我想我喜欢 Phil Bozak 的开/关标志方法

于 2013-02-19T11:25:29.617 回答
2

您可以使用脚本属性来保存有关脚本的属性。

设置以下函数每周运行

function runEveryWeek() {
  var runThisWeek = ScriptProperties.getProperty("runThisWeek");
  if (runThisWeek) {
    //do your task here
    ScriptProperties.setProperty("runThisWeek",false);
  } else {
    ScriptProperties.setProperty("runThisWeek",true);
  }
}

您必须初始化“runThisWeek”属性,以便正确设置它。

于 2013-02-19T07:17:24.507 回答
2
function createBiWeeklyTrigger() {
  // Trigger every other Monday at 06:00.
  ScriptApp.newTrigger('function_name')
      .timeBased()
      .everyWeeks(2)
      .onWeekDay(ScriptApp.WeekDay.MONDAY)
      .atHour(6)
      .create();
}
于 2015-09-28T18:13:59.000 回答
1

试试这个:

// The init() function runs once to set up the initial trigger.

function init() {
   ScriptApp.newTrigger("ThursdayTrigger")
    .timeBased()
    .atDate(2013, 3, 21) // Setup the first trigger on a specific date
    .create();
}

function ThursdayTrigger() {

  // 1. write the function code here

  // 2. delete the existing ThursdayTrigger

  var triggers = ScriptApp.getScriptTriggers();
  for (var i = 0; i < triggers.length; i++) {
    if (triggers[i].getHandlerFunction() == "ThursdayTrigger") {
      ScriptApp.deleteTrigger(triggers[i]);
    }
  }

  // 3. setup another trigger in the same function that triggers after 14 days.

  ScriptApp.newTrigger("ThursdayTrigger")
    .timeBased()
    .after(1000*60*60*24*14) // Alternate Thursday
    .create(); 
}
于 2013-02-19T10:56:14.143 回答
1

ScriptProperties 库现已弃用。PropertiesService 文档帮助我找出了下面的解决方案。

function runEveryWeek() {
  var scriptProps = PropertiesService.getScriptProperties();
  if(scriptProps.getProperty('runThisWeek') == "True"){
    //do your task here
    Logger.log("tast executes");
    scriptProps.setProperty("runThisWeek", 'False');
  } else {
    Logger.log("task does not execute");
    scriptProps.setProperty("runThisWeek", 'True');
  }
}

我最初尝试将值设置为布尔值,但这导致了一个问题,因为该方法.getProperty()具有返回类型string。我试图通过使用大写首字母来明确区分布尔值和布尔值表示为字符串。

您可以在运行后通过检查日志来测试它。

于 2017-02-09T19:16:06.913 回答