2016-12-12 5 views
0

Google 드라이브를 확인하고 사용자 상호 작용없이 파일을 자동으로 다운로드하는 폴링 웹 앱을 작성하려고합니다.Web App에서 드라이브의 파일을 자동으로 다운로드 하시겠습니까?

ContentService를 사용하여 doGet 함수에 코드를 추가하면 작업을 수행 할 수있었습니다.

그러나 이것은 한 번만 작동하며 타이머 이벤트에서 페이지를 새로 고치거나 다시로드하는 방법이 아닌 것으로 보입니다.

클라이언트 측 javascript에서 SetTimeout을 사용하면 서버 측에서 특정 간격으로 자동으로 트리거되는 기능을 얻을 수 있지만 ContentService의 출력과 관련이 있습니다.

on success 콜백은 createTextOutput의 출력을 허용하지 않습니다.

내 솔루션을 배포 할 필요가 없으며 편집자가 내 선택을 확장하는 경우 편집기에서 실행하게되어 기쁩니다.

그럼 서버 쪽에서 createTextOutput의 결과를 얻었 으면 파일 다운로드를 위해 클라이언트에 다시 가져 오기 위해 무엇을해야합니까?

도움이된다면 코드를 포함 시켰습니다.

<!DOCTYPE html> 
<html> 
    <head> 
    <base target="_top"> 
    <script> 

    setTimeout(
    function() 
    { 
     document.getElementById('results').innerHTML = 'Event Timer'; 
     google.script.run 
     .withSuccessHandler(onSuccess) 
     .withFailureHandler(onFailure) 
     .fetchFromGoogleDrive(); 
    }, 60000); 

    function onSuccess(sHTML) 
    { 
    document.getElementById('results').innerHTML = 'File Downloaded ' + sHTML; 
    } 

    function onFailure(error) 
    { 
    document.getElementById('results').innerHTML = error.message; 
    } 

    </script> 
    </head> 
    <body> 
    <div id="results">Waiting to DownLoad!</div> 
id="Fetch">Fetch!</button> 
    </body> 
</html> 

function doGet() { 
    Logger.log('doGet'); 
    return HtmlService.createHtmlOutputFromFile('form.html'); 
} 

function fetchFromGoogleDrive() { 
    //Logger.Log('fetchFromGoogleDrive'); 

    var fileslist = DriveApp.searchFiles("Title contains 'Expected File'"); 

    if (fileslist.hasNext()) { 
    //Logger.Log('File found'); 
    var afile = fileslist.next(); 
    var aname = afile.getName(); 
    var acontent = afile.getAs('text/plain').getDataAsString(); 

    var output = ContentService.createTextOutput(); 
    output.setMimeType(ContentService.MimeType.CSV); 
    output.setContent(acontent); 
    output.downloadAsFile(aname); 
    return afile.getDownloadUrl(); 
    } 
    else 
    { 
    //Logger.Log('No File Found'); 
    return 'Nothing to download'; 
    } 

    //Logger.log('All files processed.'); 
} 

답변

0

편집 : 명확한 답변이 다른 경우.

웹 응용 프로그램으로 자동 실행되도록하려면 getDownloadUrl을 반환하고 소스로 사용하여 새 iFrame을 만드십시오.

애플리케이션 스크립트 (안이 예에서와 같이) 버튼을 통해 한 번 또는 여러 번, 또는 수동으로 여기에 포인트 아니다

function doGet() { 
    return HtmlService.createHtmlOutputFromFile('index'); 
} 

function getDownloadLink(){ 
    //slice removes last parameter gd=true. This needs to be removed. slice is a hack you should do something better 
    return DriveApp.getFileById("0B_j9_-NbJQQDckwxMHBzeVVuMHc").getDownloadUrl().slice(0,-8); 
} 

index.html을

<!DOCTYPE html> 
<html> 
    <head> 
    <base target="_top"> 
    </head> 
    <body> 
    <p id="dlBox"></p> 
    </body> 

    <script> 

    function buildLink(res){ 
     var dlBox = document.createElement("iframe"); 
     dlBox.src = res;  
     document.getElementById("dlBox").appendChild(dlBox) 
    } 

    //automate this as you need 
    google.script.run 
    .withSuccessHandler(buildLink) 
    .getDownloadLink();  

    </script> 

</html> 
+0

. 요점은 함수가 입력되면 다운로드를 위해 Google 드라이브 문서를 반환하기위한 메커니즘이 제공되지 않는다는 것입니다. 작동 가능한 유일한 메커니즘은 doGet()을 통해 파일을 다운로드하는 것입니다. – Walter

+0

나는 대답을 편집했다. –

관련 문제