Google apps script 过期的基于时间的触发器是自动删除还是手动删除?

Google apps script 过期的基于时间的触发器是自动删除还是手动删除?,google-apps-script,triggers,Google Apps Script,Triggers,我以编程方式在GoogleApps脚本中设置触发器,以便在其他地方处理作业时延迟几分钟获取数据 我注意到,在脚本编辑器的“查看当前脚本的触发器”中,旧的(过期的)触发器仍然存在——我怀疑它们也会计入最大触发器数量限制 谷歌应用程序脚本会删除这些过期的触发器吗?还是我必须查看触发器列表并删除过期的触发器?如果是,是否有人想共享代码示例?(我建议,这也应该包括在文件中) 我使用.at创建触发器 var d = new Date(); d.setMinutes(d.getMinutes()

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

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

谷歌应用程序脚本会删除这些过期的触发器吗?还是我必须查看触发器列表并删除过期的触发器?如果是,是否有人想共享代码示例?(我建议,这也应该包括在文件中)

我使用.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;
  }

你必须删除触发器。请看示例

我在ScriptDb中插入了触发器的唯一id以及设置为何时过期的时间戳。然后我用这个棍棒清除它:

/**
 * @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]);
    }
  }
}
/**
*@param{ScriptDbInstance}db
*/
函数clearExpiredTimeTriggers(db){
var now=新日期();
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.移除(项目);
}
var triggers=ScriptApp.getProjectTriggers();
对于(var i=0;i-1){
ScriptApp.deleteTrigger(触发器[i]);
}
}
}

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

    }

}
//这是由每日触发器调用的。我不想把它删除
函数runPhotoUpdates(){
//需要是一个单独的fnc,这样它就不会被删除
updateGmailPhotoFromDriveBatcher()
}
//此函数执行一项作业,然后重新调度自身,直到返回空白
函数updateGmailPhotoFromDriveBatcher(){
var ss=SpreadsheetApp.getActiveSpreadsheet();//获取脚本运行的电子表格
var sheet=ss.getSheetByName(“组”);
var sgfrom=sheet.getRange(10,21).getValue();
var npt=sheet.getRange(11,21).getValue();
var oneJob=oneBatch(npt、sgfrom)
var currTime=(新日期()).getTime();
//写入新值;oneJob[0]在完成时为空;npt是在运行整个用户群时超时的下一页标记
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).设置值(currTime)
SpreadsheetApp.flush();
如果(oneJob[0]!=“”){
//安排新工作
ScriptApp.newTrigger(“updateGmailPhotoFromDriveBatcher”)
.基于时间的()
.at(新日期(currTime+(20*1000))//20秒后
.create();
}否则{//完成
//杀死触发器
deleteTriggers()
}
}
函数deleteTriggers(){//清除上述触发器
var triggers=ScriptApp.getProjectTriggers();
对于(var i=0;i
由于触发器()的实际执行时间为+/-15分钟,因此此方法不是完全可靠的,因此在添加上述时间戳时,请确保添加适当的15分钟回旋余地。