Solución:
De hecho, es incluso más fácil que eso. Los archivos ya son Blobs (cualquier cosa que tenga getBlob () se puede pasar a cualquier función que espere Blobs). Entonces el código se ve así:
var folder = DocsList.getFolder('path/to/folder');
folder.createFile(Utilities.zip(folder.getFiles(), 'newFiles.zip'));
Además, no funcionará si tiene varios archivos con el mismo nombre en la carpeta … Las carpetas de Google Drive lo admiten, pero los archivos Zip no.
Para que esto funcione con varios archivos que tienen el mismo nombre:
var folder = DocsList.getFolder('path/to/folder');
var names = {};
folder.createFile(Utilities.zip(folder.getFiles().map(function(f){
var n = f.getName();
while (names[n]) { n = '_' + n }
names[n] = true;
return f.getBlob().setName(n);
}), 'newFiles.zip'));
Como DocsList
ha quedado obsoleto, puede utilizar el siguiente código para comprimir una carpeta completa que contiene archivos y subcarpetas y también mantener su estructura:
var folder = DriveApp.getFolderById('<YOUR FOLDER ID>');
var zipped = Utilities.zip(getBlobs(folder, ''), folder.getName()+'.zip');
folder.getParents().next().createFile(zipped);
function getBlobs(rootFolder, path) {
var blobs = [];
var files = rootFolder.getFiles();
while (files.hasNext()) {
var file = files.next().getBlob();
file.setName(path+file.getName());
blobs.push(file);
}
var folders = rootFolder.getFolders();
while (folders.hasNext()) {
var folder = folders.next();
var fPath = path+folder.getName()+"https://foroayuda.es/";
blobs.push(Utilities.newBlob([]).setName(fPath)); //comment/uncomment this line to skip/include empty folders
blobs = blobs.concat(getBlobs(folder, fPath));
}
return blobs;
}
getBlobs
La función crea una matriz de todos los archivos en la carpeta y cambia el nombre de cada archivo a su ruta relativa para mantener la estructura cuando se comprime.
Para comprimir una carpeta que contiene varios elementos con el mismo nombre, utilice este getBlob
función:
function getBlobs(rootFolder, path) {
var blobs = [];
var names = {};
var files = rootFolder.getFiles();
while (files.hasNext()) {
var file = files.next().getBlob();
var n = file.getName();
while(names[n]) { n = '_' + n }
names[n] = true;
blobs.push(file.setName(path+n));
}
names = {};
var folders = rootFolder.getFolders();
while (folders.hasNext()) {
var folder = folders.next();
var n = folder.getName();
while(names[n]) { n = '_' + n }
names[n] = true;
var fPath = path+n+"https://foroayuda.es/";
blobs.push(Utilities.newBlob([]).setName(fPath)); //comment/uncomment this line to skip/include empty folders
blobs = blobs.concat(getBlobs(folder, fPath));
}
return blobs;
}
Pude usar el código que publicó @Hafez, pero necesitaba modificarlo porque no me funcionaba. Agregué las primeras tres líneas porque necesitaba la ID de la carpeta, que es un valor de cadena y no es el nombre de la carpeta.
var folderName = DriveApp.getFoldersByName("<folderName>");
var theFolder = folderName.next();
var folderID =theFolder.getId();
var folder = DriveApp.getFolderById(folderID);
var zipped = Utilities.zip(getBlobs(folder, ''), folder.getName()+'.zip');
folder.getParents().next().createFile(zipped);
function getBlobs(rootFolder, path) {
var blobs = [];
var files = rootFolder.getFiles();
while (files.hasNext()) {
var file = files.next().getBlob();
file.setName(path+file.getName());
blobs.push(file);
}
var folders = rootFolder.getFolders();
while (folders.hasNext()) {
var folder = folders.next();
var fPath = path+folder.getName()+"https://foroayuda.es/";
blobs.push(Utilities.newBlob([]).setName(fPath)); //comment/uncomment this line to skip/include empty folders
blobs = blobs.concat(getBlobs(folder, fPath));
}
return blobs;
}
Lo único extraño que estoy experimentando es que cuando ejecuto el script dice TypeError: Cannot call method "getFiles" of undefined. (line 10, file "Code")
. Cuando miré el lugar donde vive este script, también había 5 archivos zip que estaban completos. Funciona pero sigo recibiendo ese error. Extraño … pero este código funciona para mí. Gracias a todos en este hilo. ¡Salud!