每隔一周运行Google脚本

时间:2013-02-19 05:51:10

标签: google-apps-script

我有一个工资核算的Google电子表格,其中的脚本需要每隔一周运行一次。现在,我正在手动运行它。我想使用一个时间驱动的触发器,但我无法弄清楚每周四凌晨1点会做的任何组合。有人知道这可能会这样做吗?

5 个答案:

答案 0 :(得分:2)

你可以原型扩展日期对象,给你一个周数,然后选择只在偶数周(或明显奇数)打电话

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的开/关标志方法

答案 1 :(得分:1)

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

将以下功能设置为每周运行

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

您必须初始化“runThisWeek”属性才能正确设置。

答案 2 :(得分: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(); 
}

答案 3 :(得分:0)

function createBiWeeklyTrigger() {
  // Trigger every other Monday at 06:00.
  ScriptApp.newTrigger('function_name')
      .timeBased()
      .everyWeeks(2)
      .onWeekDay(ScriptApp.WeekDay.MONDAY)
      .atHour(6)
      .create();
}

答案 4 :(得分:0)

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

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。我试图通过使用大写的第一个字母来区分布尔值和布尔值表示为字符串。

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