我如何设置2个时间控制的触发器,在某些时间阻止用户交互?

问题描述 投票:0回答:1

更新所需过程的描述:

在每个新的一天的00:00:00开始时,将由当前日期和时间组成的第一个时间戳记写入单元格A2。

同一天,在22:00:00,将由当前日期和代码中指定的时间组成的下一个时间戳记写入单元格A3和A4。

示例:

1。)触发器1应该执行以下操作:今天00:00:00->将时间戳(当前日期+当前时间)写入单元格A2

2。)触发器2应该执行以下操作:今天22:00:00->将时间戳记(当前日期+ 22:00:00)写入单元格A3和将(当前日期+ 23:59:59)写入单元格A4

3。)第二天,同一游戏

此过程每天重复。

此过程可以使用下面显示的代码吗?还是有更好,更有效的解决方案?

    function TimeTrigger(functionName) {
      deleteTrigger(functionName);

      // Script writes two timestamps in cells A2 and A3.
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getSheetByName('Tickerprüfung');

      sheet.getRange('A2').setValue(new Date());
      var date = new Date();
          date.setHours(22);
          date.setMinutes(0);
          date.setSeconds(0);
          date.setMilliseconds(0);
      sheet.getRange('A3').setValue(date);
      var date1 = new Date();
          date1.setHours(23);
          date1.setMinutes(59);
          date1.setSeconds(59);
          date1.setMilliseconds(00);
      sheet.getRange('A4').setValue(date1);
    }

    function TimeTrigger1() {TimeTrigger("TimeTrigger1")}
    function TimeTrigger2() {TimeTrigger("TimeTrigger2")}

    function deleteTrigger(functionName) {
      var triggers = ScriptApp.getProjectTriggers();
      triggers.forEach(function(t) {
        if (t.getHandlerFunction() == functionName) ScriptApp.deleteTrigger(t);
      });
    }

    function createDayTrigger() {
      var d1 = new Date();
      d1.setDate(d1.getDate() + 1); // <--- Added
      d1.setHours(22);
      d1.setMinutes(0);
      d1.setSeconds(0);
      ScriptApp.newTrigger('TimeTrigger1').timeBased().at(d1).create();
      var d2 = new Date();
      d2.setDate(d2.getDate() + 1);
      d2.setHours(0);
      d2.setMinutes(1); // Do you want to run at "00:01"?
      d2.setSeconds(0);
      ScriptApp.newTrigger('TimeTrigger2').timeBased().at(d2).create();
    }

    // This function has to be started once to get "createDayTrigger()" started.
    function startScript() {
      ScriptApp.newTrigger('createDayTrigger').timeBased().everyDays(1).atHour(21).create();
    }
google-apps-script
1个回答
1
投票

作为几种方法之一,如果您想为everyDays使用一个触发器,那么下面的修改脚本怎么样?

在此修改中,流程如下。

流量:

  1. createDayTrigger被设置为everyDays的触发器,该触发器在“ 21:00”附近运行。
    • startScript()的功能仅需运行一次。运行此功能后,将自动运行时间驱动的触发器。
  2. [运行createDayTrigger时,将TimeTrigger1TimeTrigger2的功能设置为at的触发器,它们在“ 22:00”和“ 00:01”处运行。
  3. [运行TimeTrigger1时,运行TimeTrigger的功能并清除TimeTrigger1的触发。
  4. [运行TimeTrigger2时,运行TimeTrigger的功能并清除TimeTrigger2的触发。

在此循环中,TimeTrigger的功能可由TimeTrigger1TimeTrigger2在“ 22:00”和“ 00:01”运行。

修改的脚本:

function TimeTrigger(functionName) {
  deleteTrigger(functionName);

  // Script writes two timestamps in cells A2 and A3.
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Tickerprüfung');

  sheet.getRange('A2').setValue(new Date());
  var date = new Date();
      date.setHours(22);
      date.setMinutes(0);
      date.setSeconds(0);
      date.setMilliseconds(0);
  sheet.getRange('A3').setValue(date);
  var date1 = new Date();
      date1.setHours(23);
      date1.setMinutes(59);
      date1.setSeconds(59);
      date1.setMilliseconds(00);
  sheet.getRange('A4').setValue(date1);
}

function TimeTrigger1() {TimeTrigger("TimeTrigger1")}
function TimeTrigger2() {TimeTrigger("TimeTrigger2")}

function deleteTrigger(functionName) {
  var triggers = ScriptApp.getProjectTriggers();
  triggers.forEach(function(t) {
    if (t.getHandlerFunction() == functionName) ScriptApp.deleteTrigger(t);
  });
}

function createDayTrigger() {
  var d1 = new Date();
  d1.setHours(22);
  d1.setMinutes(0);
  d1.setSeconds(0);
  ScriptApp.newTrigger('TimeTrigger1').timeBased().at(d1).create();
  var d2 = new Date();
  d2.setDate(d2.getDate() + 1);
  d2.setHours(0);
  d2.setMinutes(1); // Do you want to run at "00:01"?
  d2.setSeconds(0);
  ScriptApp.newTrigger('TimeTrigger2').timeBased().at(d2).create();
}

// This function has to be started once to get "createDayTrigger()" started.
function startScript() {
  ScriptApp.newTrigger('createDayTrigger').timeBased().everyDays(1).atHour(21).create();
}

注意:

  • 如果要在“ 00:01”处设置触发器,则需要添加d2.setDate(d2.getDate() + 1);。因为设置触发器后,“ 00:01”是明天。

编辑:

根据您的回复评论和更新的问题,我可以理解您要将触发时间设置为同一天的00:00和22:00。在上面的答案中,第一个触发器和第二个触发器分别是今天的22:00和明天的00:00。但是,此循环通过安装有createDayTrigger的触发器继续进行。这样,在下一个周期之后,将触发同一天的00:00和22:00。但这似乎没有用。因此,我提出了修改后的脚本。请按如下方式修改我的上述脚本。

function createDayTrigger() {
  var d1 = new Date();
  d1.setDate(d1.getDate() + 1); // <--- Added
  d1.setHours(22);
  d1.setMinutes(0);
  d1.setSeconds(0);
  ScriptApp.newTrigger('TimeTrigger1').timeBased().at(d1).create();
  var d2 = new Date();
  d2.setDate(d2.getDate() + 1);
  d2.setHours(0);
  d2.setMinutes(1); // Do you want to run at "00:01"?
  d2.setSeconds(0);
  ScriptApp.newTrigger('TimeTrigger2').timeBased().at(d2).create();
}
  • 通过以上修改,运行createDayTrigger()时,触发时间00:00和22:00被设置为同一天。
© www.soinside.com 2019 - 2024. All rights reserved.