2

我以编程方式在 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;
  }
4

3 回答 3

3

如果您知道从哪里调用它,那么您可以通过处理函数删除......调用函数“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]);
       }

    }

}
于 2017-02-01T20:06:04.700 回答
2

您必须删除触发器。查看文档以获取示例

于 2012-06-14T11:30:41.770 回答
1

我将触发器的唯一 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]);
    }
  }
}
于 2014-02-14T02:28:57.943 回答