Recherche…


Introduction

Ce script Web simple de Google App permet à Google Drive d'être interrogé à plusieurs reprises pour que les fichiers soient téléchargés sur le PC local de l'utilisateur. Montre comment utiliser un script d'application pour fournir les fonctions suivantes: 1. Interface utilisateur (simple dans cet exemple) 2. La page de téléchargement de fichier. Pour une explication plus complète de son fonctionnement, lisez l'exemple "Comment ça marche".

Remarques

Le script Web doit être publié pour pouvoir fonctionner.

Les fenêtres contextuelles doivent être activées pour 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')
  }
}

Comment ça marche

Application Web de Google Drive (autonome) pour télécharger automatiquement (interroger) les fichiers du lecteur vers le PC local de l'utilisateur (dossier Télécharger).

DriveApp fournit des mécanismes pour rechercher et télécharger des fichiers. Cependant, le mécanisme de téléchargement présente de sérieuses limitations en raison de l'architecture client / serveur héritée par Google Apps. (Pas de faute de Google)

DriveApp côté serveur ne fournit pas de fonction directe à télécharger sur le PC local car le serveur n’a aucune idée de l’endroit où se trouve le client et le téléchargement du fichier sur le serveur lui-même n’aurait aucune signification.

Le code côté serveur a besoin d'un mécanisme pour fournir au code côté client les données du fichier ou un lien vers le fichier. Ces deux mécanismes sont fournis mais les données du premier sont limitées à être utilisées directement par le code côté client. Le client n'a aucun mécanisme pour enregistrer les données, une fois obtenues, sur le PC local. Ainsi, il peut être utilisé pour afficher les données sur la page Web elle-même.

Le second mécanisme permet de renvoyer l'URL du script (lui-même) ou l'URL du fichier Drive. L'URL du fichier Drive n'est pas très utile car elle ne peut pas être utilisée directement dans le navigateur client pour télécharger le fichier. Placer cette URL dans l'ancre (et en cliquant dessus) ne donne lieu qu'à une page Web qui s'ouvre mais qui ne fait rien (sauf éventuellement afficher le fichier en ligne).

Cela laisse l'URL du script. Cependant, l'URL du script ne fournit que le script et non le fichier.

Pour lancer un téléchargement, le fichier du service Drive doit être renvoyé par la fonction doGet / doPost du script côté serveur à l'aide de ContentService createTextOutput, exactement comme indiqué dans les guides en ligne de Google. Cependant, cela implique qu'il ne peut y avoir aucun autre élément d'interface utilisateur sur la page Web généré par les résultats renvoyés par doGet / doPost.

Cela nous laisse une solution très peu attrayante. Une page Web vierge sans éléments d'interface utilisateur qui télécharge une page, se ferme et nécessite une ouverture manuelle lorsqu'un autre téléchargement est requis.

De toute évidence, une autre page Web d'hébergement pourrait fournir l'interface utilisateur et le lien vers le script de téléchargement de l'application Web pour résoudre ce problème.

Ce script utilise une approche de Dr Jekyll et Mr Hyde pour résoudre ce problème.

Si le script est ouvert sans paramètres à GET (doGet), il affiche par défaut un formulaire. Ce sera la condition lorsque l'application publiée est ouverte pour la première fois par un utilisateur. Le formulaire fourni dans cet exemple est extrêmement simple.

Si le script est ouvert avec le paramètre servefile = true, le script se comporte comme un téléchargement de fichier Drive.

Le javascript côté client contient un mécanisme d'interrogation (minuterie d'événements setInterval) qui appelle périodiquement le script côté serveur pour vérifier la disponibilité d'un autre fichier à télécharger.

Lorsque le script côté serveur est exécuté s'il détecte un fichier de lecteur correspondant aux critères de recherche *, il renvoie l'URL du script lui-même ajouté aux paramètres:

? servefile = true & id = le_id_of_the_google_drive_file

(* Le critère de recherche dans cet exemple simple est codé en dur dans le script côté serveur. Il peut facilement être transmis du client au serveur si nécessaire.)

Ces informations sont renvoyées sous forme de chaîne au client via le mécanisme reconnu avec SuccèsHandler.

Le script Java client met alors à jour le HREF d'une ancre masquée avec ces informations renvoyées, puis clique automatiquement sur l'ancre.

Cela provoque un autre appel de l'application / script à lancer. Lorsque la nouvelle invocation de l'application lance le doGet, il détecte le paramètre servefile et au lieu de renvoyer l'interface utilisateur, il renvoie le fichier au navigateur. Le fichier renvoyé sera celui identifié par le paramètre ID fourni, précédemment renvoyé par la recherche décrite ci-dessus.

Étant donné que le fichier avec l'ID fourni existe toujours, il sera téléchargé et le nouvel appel de l'application se fermera, laissant la première invocation pour répéter ce processus.

Un bouton est fourni sur l’interface simple si l’utilisateur / le testeur est impatient d’attendre le temporisateur, mais ce n’est pas obligatoire et peut être supprimé.

Le formulaire simple peut bien sûr être étendu pour fournir une interface utilisateur plus riche si nécessaire. Comme fournir les critères de recherche de fichier.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow