2016-12-12 9 views
0

私はGoogleドライブをチェックし、ユーザーの介入なしにファイルを自動的にダウンロードするポーリングWebアプリケーションを作成しようとしています。Web Appのドライブからファイルを自動ダウンロードしますか?

ContentServiceを使用するdoGet関数にコードを配置すると、物事がうまくいくようになりました。

ただし、これは一度しか機能しません。タイマーイベントでページを自動的にリフレッシュまたはリロードする方法はありません。

クライアント側のjavascriptでSetTimeoutを使用すると、一定の間隔で自動的にトリガする機能をサーバ側で取得できますが、ContentServiceからの出力をどう処理するかが問題になります。

オンサクセスコールバックは、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

EDIT:明確化後の別の回答。

ウェブアプリケーションとして自動実行する場合は、getDownloadUrlを返し、それをソースとして使用して新しいiFrameを作成します。ボタン(この例では示されていない)を介して、ここで一回または多数回、または手動でポイントではありません

Appsスクリプト

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

答えを編集しました –

関連する問題