Copiar carpetas y ficheros con Google Apps Script

 Con todo el tema del coronavirus se me ocurrió montar un script para facilitar la vida a los profesores que creo que puede ayudar a mucha más gente. Se basa en un script que permite copiar los contenidos de una carpeta (con jerarquía de carpetas y ficheros internos ) en una lista de carpetas (en mi caso, la lista de carpetas de los alumnos).

Esto permite copiar todo un conjunto de ficheros y carpetas a muchas carpetas diferentes. Os puedo asegurar que quita una gran cantidad de trabajo y que se puede usar en muchas situaciones.

Aquí tenéis el código:

function Copiar() 
{
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var tocopy       = DriveApp.getFolderById(sheet.getRange("B1").getValue().split("folders/")[1]);
  var parentfolder = DriveApp.getFolderById(sheet.getRange("B2").getValue().split("folders/")[1]);
  
  //Preparamos lista de ficheros a copiar
  var folders = tocopy.getFolders();
  var ToCopyArray = new Array();
  while ( folders.hasNext() )
  {
     var folder = folders.next();
     
     var files =  folder.getFiles();
     
     while( files.hasNext() )
     {
       var obj = new Object();
       
       obj.folder_name = folder.getName();
       obj.file        = files.next();
       ToCopyArray.push(obj);
     }
  }
  
  //Copiamos los ficheros
  var alumnos = parentfolder.getFolders();
  
  while(alumnos.hasNext())
  {
     var folder = alumnos.next();
     
     for(var i = 0 ; i < ToCopyArray.length ; ++i)
     {
        var name = ToCopyArray[i].folder_name;
        
        var existfolder = folder.getFoldersByName(name);
        
        var folder_to_be_copied = null;
        
        if( !existfolder.hasNext() )
        {
           folder_to_be_copied = folder.createFolder(name);
        }
        else
        {
           folder_to_be_copied = existfolder.next();
        }
        
        var file_name = ToCopyArray[i].file.getName();    
        
        var files = folder_to_be_copied.getFilesByName(file_name);
        
        if ( !files.hasNext() )
        {
          ToCopyArray[i].file.makeCopy(file_name, folder_to_be_copied);
        }
     }
  }
  
}

Aquí tenéis el link del documento para poder hacer las pruebas: script

Veréis que le he puesto un botón para ejecutar la función como expliqué en su momento

Cualquier duda que tengáis no vaciléis en hacermela llegar.

Nos vemos

2 comentarios:

  1. Me funcionó excelente muchas gracias!!! solo un detallito, si quisiera que fuera en varias carpetas, si le cambio el destino por ejemplo links de casillas 'b2:b4', solo copia los documentos en b2, como se podría generar lo otro?

    ResponderEliminar
  2. Muy bueno pero mira que no me copia todas las carpetas que será?

    ResponderEliminar

Tal vez te interese