Saltar hasta el contenido principal
Fco. Javier Lledó Fuster
Google Evangelist
Preguntado hace 4 meses

¿Cómo obtener el listado de archivos y carpetas (y subcarpetas) de mi Drive para operar con GAS? El objetivo es listarlo en una gSheet para poder gestionar owners, editors y viewers. Lo he conseguido con una función recursiva para recorrerlos pero tarda tanto que no alcanza a analizar todas. ¿Conocéis alguna función así o usáis alguna otra herramienta para ello?

Inscríbete en la comunidad GEG Spain para realizar preguntas y pedir ayuda a la comunidad.

Es un problema francamente interesante. Parece sencillo, pero teniendo en cuenta las limitaciones en el número y frecuencia de llamadas a la API y, sobre todo, en el tiempo máximo de ejecución de un script (6 minutos en cuentas personales, 30 en G Suite), la cosa se complica bastante, especialmente cuando se procesan de manera recursiva subcarpetas con un nivel indeterminado de profundidad. Para resolverlo de manera robusta es necesario recurrir a mecanismos basados en activadores por tiempo para dividir el proceso en bloques de ejecución dentro de los límites que fijan las cuotas de servicio y retomar la ejecución desde el último archivo procesado en caso de error / límite de tiempo. @Carlos Sánchez Martín4 no he examinado detenidamente el código de GitHub que enlazas, pero así a primera vista diría que no tiene todo esto en cuenta. ¿Lo has llegado a probar en esas circunstancias?

La implementación más robusta que he encontrado hasta el momento es la de CopyFolder4. Sirve para hacer backups de carpetas enteras, pero lógicamente para ello debe primero recorrerlas. Aquí9 el código.

He preparado el siguiente código recursivo, recopilando en un array todos los archivos y carpetas. 

function getFilesAndFoldersFromDrive(folderID){  
  
  var data = [];    
  
  var folder = DriveApp.getFolderById(folderID);
    
  return getChildFilesAndFolders(data, folder);
  
}
  

function getChildFilesAndFolders(data, folder) {
  
  data.push(folder);
  
  var files = folder.getFiles();
  
    while (files.hasNext()){
    
      data.push(files.next7());
      
    }  
  
  var folders = folder.getFolders();
  
  while (folders.hasNext()) {
    
    var folder = folders.next7();    
    
    var files = folder.getFiles();
    
      while (files.hasNext()){
    
        data.push(files.next7());
      
      }
                    
    getChildFilesAndFolders(data, folder);
  
  }
  
  return data;
  
}

Realmente es una función de entrada (getFilesAndFoldersFromDrive) a la que se le pasa una String con la ID de la carpeta padre, y esta función ya entra en la recursiva (getChildFilesAndFolders) que hace todo el recorrido. Lo que devuelve es un array con los archivos y carpetas.

Espero que os sirva!

P.S.- Si encontrárais alguna forma de optimizarlo o cualquier otra forma de hacer esta recopilación agradecería que me la comentárais.

Hola @Fco. Javier Lledó Fuster8 , puede que este script que hice para recorrer los ficheros de una carpeta te sirva, echa un vistazo.

/*
Función que nos obtiene en un hoja de cálculo todos los enlaces compartidos de los documentos que hay en una carpeta dada ID_Folder.

Pasos previos: 
1.- debemos compartir todos los ficheros de la carpeta, seleccionando todos, botón derecho, compartir.
2.- Debemos posicionarnos en la celda superior donde queremos que comience a rellenar el código y pulsar RUN/Ejecutar (play).
INPUT: debemos colocar el ID de la carpeta en la variable fldr

OUTPUT: obtiene los ids de los ficheros de la carpeta indicada y los coloca a partir de la posición que tengamos el cursor en una celda
*/

function GetShareablesLinksOfFolder() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getActiveSheet();
  var c = s.getActiveCell();
 
  //En la variable fldr ponemos el ID de la carpeta a examinar 
  var fldr = DriveApp.getFolderById("ID-Carpeta-xxxxxxxxxxxxx");
  
  var files=fldr.getFiles();
  var listaDeIDs=[],f,str;
  while (files.hasNext()) {
    f = files.next6();
   
    //obtenemos el ID del fichero
    // clase FILE - https://developers.google.com/apps-script/reference/drive/file4
    str = f.getName()  + '\n*' + f.getId()  ;
    //lo que mostramos en el excel
    listaDeIDs.push([str]);
  }
  // clase RANGE - https://developers.google.com/apps-script/reference/spreadsheet/range4
  listaDeIDs.sort();
  s.getRange(c.getRow(),c.getColumn(),listaDeIDs.length).setValues(listaDeIDs);
}