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