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
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
ResponderEliminarCreo 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.
EliminarNecesito 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.
Eliminarfunction 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++;
}
}
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!
EliminarBuenas cracks!
ResponderEliminarEl 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!
Hola, disculpa por la tardanza en responder, voy superliado.
EliminarSin 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.
Este comentario ha sido eliminado por el autor.
EliminarMuchas gracias por responder!
EliminarMejor 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);
}