Ricerca…


introduzione

Questo semplice Script Web di Google Apps (Standalone) consente a Google Drive di ripetere il polling dei file da scaricare sul PC locale dell'utente. Mostra come utilizzare uno script app per fornire la funzione di entrambi: 1. Interfaccia utente (una semplice in questo esempio) 2. La pagina di download del file. Per una spiegazione più completa di come funziona leggi l'esempio "Come funziona".

Osservazioni

Il Web Script deve essere pubblicato per funzionare.

I pop up devono essere abilitati per 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')
  }
}

Come funziona

Google Drive (Standalone) Web App per scaricare automaticamente (Poll) i file da Drive al PC locale dell'utente (cartella di download).

DriveApp fornisce meccanismi per la ricerca e il download di file. Tuttavia, il meccanismo di download presenta alcune limitazioni gravi a causa dell'architettura client / server ereditata da Google Apps. (Nessuna colpa di Google)

Il lato server DriveApp non fornisce una funzione diretta per il download sul PC locale perché il server non ha idea di dove si trova il client e il download del file sul server stesso sarebbe privo di significato.

Il codice lato server richiede un meccanismo per fornire al codice lato client i dati del file o un collegamento al file. Entrambi questi meccanismi sono forniti ma i dati del primo sono limitati a essere usati direttamente dal codice lato client. Il client non ha alcun meccanismo per salvare i dati, una volta ottenuti, sul PC locale. Quindi può essere usato per visualizzare i dati sulla pagina web stessa.

Il secondo meccanismo consente di rinviare l'url dello script (stesso) o l'url del file di Drive. L'url del file di Drive non è molto utile in quanto non può essere utilizzato direttamente nel browser client per scaricare il file. Inserendo questo url in ancora (e facendo clic su di esso) si ottiene solo una pagina Web che si apre ma in realtà non fa nulla (tranne eventualmente visualizzare il file online).

Questo lascia l'url dello script. Tuttavia l'url dello script fornisce solo lo script e non il file.

Per avviare un download, il file dal servizio Drive deve essere restituito dalla funzione doGet / doPost dello script lato server utilizzando ContentService createTextOutput esattamente come mostrato nelle guide online di Google. Tuttavia questo implica che non ci può essere nessun altro elemento dell'interfaccia utente sulla pagina web generata dai risultati restituiti da doGet / doPost.

Questo ci lascia con una soluzione molto poco attraente. Una pagina Web vuota senza elementi utente dell'interfaccia utente che scarica una pagina, si chiude e richiede l'apertura manuale quando è richiesto un altro download.

Ovviamente un'altra pagina web di hosting potrebbe fornire l'interfaccia utente e il collegamento allo script di download di app Web per risolvere questo problema.

Questo script utilizza un approccio di Dr. Jekyll e Mr Hyde per risolvere questo problema.

Se lo script viene aperto senza parametri per GET (doGet), per impostazione predefinita viene visualizzato un modulo. Questa sarà la condizione in cui l'app pubblicata viene aperta per la prima volta da un utente. Il modulo fornito in questo esempio è estremamente semplice.

Se lo script viene aperto con il parametro servefile = true, lo script si comporta come download di file di Drive.

Il lato client javascript contiene un meccanismo di polling (timer evento setInterval) che periodicamente richiama lo script lato server per verificare la disponibilità di un altro file da scaricare.

Quando lo script lato server viene eseguito se trova qualsiasi file di Drive che corrisponde ai criteri di ricerca * restituisce l'URL dello script stesso aggiunto ai parametri:

? Servefile = true & id = the_id_of_the_google_drive_file

(* I criteri di ricerca in questo semplice esempio sono codificati nello script lato server e possono essere facilmente passati dal client al server se necessario).

Questa informazione viene restituita come stringa al client tramite il meccanismo riconosciuto withSuccessHandler.

Lo script java del client aggiorna l'HREF di un'ancora nascosta con queste informazioni restituite e quindi fa clic sull'ancora automaticamente.

Ciò causa l'avvio di un'altra chiamata dell'app / script. Quando la nuova chiamata dell'app viene avviata, doGet rileverà il parametro servefile e invece di restituire l'interfaccia utente restituirà il file al browser. Il file restituito sarà quello identificato dal parametro ID fornito precedentemente restituito dalla ricerca sopra descritta.

Dato che il file con l'ID fornito esiste ancora, verrà scaricato e la nuova chiamata dell'app si chiuderà lasciando la prima chiamata a ripetere questo processo.

Sull'interfaccia semplice viene fornito un pulsante se l'utente / tester diventa impaziente di attendere il timer ma non è necessario e può essere rimosso.

La semplice forma può naturalmente essere estesa per fornire un'interfaccia utente più ricca se necessario. Come fornire i criteri di ricerca del file.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow