2012-05-15 2 views
2

많은 셀에서 사용자 특정 기능을 호출하는 Google 스프레드 시트가 있습니다. 이 함수는 3-4 개의 상대적으로 짧은 웹 페이지를 가져와 파싱합니다. 페이지는 하루에 한 번만 바뀌지 만, 스프레드 시트가 하루에 한 번씩 각 페이지를 가져오고 캐시 사본을 사용하도록하는 방법을 알 수 없다. ~ 20 후 urlfetchapp 오류가 발생 후 새로 고치는 동안 믿습니다. "서비스가 너무 많이 호출되었습니다."Google 앱 스크립트 : urlfetchapp - 너무 자주 호출 된 서비스

이 문제의 해결 방법을 찾으려고합니다. 이 오류는 많은 URL 파생 때문에 (심지어 동일한 URL에 대해서도 변경되지 않은 내용으로) 발생한다고 생각합니다. 많은 구문 분석 때문이 아닙니다.

이것이 사실이라면 어떻게 페치 수를 줄일 수 있습니까? 예를 들어 어딘가에서 페이지를 다운로드하고 로컬로 구문 분석 할 수 있습니까? Google 스프레드 시트의 웹 페이지에 대해 일종의 캐싱을 사용할 수 있습니까? 스프레드 시트가있는 Google 드라이브에서이 파일의 사본을 저장하면 도움이됩니까? URLfetchapp의 제한을 늘릴 수 있습니까? 다른 아이디어가 있습니까?

답변

2

이와 같은 사용 사례 용으로 만들어진 Cache service을 살펴보아야합니다. 이 서비스를 소개하는 This blog post은 몇 가지 기본 사용법을 보여줍니다.

+0

정말 유용한 패턴입니다. – Stanislasdrg

1

유사한 문제를 피하기 위해 해결 방법을 구현했습니다. 그것은 매우 우아하지는 않지만 작동합니다. 그것은 루프를 사용하여 Utilities.sleep()을 사용합니다.

function urlFetchWihtoutError(url) { 
    const NB_RETRY = 10; 
    var nbSecPause = 1.5; 
    var nbErr = 0; 
    while (nbErr < NB_RETRY) { 
    try { 
     if (nbErr > 0) SpreadsheetApp.getActiveSpreadsheet().toast("Here we go again."); 
     var res = UrlFetchApp.fetch(url).getContentText(); 
     return res; 
    } 
    catch (error) { 
     nbErr++; 
     SpreadsheetApp.getActiveSpreadsheet().toast("Let's pause the system during " + nbSecPause + " seconds. Loop number: " + nbErr); 
     Utilities.sleep(nbSecPause * 1000) 
     nbSecPause += 0.5; 
    } 
    } 
}