【问题标题】:Are expired time-based triggers deleted automatically, or should they be manually removed?是否会自动删除过期的基于时间的触发器,还是应该手动删除它们?
【发布时间】:2012-06-14 10:24:27
【问题描述】:

我以编程方式在 Google Apps 脚本中设置触发器,以便在其他地方处理作业时将获取数据推迟几分钟。

我注意到,在脚本编辑器的“查看当前脚本的触发器”中,旧的(过期的)触发器仍然存在 - 我怀疑它们也计入触发器的最大数量限制。

Google Apps 脚本会删除这些过期的触发器,还是我必须检查触发器列表并删除过期的触发器?如果是,有人想分享一个代码示例吗? (我建议,这也应该包含在文档中)。

我使用 .at 创建触发器

   var d = new Date();
  d.setMinutes(d.getMinutes() + 5);
  
  try {
    ScriptApp.newTrigger("retrieveOrder")
      .timeBased()
      .at(d)
      .create();
  } catch(e) {
    sendErrorMail(e + " \n \n"  + "Date: " + d);
    return false;
  }

【问题讨论】:

    标签: google-apps-script triggers


    【解决方案1】:

    如果您知道从哪里调用它,那么您可以通过处理函数删除... 调用函数“updateGmailPhotoFromDriveBatcher”然后调用自身

    // this is called by a daily trigger. I don't want it deleted
    function runPhotoUpdates() {
      // NEEDS to be a separate fnc so it doesn't get deleted
      updateGmailPhotoFromDriveBatcher()
    }
    
    // this function does a job, then reschedules itself until a blank is returned
    function updateGmailPhotoFromDriveBatcher() {
      var ss = SpreadsheetApp.getActiveSpreadsheet(); //fetches the   spreadsheet that the script is running in
      var sheet = ss.getSheetByName("Groups");
    
    
      var sgfrom = sheet.getRange(10, 21).getValue(); 
      var npt = sheet.getRange(11, 21).getValue();  
    
      var oneJob = oneBatch(npt,sgfrom)
      var currTime = (new Date()).getTime();
      // WRITE THE new values; oneJob[0] is blank when completed; npt is a next page token of something that times out if you run the whole user base
      sheet.getRange(10, 21).setValue(oneJob[1]);
      sheet.getRange(11, 21).setValue(oneJob[0]);
      sheet.getRange(12, 21).setValue(oneJob[2]);
      sheet.getRange(13, 21).setValue(currTime)
    
    
      SpreadsheetApp.flush();
    
      if (oneJob[0] != "") {
      // SCHEDULE NEW JOB
    
       ScriptApp.newTrigger("updateGmailPhotoFromDriveBatcher")
               .timeBased()
               .at(new Date(currTime+(20*1000))) // 20 seconds from NOW
               .create();
       } else { // FINISHED
          // KILL TRIGGERS
          deleteTriggers()
       }
    
    }
    
    function deleteTriggers() { // cleans up the triggers made above
        var triggers = ScriptApp.getProjectTriggers();
        for (var i = 0; i < triggers.length; i++) {
           var thf = triggers[i].getHandlerFunction()   //String    Returns the function that will be called when the trigger fires.
           // if it's the one I kept making above
           if (thf == "updateGmailPhotoFromDriveBatcher") {
                ScriptApp.deleteTrigger(triggers[i]);
           }
    
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      您必须删除触发器。以docs 为例

      【讨论】:

        【解决方案3】:

        我将触发器的唯一 ID 连同设置为过期时间的时间戳一起放入 ScriptDb。然后我用这个杂物清除它:

        /**
         * @param {ScriptDbInstance} db
         */
        function clearExpiredTimeTriggers(db){
        
          var now = new Date();
          var nts = now.getTime();
          var res = db.query({trigId:db.anyValue(), trigExpiration: db.lessThan(nts)});
          var expiredTriggers = [];
          while (res.hasNext()){
            var item = res.next();
            expiredTriggers.push(item.trigId);
            db.remove(item);
          }
        
          var triggers = ScriptApp.getProjectTriggers();
          for (var i = 0; i < triggers.length; i++) {
            if (expiredTriggers.indexOf(triggers[i].getUniqueId()) > -1){
              ScriptApp.deleteTrigger(triggers[i]);
            }
          }
        }
        

        【讨论】:

        猜你喜欢
        • 2021-05-29
        • 2015-05-18
        • 2023-01-03
        • 1970-01-01
        • 2012-11-18
        • 2011-02-20
        • 2020-10-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多