サーチ…


前書き

このシンプルなGoogle App Webスクリプト(スタンドアロン)を使用すると、ユーザーのローカルPCにファイルをダウンロードするためにGoogleドライブを繰り返しポーリングすることができます。 1つのアプリケーションスクリプトを使用して、次の両方の機能を提供する方法を示します。1.ユーザーインターフェイス(この例では単純なもの)2.ファイルダウンロードページ。どのように動作するかについての完全な説明は、「どのように動作するか」の例を参照してください。

備考

Web Scriptは、動作させるために公開する必要があります。

ポップアップはhttps://script.google.comで有効にする必要があります

forms.html

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <script>
    
    setInterval(
    function () 
    { 
      document.getElementById('messages').innerHTML = 'Event Timer Fetching';
      google.script.run
        .withSuccessHandler(onSuccess)
        .withFailureHandler(onFailure)
        .fetchFromGoogleDrive();
    }, 60000);
    
    function callFetchGoogleDrive() {
      document.getElementById('messages').innerHTML = 'Fetching';
      google.script.run
        .withSuccessHandler(onSuccess)
        .withFailureHandler(onFailure)
        .fetchFromGoogleDrive();   
    }
      
    function onSuccess(sHref) 
    {
      if(new String(sHref).valueOf() == new String("").valueOf())
      {
        document.getElementById('messages').innerHTML = 'Nothing to download';
      }
      else
      {
        document.getElementById('messages').innerHTML = 'Success';
        document.getElementById('HiddenClick').href = sHref;
        document.getElementById('HiddenClick').click(); // Must enable Pop Ups for https://script.google.com
      }
    }
    
    function onFailure(error) 
    {
      document.getElementById('messages').innerHTML = error.message;
    }
    
    </script>
  </head>
  <body>
    <div id="messages">Waiting to DownLoad!</div>
    <div>
      <a id="HiddenClick" href="" target="_blank" onclick="google.script.host.close" style="visibility: hidden;">Hidden Click</a>
    </div>
    <div>
      <button type="button" onclick='callFetchGoogleDrive();' id="Fetch">Fetch Now!</button> 
    </div>
  </body>
</html>

code.gs

function doGet(e){
   var serveFile = e.parameter.servefile;
   var id = e.parameter.id;
   
   if(serveFile)
   {
     return downloadFile(id); // and Hyde
   }
   
  return HtmlService.createHtmlOutputFromFile('form.html'); // Jekyll
}

function fetchFromGoogleDrive() { // Jekyll
  var fileslist = DriveApp.searchFiles("your search criteria goes here + and trashed = false"); // the 'and trashed = false' prevents the same file being download more than once
  
  if (fileslist.hasNext()) {
    var afile = fileslist.next();
    var html = ScriptApp.getService().getUrl()+"?servefile=true&id="+afile.getId();
    return html;
  }
  else
  {
    return '';
  }
}
   
function downloadFile(id){ // and Hyde  
  try
  {
    var afile = DriveApp.getFileById(id);
  
    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);
    afile.setTrashed(true);
    return output;
  }
  catch (e) {
    return ContentService.createTextOutput('Nothing To Download')
  }
}

使い方

Googleドライブ(スタンドアロン)Web Appを使用して、ドライブからユーザーのローカルPC(ダウンロードフォルダ)にファイルを自動的にダウンロード(ポーリング)できます。

DriveAppは、ファイルの検索とダウンロードのためのメカニズムを提供します。しかし、ダウンロードメカニズムには、Google Appsが継承したクライアント/サーバーアーキテクチャのためにいくつかの重大な制限があります。 (Googleの不具合はありません)

サーバ側DriveAppは、クライアントがどこにいるのかという概念を持たず、サーバ自体にファイルをダウンロードすることが無意味であるため、ローカルPCにダウンロードする直接機能を提供しません。

サーバー側コードには、クライアント側コードにファイルデータまたはファイルへのリンクを提供するメカニズムが必要です。どちらのメカニズムも提供されていますが、前者からのデータはクライアント側のコードによって直接使用されることに限定されています。クライアントは、取得したデータをローカルPCに保存する仕組みがありません。したがって、Webページ自体にデータを表示するために使用できます。

2番目のメカニズムでは、スクリプトのURL(それ自体)またはドライブファイルのURLを返すことができます。ドライブファイルのURLは、クライアントブラウザでファイルをダウンロードするために直接使用することはできません。このURLをアンカーに置いて(クリックするだけで)、開いても実際には何もしません(おそらくファイルをオンラインで見ることを除いて)。

それはスクリプトのURLを残します。しかし、スクリプトのURLは、スクリプトではなく、ファイルを提供します。

ダウンロードを開始するには、Driveサービスからのファイルを、Googleオンラインガイドに示されているように、ContentService createTextOutputを使用してサーバーサイドスクリプトのdoGet / doPost関数から返す必要があります。しかしこれは、doGet / doPostによって返された結果によって生成されたWebページに他のUI要素が存在しないことを意味します。

これは私たちに非常に魅力的な解決策を残します。ページをダウンロードするユーザUI要素のない空白のWebページが閉じて、別のダウンロードが必要なときに手動で開く必要があります。

明らかに別のホスティングWebページは、この問題を解決するためにUIとWeb Appダウンロードスクリプトへのリンクを提供することができます。

このスクリプトでは、この問題を解決するためにDr Jekyll氏とHyde氏のアプローチを使用しています。

スクリプトがGET(doGet)へのパラメータなしでオープンされている場合は、デフォルトでフォームが表示されます。これは、公開されたアプリがユーザーによって最初に開かれたときの状態になります。この例で提供されるフォームは非常に簡単です。

パラメータがservefile = trueの状態でスクリプトを開くと、スクリプトはドライブファイルのダウンロードとして動作します。

クライアントサイドのjavascriptには、定期的にサーバーサイドスクリプトを呼び出してダウンロードする別のファイルの可用性をチェックするポーリングメカニズム(イベントタイマーsetInterval)が含まれています。

検索条件に一致するドライブファイルが見つかった場合にサーバーサイドスクリプトが実行されると、スクリプトのURLにパラメータが追加されたURLが返されます。

?servefile = true&id = the_id_of_the_google_drive_file

(*この単純な例の検索基準は、サーバーサイドスクリプトにハードコードされています。必要に応じてクライアントからサーバーに簡単に渡すことができます)。

この情報は、認識されたwithSuccessHandlerメカニズムを介して文字列としてクライアントに返されます。

クライアントのJavaスクリプトは、この返された情報で隠れたアンカーのHREFを更新し、アンカーを自動的にクリックします。

これにより、app / scriptの別の呼び出しが起動されます。アプリケーションの新しい呼び出しが起動すると、doGetはservefileパラメータを検出し、ユーザーインターフェイスを返す代わりにファイルをブラウザに返します。返されるファイルは、前述の検索によって以前に返された提供されたIDパラメータによって識別されるファイルになります。

提供されたIDを持つファイルがまだ存在する場合、それはダウンロードされ、アプリケーションの新しい呼び出しが閉じられ、最初の呼び出しでこのプロセスが繰り返されます。

ユーザー/テスターがタイマーを待つことに不便な場合、単純なインターフェースにボタンが提供されますが、それは必須ではなく、そうでなければ削除することができます。

シンプルなフォームはもちろん、必要に応じてより豊かなユーザーインターフェイスを提供するように拡張することもできます。ファイル検索基準を提供するなど。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow