2014-10-09 3 views
0

Google 앱 스크립트에는 프로그래밍 오류라고 의심되는 긴 루프를 방지하는 메커니즘이 내장되어 있습니까? 내가 요청하는 이유는 Gmail을 제어하기 위해 만드는 Google 앱 스크립트가 있다는 것입니다. 최대 실행 시간 오류를 피하기 위해 한 번에 100 개의 이메일 만 정리 한 다음 시간 기반 트리거를 사용하여 기능을 시작합니다.이 이메일은 정리할 이메일이 없을 때까지 계속됩니다. 나는 정리할 메일이 많으며 스크립트는 약 7 번 정도 실행됩니다. 그리고 나서 멈 춥니 다. 가능한 모든 오류 또는 종료 지점에서 이메일을 보내도록 코드를 설정했지만 전자 메일을받지는 못합니다. 스크립트의 트리거를 보면 7 ~ 9 분 전까지 예상대로 매분마다 이동 한 다음 중지합니다. 여기에 내 코드가 있지만 코드 문제는 아니라고 생각합니다.Google 앱 스크립트 시간 기반 트리거 루프 시간 초과

function runcleanup() { 
    var unreadthreads = 'label:all label:unread -has:red-star older_than:7d', 
    archivethreads = 'label:inbox -has:red-star older_than:14d', 
    threads, 
    execute; 

    try { 
    threads = GmailApp.search(unreadthreads, 0, 100); 
    Logger.log(threads.length); 
    if (threads.length) { 
     execute = markasread(threads); 
     ScriptApp.newTrigger("runcleanup") 
     .timeBased() 
     .at(new Date((new Date()).getTime() + 1000 * 15)) 
     .create(); 
    } else { 
     GmailApp.sendEmail(Session.getActiveUser().getEmail(), 
     "troubleshooting script", 
     "threads = " + threads.length); 
    } 
    } catch (e) { 
    GmailApp.sendEmail(Session.getActiveUser().getEmail(), 
     "troubleshooting script ERROR", 
     "error = " + e); 
    } 
} 

function markasread(threads) { 
    if (!threads) { 
    return false; 
    } 

    for (var i = 0; i < threads.length; i++) { 
    threads[i].markRead(); 
    } 

    return true; 
} 

function archive(threads, maxDate, delayread) { 
    if (!threads) { 
    return false; 
    } 

    for (var i = 0; i < threads.length; i++) { 
    threads[i].moveToArchive(); 
    } 

    return true; 
} 

답변

3

나는 당신의 대답에 동의하지 않는다. 나는 생각한다.

귀하의 스크립트는 15 초 후에 기능을 실행하는 시간 기반 트리거를 작성합니다. 즉, 동시에 실행되는 동일한 기능의 인스턴스가 여러 개있는 동안 잠시 후에 해당 기능이 실행된다는 의미입니다.

동일한 계정에서 컴퓨팅 요청에 대한 속성 및 일부 다른 제한 사항에 직면하게됩니다.

최대 실행 시간 오류를 방지하기 위해 타이머 트리거를 사용할 때 진행하는 일반적인 (그리고 작동하는) 방법은 평균 실행 시간이 일 때이 5 분보다 짧을 때마다 5 분마다 실행되도록 허용하는 것입니다.

개인적으로 10 분마다 한 번씩 트리거를 설정하고 tmie 측정 루틴을 사용하여 5 분을 초과하지 않는지 확인합니다. 그래서 다음 시작하기 전에 첫 번째 실행이 종료되었음을 확신합니다.

예는 this post for example에서 볼 수 있지만 다른 작업의 예를 많이 발표 ...

0

대답은 호기심 누군가를 위해, 예 것으로 보인다. 내 기능의 상단에이를 추가 한 후, 스크립트, 그래서 조심 물론이 무한 루프를 만들 수있는 잠재력을 가지고 있다는 말도없이

triggers = ScriptApp.getProjectTriggers(); 
if(triggers.length) { 
    ScriptApp.deleteTrigger(triggers[0]) 
} 

그것은 가야 작동합니다.

+2

당신은 이전의 '스레드'를 중지하고 있기 때문에 그것은 작동 ...하지만이 작업이 빨리 이루어지고 아닙니다. 또한 무한 루프가 없습니다 ...이 설명에서 설명 할 충분한 공간도 없습니다. – Mogsdad