Suche…


Einführung

Mit diesem einfachen Google App-Webskript (Standalone) kann Google Drive wiederholt aufgefordert werden, Dateien auf den lokalen PC des Benutzers herunterzuladen. Veranschaulicht die Verwendung eines App-Skripts zum Bereitstellen der Funktionen der beiden: 1. Benutzeroberfläche (in diesem Beispiel eine einfache) 2. Die Seite zum Herunterladen von Dateien. Für eine ausführlichere Erklärung der Funktionsweise lesen Sie das Beispiel "Funktionsweise".

Bemerkungen

Das Web Script muss veröffentlicht werden, damit es funktioniert.

Popups müssen für https://script.google.com aktiviert sein

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')
  }
}

Wie es funktioniert

Google Drive (Standalone) Web App zum automatischen Herunterladen (Poll) von Dateien auf den lokalen PC des Benutzers (Download Folder).

DriveApp bietet Mechanismen zum Suchen und Herunterladen von Dateien. Der Downloadmechanismus hat jedoch einige gravierende Einschränkungen aufgrund der von Google Apps übernommenen Client / Server-Architektur. (Keine Schuld von Google)

Die serverseitige DriveApp bietet keine direkte Funktion zum Herunterladen auf den lokalen PC, da der Server keine Vorstellung davon hat, wo sich der Client befindet. Das Herunterladen der Datei auf den Server selbst wäre bedeutungslos.

Der serverseitige Code benötigt einen Mechanismus, um dem Client-seitigen Code die Dateidaten oder einen Link zu einer Datei bereitzustellen. Beide Mechanismen sind vorgesehen, aber die Daten aus dem ersteren sind darauf beschränkt, vom clientseitigen Code direkt verwendet zu werden. Der Client hat keinen Mechanismus zum Speichern der Daten, die er einmal erhalten hat, auf dem lokalen PC. So können die Daten auf der Webseite selbst angezeigt werden.

Der zweite Mechanismus ermöglicht die Rückgabe der URL des Skripts (selbst) oder der URL der Drive-Datei. Die Laufwerksdatei-URL ist nicht sehr nützlich, da sie nicht direkt im Client-Browser zum Herunterladen der Datei verwendet werden kann. Wenn Sie diese URL in den Anker setzen (und darauf klicken), wird nur eine Webseite angezeigt, die sich öffnet, aber tatsächlich nichts tut (außer möglicherweise die Datei online anzeigen).

Das verlässt die Skript-URL. Die Skript-URL enthält jedoch nur das Skript und nicht die Datei.

Um einen Download zu initiieren, muss die Datei vom Drive-Dienst von der doGet / doPost-Funktion des serverseitigen Skripts mithilfe von ContentService createTextOutput genau wie in den Online-Handbüchern von Google angezeigt werden. Dies bedeutet jedoch, dass sich auf der Webseite kein anderes Oberflächenelement befinden kann, das durch die von doGet / doPost zurückgegebenen Ergebnisse generiert wird.

Dies lässt uns eine sehr unattraktive Lösung. Eine leere Webseite ohne Benutzeroberflächenelemente, die eine Seite herunterladen, wird geschlossen und muss manuell geöffnet werden, wenn ein weiterer Download erforderlich ist.

Offensichtlich könnte eine andere Hosting-Webseite die Benutzeroberfläche und den Link zum Skript für den Web App-Download bereitstellen, um dieses Problem zu beheben.

Dieses Skript verwendet einen Ansatz von Dr. Jekyll und Mr. Hyde, um dieses Problem zu lösen.

Wenn das Skript ohne Parameter für GET (doGet) geöffnet wird, zeigt es standardmäßig ein Formular an. Dies ist die Bedingung, wenn die veröffentlichte App zum ersten Mal von einem Benutzer geöffnet wird. Das in diesem Beispiel bereitgestellte Formular ist extrem einfach.

Wenn das Skript mit dem Parameter servefile = true geöffnet wird, verhält sich das Skript wie ein Download der Laufwerksdatei.

Das clientseitige Javascript enthält einen Abfragemechanismus (event timer setInterval), der in regelmäßigen Abständen ein serverseitiges Skript aufruft, um zu prüfen, ob eine andere Datei heruntergeladen werden kann.

Wenn das serverseitige Skript ausgeführt wird, wenn es eine Drive-Datei findet, die den Suchkriterien entspricht *, wird die URL des Skripts zurückgegeben, das die Parameter enthält:

? servefile = true & id = the_id_of_the_google_drive_file

(* Die Suchkriterien in diesem einfachen Beispiel sind hart in das serverseitige Skript codiert. Sie können bei Bedarf problemlos vom Client an den Server übergeben werden.)

Diese Informationen werden über den erkannten withSuccessHandler-Mechanismus als Zeichenfolge an den Client zurückgegeben.

Das Java-Skript des Clients aktualisiert dann die HREF eines verborgenen Ankers mit diesen zurückgegebenen Informationen und klickt dann automatisch auf den Anker.

Dies bewirkt, dass ein weiterer Aufruf der App / des Skripts gestartet wird. Wenn der neue Aufruf der App gestartet wird, erkennt doGet den Parameter servefile und gibt die Datei nicht an die Benutzeroberfläche zurück, sondern an den Browser. Die zurückgegebene Datei wird durch den angegebenen ID-Parameter identifiziert, der zuvor von der oben beschriebenen Suche zurückgegeben wurde.

Da die Datei mit der angegebenen ID noch vorhanden ist, wird sie heruntergeladen und der neue Aufruf der App wird geschlossen, wobei der erste Aufruf zum Wiederholen dieses Vorgangs verbleibt.

Eine Schaltfläche steht auf der einfachen Oberfläche zur Verfügung, wenn der Benutzer / Tester ungeduldig auf den Timer wartet, aber nicht benötigt wird und ansonsten entfernt werden kann.

Das einfache Formular kann natürlich erweitert werden, um bei Bedarf eine umfassendere Benutzeroberfläche bereitzustellen. B. die Dateisuchkriterien bereitstellen.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow