2012-06-14 1 views
0

Google Apps Script에서 트리거를 설정하여 작업이 다른 곳에서 처리되는 동안 몇 분 동안 가져 오기 데이터를 지연시킵니다.Google Apps 스크립트에서 만료 된 트리거 - 가비지?

나는 Script Editor의 "현재 스크립트의 트리거보기"에서 오래된 (만료 된) 트리거가 계속 발생 함을 알았습니다. 최대 트리거 수 한도에 포함됩니다.

Google Apps Script에서 만료 된 이러한 트리거를 삭제할 예정입니까, 아니면 트리거 목록을 검토하고 만료 된 트리거를 삭제해야합니까? 그렇다면 누군가가 코드 예제를 공유하려고합니까? (이 또한 문서에 포함되어야합니다.)

나는

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; 
    } 

감사 .at 사용하여 트리거를 작성하고 모든 최고의

마리오

답변

0

ScriptDb에 만료되도록 설정된 타임 스탬프와 함께 트리거의 고유 ID를 고정 시켰습니다. 그럼이 cludge 그것을 취소 :

/** 
* @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]); 
    } 
    } 
} 
+0

이 방법은 트리거의 실제 실행 시간이 +/- 15 분이기 때문에 완전하지 않습니다 (https://developers.google.com/apps-script/reference/script/clock-trigger-builder#at(Date))), 위의 타임 스탬프를 추가 할 때는 적절한 15 분의 여유를 추가해야합니다. – LeonidR

2

당신은 트리거를 삭제했다. 예를 들어 docs을 보겠습니다.

0

당신이 다음 방금 핸들러 함수에 의해 삭제할 수 있습니다에서 호출되고 어디 알고 있다면 ... 는 호출되는 함수를 "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]); 
     } 

    } 

}