Saltar al contenido

Creación de un archivo zip dentro de Google Drive con Apps Script

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!

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *