【问题标题】:Run a Gmail Google Apps Script daily at 8:00, 12:30, 17:00每天 8:00、12:30、17:00 运行 Gmail Google Apps 脚本
【发布时间】:2020-03-20 11:33:06
【问题描述】:

我需要每天运行 3 次 Google Apps 脚本:8:00、12:30、17:00。

怎么做?

我已经看过Triggers,更具体地说是Time driven

  • 小时计时器,但Every hourEvery 2 hoursEvery 4 hours 此处不适用

  • 日计时器,但是8am to 9am 不是很精确,我更喜欢更精确的东西,而且 12:30 也是不可能的

  • 具体时间,但是YYYY-MM-DD HH:MM不适合每天运行

From calendar 触发器似乎也不适应。

【问题讨论】:

    标签: javascript google-apps-script triggers google-apps gs-installable-triggers


    【解决方案1】:

    使用nearMinute() and atHour():

    const createTrigger = ([hour, minute])=>
      ScriptApp.newTrigger("myFunction")
      .timeBased()
      .atHour(hour)
      .nearMinute(minute)  
      .everyDays(1) 
      .create();
    
    [[8,0],[12,30],[17,0]].forEach(createTrigger)
    

    【讨论】:

    • 感谢您的回答@TheMaster。 PS:放置这种“init”/“setup”/“doitonce”代码的自然位置在哪里?只是在您手动运行一次的function setup() { } 中,在与主myFunction(完成这项工作的那个)相同的.gs 文件中?
    • @Bas 是的。您可以添加 ui 菜单 setup 来运行此 setup 函数
    • 谢谢。这个 UI 菜单会出现在哪里(你有截图吗)?
    • @Basj 道歉。 gmail 插件无法使用菜单(它们仅可用于工作表/文档..)。可以试试homepages or cards
    • @MariosKaramanis 您可以在此处删除并在此处复制。但是你不能只在两个地方复制粘贴并保留它们。你的选择。一个地方或另一个地方。
    【解决方案2】:

    虽然 TheMaster 的回答是正确的,但我想详细说明一种替代方法,它可能对未来的读者和不同的项目有用。

    假设您有一个特定时间列表(24 小时:毫米),您希望每天安排:

    var times = [[9,30],[9,45],[10,00],[12,00]] // 9:30 am, 9:45 am, 10:00 am 12:00pm
    

    可以完全随机,按照你喜欢的任何顺序。

    正如您在下面的代码中看到的,您可以运行setTrigger() 函数,为上述列表中的每个元素生成另一个函数function_Triggered()预定触发器。触发器将具有times 中提供的时间和今天的日期。

    如果你想每天执行这个任务,那么你只需要为setTrigger()创建一个每日触发器并在times在最早时间之前运行它.在这种情况下,您每天都在生成触发器,因此 deleteTriggers() 用于删除附加到您的项目的 function_Triggered() 以前(禁用)的触发器。

    function setTrigger() {
    
    deleteTriggers();  
    var times = [[9,30],[9,45],[10,00],[12,00]]; // 9:30 am, 9:45 am, 10:00 am 12:00pm
    times.forEach(t_el => scheduledTrigger(t_el[0],t_el[1]));
    }
    
    function scheduledTrigger(hours,minutes){
      
    var today_D = new Date();  
    var year = today_D.getFullYear();
    var month = today_D.getMonth();
    var day = today_D.getDate();
      
    pars = [year,month,day,hours,minutes];
      
    var scheduled_D = new Date(...pars);
    var hours_remain=Math.abs(scheduled_D - today_D) / 36e5;
    ScriptApp.newTrigger("function_Triggered")
    .timeBased()
    .after(hours_remain * 60 *60 * 1000)
    .create()
    }
    
    function deleteTriggers() {
      
    var triggers = ScriptApp.getProjectTriggers();
    for (var i = 0; i < triggers.length; i++) {
      if (   triggers[i].getHandlerFunction() == "function_Triggered") {
        ScriptApp.deleteTrigger(triggers[i]);
      }
    }
    }
    
    function function_Triggered() {
     // your function code here
    }
    

    【讨论】:

      【解决方案3】:

      soMario 和 TheMaster 有可行的解决方案,但不幸的是,对于我的用例,我需要一些比 + 或 - 15 分钟更严格的公差!!谷歌应用程序脚本调度程序“工作”的依据。

      我使用他们非常不准确的调度程序每 5 分钟运行一次以下函数。此功能将非常准确地检查当前时间,似乎到目前为止,并且仅在您想要的小时和分钟内运行下一个“核心”功能。一个简单的 if 条件添加,使用 getDay() 将添加一周中的一天“过滤器”。

      function timeCheck() {
        var nowH=new Date().getHours();
        var nowM=new Date().getMinutes();
        Logger.log('Hour: '+nowH+'  Minute: '+nowM)
      
        if (nowH = 1 && nowM < 12) { getStatus() }
        if (nowH = 10 && (nowM > 15 && nowM < 27)) { getStatus() }
      
        return
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-15
        • 2020-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-08
        • 2015-12-29
        • 2022-01-20
        相关资源
        最近更新 更多