Buscar..


Introducción

Esta sencilla aplicación web de Google Script (independiente) permite que Google Drive se vuelva a sondear para que los archivos se descarguen en la PC local del usuario. Muestra cómo usar un script de aplicación para proporcionar la función de: 1. La interfaz de usuario (una simple en este ejemplo) 2. La página de descarga de archivos. Para una explicación más completa de cómo funciona, lea el Ejemplo "Cómo funciona".

Observaciones

El Web Script debe ser publicado para que funcione.

Los complementos deben estar habilitados para 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>

código.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')
  }
}

Cómo funciona

Google Drive (Standalone) Web App para descargar automáticamente (Sondeo) archivos desde Drive a la PC local del usuario (Carpeta de descarga).

DriveApp proporciona mecanismos para buscar y descargar archivos. Sin embargo, el mecanismo de descarga tiene algunas limitaciones importantes debido a la arquitectura cliente / servidor que heredó Google Apps. (No es culpa de Google)

El lado del servidor DriveApp no ​​proporciona una función directa para descargar a la PC local porque el servidor no tiene idea de dónde está el cliente y la descarga del archivo al servidor en sí no tendría sentido.

El código del lado del servidor necesita un mecanismo para proporcionar al código del lado del cliente los datos del archivo o un enlace al archivo. Se proporcionan estos dos mecanismos, pero los datos del primero se limitan a ser utilizados directamente por el código del lado del cliente. El cliente no tiene ningún mecanismo para guardar los datos, una vez obtenidos, en la PC local. Por lo tanto, se puede utilizar para mostrar los datos en la propia página web.

El segundo mecanismo permite que la url de la secuencia de comandos (en sí) o la url del archivo de Drive se devuelva. La URL del archivo de Drive no es muy útil ya que no se puede usar directamente en el navegador del cliente para descargar el archivo. Colocar esta URL en el ancla (y hacer clic en ella) solo da como resultado una página web que se abre pero que en realidad no hace nada (excepto posiblemente ver el archivo en línea).

Eso deja el script url. Sin embargo, la URL del script solo proporciona el script y no el archivo.

Para iniciar una descarga, el archivo del servicio Drive debe devolverse desde la función doGet / doPost de la secuencia de comandos del lado del servidor utilizando ContentService createTextOutput exactamente como se muestra en las guías en línea de Google. Sin embargo, esto implica que no puede haber ningún otro elemento de UI en la página web generado por los resultados devueltos por doGet / doPost.

Esto nos deja con una solución muy poco atractiva. Una página web en blanco sin elementos de usuario de la interfaz de usuario que descarga una página, se cierra y requiere que se abra manualmente cada vez que se requiera otra descarga.

Obviamente, otra página web de alojamiento podría proporcionar la IU y el enlace al script de descarga de la aplicación web para resolver este problema.

Este script utiliza un enfoque del Dr. Jekyll y Mr Hyde para resolver este problema.

Si el script se abre sin parámetros para GET (doGet), entonces se muestra de forma predeterminada un formulario. Esta será la condición cuando la aplicación publicada se abra por primera vez por un usuario. La forma proporcionada en este ejemplo es extremadamente simple.

Si el script se abre con el parámetro servefile = true, entonces el script se comporta como una descarga de archivos de Drive.

El javascript del lado del cliente contiene un mecanismo de sondeo (temporizador de eventos setInterval) que periódicamente llama al script del lado del servidor para verificar la disponibilidad de otro archivo para descargar.

Cuando se ejecuta el script del lado del servidor si encuentra algún archivo de Drive que coincida con los criterios de búsqueda *, devuelve la url del script adjunto con los parámetros:

? servefile = true & id = the_id_of_the_google_drive_file

(* Los criterios de búsqueda en este ejemplo simple están codificados en la secuencia de comandos del lado del servidor. Si es necesario, podrían pasar fácilmente del cliente al servidor).

Esta información se devuelve como una cadena al cliente a través del mecanismo reconocido con SucursHandler.

La secuencia de comandos java del cliente luego actualiza el HREF de un ancla oculta con esta información devuelta y luego hace clic en el ancla automáticamente.

Esto hace que se inicie otra invocación de la aplicación / script. Cuando se inicie la nueva invocación de la aplicación, doGet detectará el parámetro de archivo de servicio y, en lugar de devolver la interfaz de usuario, devolverá el archivo al navegador. El archivo devuelto será el identificado por el parámetro de ID proporcionado que fue previamente devuelto por la búsqueda descrita anteriormente.

Dado que el archivo con el ID proporcionado todavía existe, se descargará y la nueva invocación de la aplicación se cerrará, quedando la primera invocación para repetir este proceso.

Se proporciona un botón en la interfaz simple si el usuario / probador se muestra impaciente por esperar el temporizador, pero no es necesario y, de lo contrario, puede eliminarse.

Por supuesto, la forma simple puede extenderse para proporcionar una interfaz de usuario más rica si es necesario. Tales como proporcionar los criterios de búsqueda de archivos.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow