Como obtener los ficheros de una carpeta con Google Apps Script


 En muchas ocasiones cuando programamos en Google Apps Script podemos necesitar obtener los ficheros que hay en una carpeta ya sea para analizarlos,  copiarlos o crear nuevos ficheros.

El código que os mostraré es muy sencillo pero lo suficientemente potente para que podáis montar vuestra gestión de ficheros con Google Apps Script como necesitéis.

Lo primero es repasar un poco la base de como acceder a ficheros y carpetas con Google Apps Script:

function GetFolder()
{
  //Opcion1: Sabemos el id del folder
  var folder = DriveApp.getFolderById("XXXYYYZZZZ");
  
  //Opcion2: Obtenemos todos los folders
  var folders = DriveApp.getFolders();
  
  //Opcion3: Obtenemos todos los folders con un cierto nombre
  var folders = DriveApp.getFoldersByName("bllbalabbla");
  
  //En la opcion 2 y 3 obtenedremos un iterador.
  //Si queremos el primer folder de la lista solo tendriamos que hacer esto
  if(folders.hasNext())
  {
    folder = folders.next();
  }
  
  //NOTA: Podríamos hacer operaciones en todos los folders de la lista de esta manera
  /*
  while(folders.hasNext())
  {
     var folder = folders.next();
     
     //Aqui hariamos lo que quisieramos con cada folder
  }
  */
  
  return folder;
}

function GetFiles()
{
   var folder = GetFolder();
   
   //OPCION1: Sabemos el id del file que queremos obtener
   var file = DriveApp.getFileById("XXXXXX");
   
   //OPTION2: Obtenemos todos los ficheros con un cierto nombre
   var files = DriveApp.getFilesByName("blalblablbl");
   
   //OPTION3: Obtenemos todos los ficheros de un cierto tipo ( pdf, csv, docs,sheets, etc..)
   var files = DriveApp.getFilesByType(MimeType.PDF);
   
  //En la opcion 2 y 3 obtenedremos un iterador.
  //NOTA: Podriamos hacer operaciones en todos los files de la lista de esta manera
  /*
  while(files.hasNext())
  {
     var file = files.next();
     
     //Aqui hariamos lo que quisieramos con cada file
  }
  */
  
  //Todas estas opciones se pueden hacer cambiando DriveApp por un folder
  /*
  var files = folder.getFilesByName("blalblablbl");
  var files = folder.getFilesByType(MimeType.PDF);
  */
}


Una vez esto lo tenemos claro os dejo un código que os permitirá obtener todos los ficheros de una carpeta de forma recursiva ( es decir, irá abriendo todas las carpetas que haya dentro para ir buscando hasta el último fichero:


function TestRecursive()
{
   var folder = DriveApp.getFolderById("XXXXXXXXX");
   GetFilesRecursive(folder);
}

function GetFilesRecursive(folder)
{
   var folders = folder.getFolders();
   while(folders.hasNext())
   {
     var f = folders.next();
     GetFilesRecursive(f);
   }
   
   var files = folder.getFiles();
   while(files.hasNext())
   {
     var f = files.next();
     Logger.log(f.getName());
   }
}

Espero que os sirva, no vaciléis en hacerme llegar vuestras dudas

Nos vemos


8 comentarios:

  1. Muy util e interesante el último ejemplo para poder recuperar todo los ficheros de una carpeta de forma recursiva. Lo que no logro realizar, es enviar los datos a una Spreadsheet. Agradezco tus consejos

    ResponderEliminar
    Respuestas
    1. Creo q este link te irá bien: https://www.tutorialesgoogleappscripts.com/p/como-usar-google-apps-scripts-en-hojas.html Los primeros artículos son los más básicos y creo q son los que más te ayudarán. Cualquier cosa, ya lo sabes.

      Eliminar
    2. Necesito traer a una hoja de calculo todos los archivos que hay en una carpeta y sus subcarpetas, arme el script pero solo pero solo me trae los archivos de la carpeta no logro que me traiga los archivos de las subcarpetas.

      function ObtenerArchivos()
      {
      var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("hoja1");
      var cabecera = sheet.getRange("A1:C1");
      var titulos = cabecera.setValues([["Nombre","Dirección URL","Tipo"]]);
      var folder = DriveApp.getFolderById("XXXXX");
      var folders = folder.getFolders();
      while(folders.hasNext())
      {
      var f = folders.next();

      }

      var files = folder.getFiles();
      var i = 1;
      while (files.hasNext()) {
      var file = files.next();
      sheet.getRange(i+1, 1, 1, 3).setValues([[file.getName(),file.getUrl(),file.getMimeType()]]);
      i++;

      }
      }

      Eliminar
    3. Por lo que me parece entender, no estas haciendo nada con las carpetas. Fijate que en el while de folders.hasNext() no estás haciendo nada. Por lo tanto, solo te obtendrá los ficheros de la carpeta principal. Has de llamar a la función de forma recursiva pasandole una carpeta a la función. Vuelvete a mirar el código del post y verás q está diferente de como lo tienes. Avisame si no lo ves claro. Nos vemos!

      Eliminar
  2. Buenas cracks!
    El script va a las mil maravillas, he creado uno para que se liste todos los datos de una carpeta en una hoja de cálculo donde se muestra el nombre del archivo, la url del archivo y la fecha, PERO se me duplican todos los archivos cada vez que le doy.
    Habría alguna manera para hacer que los que ya estan en el listado no los cuente? o que autoelimine la versión más antigua, algo así?
    Gracias!

    ResponderEliminar
    Respuestas
    1. Hola, disculpa por la tardanza en responder, voy superliado.
      Sin saber exactamente tu código como está se me hace difícil darte una solución genérica, pero en principio podrías mirar si el fichero ya existe y borrarlo primero.
      Para obtenerlos DriveApp.getFilesByName("blalblablbl");
      Y para borrarlos con marcarlos como trashed ya los tendrías eliminados.
      Si te sigue dando problemas copia el código y le echo un ojo.

      Eliminar
    2. Este comentario ha sido eliminado por el autor.

      Eliminar
    3. Muchas gracias por responder!
      Mejor copio el codigo ;)
      1. que solo liste ficheros añadidos posteriormente que no esten listados (sin borrar los que estan listados, obviamente)
      2. Poner en appendRow a parte del nombre, url y fecha, el tipo de archivo (FileType?) y si se puede tamaño en Mb


      function GrotesK() {

      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getActiveSheet();
      var timezone = ss.getSpreadsheetTimeZone();

      // Archivos añadidos en las ultimas 24h
      var today = new Date();
      var oneDayAgo = new Date(today.getTime() - 1 * 24 * 60 * 60 * 1000);
      var startTime = oneDayAgo.toISOString();

      // Busqueda archivos
      var search = '(trashed = true or trashed = false) and (modifiedDate > "' + startTime + '")';
      var folder = DriveApp.getFolderById("blaBlaBla");
      var folders = folder.getFolders();
      while(folders.hasNext())
      {
      var file = files.next();
      var fileName = file.getName();
      var fileURL = file.getUrl();
      var dateCreated = Utilities.formatDate(file.getDateCreated(), timezone, 'yyyy-MM-dd HH:mm');

      sheet.appendRow([dateCreated, fileName, fileURL]);
      var f = folders.next();
      }

      var files = folder.getFiles();
      while(files.hasNext())
      {
      var file = files.next();
      var fileName = file.getName();
      var fileURL = file.getUrl();
      var dateCreated = Utilities.formatDate(file.getDateCreated(), timezone, 'yyyy-MM-dd HH:mm');

      sheet.appendRow([dateCreated, fileName, fileURL]);

      }
      var files = folder.searchFiles(search);
      }

      Eliminar

Tal vez te interese