Cómo crear ficheros y carpetas con Google Apps Script

Este artículo se ha usado para el proyecto : Organizador de emails

Una de las utilidades más potentes que tiene GAS es que permite crear ficheros y carpetas dentro de nuestro google drive que después podemos descargarnos o compartirlo o hacer lo que queramos con el.

Esto nos permite tener grandes cantidades de información en diversas hojas de cálculo y compilarlas en un solo documento cuando queramos. Aunque no lo parezca, la potencia de esta característica es impresionante.

Su funcionamiento es extremadamente sencillo. Con un simple ejemplo se puede observar como funciona.

function EjemploCarpetasyFicheros()
{
    var folder = DriveApp.createFolder("Ejemplo Carpeta principal");
    var sub_folder = folder.createFolder("Ejemplo Carpeta secundaria");
    folder.createFile("FicheroPrincipal.txt","Aquí ponemos el contenido del fichero principal");
    sub_folder.createFile("FicheroSecundario.txt","Aquí ponemos el contenido del fichero secundario");
}

Si ejecutas este código verás como se crea una carpeta en tu raíz de Google Drive que podrás descargar sin problemas.



Con esta base tienes todo lo necesario para empezar a exportar la información de tus documentos de drive a otros formatos más amigables.

34 comentarios:

  1. Hi,
    Do you know where i can find a script that does the following:
    -After i apply a certain label to a gmail message, the script must create a new folder in google drive named "date of the message + time". Then the email message is converted to PDF and both message and attachments are inserted in that folder.
    Why This?
    To share emails regarding a specific subjet. I know there are scripts that do almost what i intended to do, but they lack the ability to create a google drive folder with the specific name that i described.
    For example, lets say i´m working on Project A. I receive a email and label it "Project A". This email and its attachments will then go to a existing and shared folder in google drive called "Project A-Emails". But of course is not practical to have several emails and its attachments mixed inside "Project A-Emails" google drive folder, so, it is necessary that a folder is automatically created and named with the date and time of the email message
    .Any help will be much appreciated

    ResponderEliminar
    Respuestas
    1. I dont know where u cand find this type of information, but i'm sure that It can be done and it sounds like a great and interesting project.

      Let me try to do it and post it

      Give me a few time and I try to do it.

      Regards

      Eliminar
    2. Bruno, for u... we start the project http://googleappscriptsweb.blogspot.com.es/2015/11/como-guardar-y-organizar-emails-dentro.html

      Eliminar
  2. hola buen ayuda pero una pregunta puedo desde el editor de secuencia de comandos crear archivos como: hojas de calculo o google documentos y si es posible como podría hacerse gracias de antemano xD

    ResponderEliminar
    Respuestas
    1. No es complicado...lo que voy hasta los topes de trabajo para poder hacer un tutorial sobre el tema ahora mismo... me tendrias que dar un poco de tiempo, aunque ya te digo que no es complicado...

      Eliminar
  3. Hola Pako, muy buen aporte.
    Sabes si se puede hacer un script para generar un csv de una hoja pero que se descargue? Lo he conseguido pero solo en Google drive.

    Saludos

    ResponderEliminar
    Respuestas
    1. Creo que descargarse automaticamente no puedes, lo que si que puedes hacer es una pequeña trampa :). Si no recuerdo mal, desde html, si estas haciendo una web, si pones el link al documento se te descargará. Desde GAS no creo que puedas hacer nada directametne para que se descargue.

      Eliminar
  4. Muy claro el ejemplo

    Una duda de un principiante... usando "folder", cómo puedo decir que los ficheros que genero mediante un script, sean todos creados en una carpeta del drive concreta? y no en el raiz, que es donde los crea...

    Muchas gracias y salu2

    ResponderEliminar
    Respuestas
    1. Prueba con folder.CreateFile . Si pillas la variable que contiene el folder y le das al punto te saldra un listado de funciones q puedes realizar. Una de ellas es crear un fichero directamente dentro del folder. Otra manera seria moviendolos, pero si tienes muchos ficheros acostumbra a tardar una barbaridad, así que si puedes usa mejor la primera opción. Nos vemos

      Eliminar
  5. Buenas tardes, consulta como hago para que esa carpeta que genera, tome el nombre de una celda completada previamente, y se guarde el spreadsheet dentro de ella?.. y a la vez que esa carpeta se genere dentro de una carpeta compartida.

    ResponderEliminar
    Respuestas
    1. Buenas, Lo has intentado?

      El cambio de nombre de la carpeta es sencillo. Veras que en el objeto folder hay una función de setName para poder cambiar el nombre.

      Para tener una carpeta dentro de otra la forma más fácil es crear la carpeta dentro de la otra directamente (createFolder)

      Espero que con esto tengas pistas de como ir tirando.

      Nos vemos

      Eliminar
  6. Buen día, podría ayudarme con un script que me permita crear Folders y SubFolders usando información de una hoja de cálculo. Las dependencias parentales se definen en una hoja de Google Sheets. Si la carpeta ya existe, no crear, si el nombre ha cambiado, entonces renombrar (esto sucederá si se ejecuta de nuevo el script y han habido cambios en la información del sheet).

    Que todo se construya en el Google Drive a partir de FolderParent_Name y FolderParent_ID.
    La tercera columna es el nombre del folder que se creará, definido por NewFolder_Name.
    La cuarta columna NewFolder_ID se llena automáticamente con el ID de cada folder creado.
    Las columnas que se manejan en excel son:
    FolderParent_Name, FolderParent_ID, NewFolder_Name, NewFolder_ID

    ResponderEliminar
    Respuestas
    1. Hola Marvin,

      Te diré lo mismo que digo siempre: si tienes dudas ponlas en el blog y te intentaré ayudar en todo lo que pueda, pero si tienes peticiones de proyectos algo deberé cobrar ( tengo alergia a trabajar gratis :) ). Si te interesa, con este link podrás acceder a Fiverr y puedo hacerte un proyecto a través de ahí : http://www.fiverr.com/s2/bbb67c5713

      Nos vemos!

      Eliminar
  7. consulta lo hice ese codigo para subir el archivo al driver pero estaba intentando de subir con un pdf y capturado desde formulario funciona todo bien pero cuando voy a verificar desde driver me sale un pdf en blanco porque sera?

    ResponderEliminar
    Respuestas
    1. Generalmente cuando sale un PDF en blanco es por que rellenas la informacion en un spreadsheet y lo exportas a PDF antes que a Google le de tiempo a guardar la información en el spreadsheet.

      Solución: Antes de generar el PDF asegurate de llamar a SpreadsheetApp.flush(). Esto fuerza que los datos del spreadsheet se guarden.

      Si es doc, recuerda que has de hacer un SaveAndClose() al documento.

      Si ni así te funciona, a veces ( muy raramente ) puede ser necesario un pequeño sleep, aunque ya te digo que este caso lo veo improbable, ya contarás como va.

      Nos vemos

      Eliminar
  8. Hola cordial saludo, super script para crear carpetas y subcapets1, ahora como hago para crear dos capetas en la subcaperta3 y la subcarperta2 dejarla vacia, gracias por su apoyo ej: carperta prinicpal prueba1 que contiene subcarpertas pruebax y pruebay , pero en para subcarpeta pruebay necesito 3 carpertas cuota1 cuota 2 y cuota 3: NOta pruebax debe quedar vacia. Mil gracias por su apoyo

    ResponderEliminar
    Respuestas
    1. Lo has probado a hacerlo? Tienes algo de código ?

      Recordad que yo intento ayudar a todo el mundo pero no trabajo gratis.

      Intentalo y si tienes problemas dimelo e intentaré ayudarte.

      Si lo que quieres es que desarrollo codigo tal vez te interese más contratarme: https://docs.google.com/spreadsheets/d/1twExt2DlyqfDpZU64ItlKHjlxNV0lPJKKoT-JVMwG9k/edit#gid=1492985157

      Nos vemos

      Eliminar
  9. Buen día, estoy realizando un formulario para subir archivos y guardar los enlaces en una sheet, el problema es que quiero que se guarden en una carpeta específica, ya que el form crea su propia carpeta para cada archivo, es posible que se realice este proceso desde que se sube por primera vez?, o tengo que realizar una función para que copie o mueva los archivos que se subieron a la carpeta correspondiente?
    tendrás algún ejemplo??.
    Gracias

    ResponderEliminar
    Respuestas
    1. Hola buenas,

      Sinceramente creo que la única manera es copiarlo una vez se ha subido, pero tampoco lo tengo claro.

      Me lo apunto y cuando tengo un rato te digo algo

      Nos vemos

      Eliminar
    2. He estado probandolo y a mi al menos me genera una carpeta con todos los ficheros que se van subiendo, independientemente de los usuarios que lo suban. No estoy experimentando el problema que tu tienes. Si quieres , ponte en contacto conmigo y lo hablamos con más calma: https://googleappscriptsweb.blogspot.com/p/como-contratar-mis-servicios-de.html

      Eliminar
  10. Hola, y como puedo eliminar una carpeta?

    ResponderEliminar
    Respuestas
    1. Algo como esto? https://www.tutorialesgoogleappscripts.com/2020/11/como-borrar-ficheros-y-carpetas-con-google-apps-script.html

      Eliminar
  11. quiero hacer que de un Google sheet donde existan usuarios con 3 componentes (ejemplo: “jakson leal, componente A, componente B, componente C”) quiero buscar entre todos y el usuario que tenga el “componente B” pues irme a la carpeta de Google drive de ese usuario y extraerle la carpeta del “componente B”, pues existe en drive una carpeta que por dentro tiene mas carpetas con todos los usuarios.
    utilizo el siguiente codigo pero me da error:
    function EjemploCarpetasyFicheros()
    {

    var usuario = Sheets.Spreadsheets.Values.get("1YIi-llknARBv5mY-Y7MaOUIMUVn2o3So", "E2:E4");

    for(var i = 0; i < usuario.values.length; i++){

    var dir = DriveApp.getFolderById("1VivCdK13pi9AyLHcoco6XOd65sFAIavC");
    var folder = dir.createFolder("ejemplo"+i);
    var file = folder.createFile("FicheroPrincipal.txt", Sheets.Spreadsheets.Values.get('1s_6IgK5fBY4m-nMz_GSashYGoQ7MvrYU', 'E2:E3'));

    }
    }

    el archivo de apps script lo creo dentro del drive (una carpeta que tiene el sheet, la carpetac on los usuarios, el archivo de apps script), agradecería tu
    ayuda.

    ResponderEliminar
    Respuestas
    1. Me da miedo no acabar de entenderte.
      Lo que quieres es un sistema que te borre selectivamente carpetas dentro de carpetas? O que las cree? Intenta explicarme un poco más paso a paso lo que quieres y puedo intentar ayudarte

      Nos vemos

      Eliminar
    2. mande otro codigo que no era, pero es un script que busque en un sheet y tome solo los usuarios que tiene cierta casilla verificada, cuando encuentre un usuario que tenga esa casilla pues se valla a una carpeta que tengo en drive y busque la carpeta de ese usuario para que la extraiga, el sheet y la carpeta que tiene las carpetas con lso nombres de los usuarios los tengo en una misma direccion.

      Eliminar
    3. Te lo intento mirar para mañana a ver si puedo. Puedes mandar el código que has intentado?

      Eliminar
    4. function prueba(){

      var nombre = 0;
      var visita1 = 2;
      var visita2 = 4;
      var visita3 = 6;
      var visita4 = 8;

      var sheet = SpreadsheetApp.openById('12Fh4s5kaWW6MrzYMAyVeFipiRDOGe9Mj62hBkXvxdHQ').getSheets();
      var data = sheet[0].getDataRange().getValues();

      for(var i = 0; i < 1; i ++){
      //var fila = data[i][2];
      //Logger.log(fila);

      if(data[i][visita1] = "4"){

      //Logger.log("melos vista 1");
      }
      if(data[i][visita2]= "4"){

      //Logger.log("melos vista 2");
      }
      if(data[i][visita3]= "4"){
      //.moveTo(DriveApp.getFolderById("1JXOnTas6-X1C_UMKyaosKUskpnCGKCML"));
      //var folderId = DriveApp.getFileById('1ZxbM99Vz9zbPtwXeMo6iiKx1dxF-IffK').makeCopy().getId();
      var documentId = DriveApp.getFoldersByName(data[1][0].toString());
      documentId.next().getFoldersByName("VISITA UNO").next().moveTo(DriveApp.getFolderById("1JXOnTas6-X1C_UMKyaosKUskpnCGKCML"));

      //Logger.log(data[1][0]);
      //DriveApp.getFileById(folderId).setName("joder! que gran historia, casi lloro.");
      //Logger.log("melos vista 3");
      }
      if(data[i][visita4]= "4"){

      //Logger.log("melos vista 4");
      }
      }

      }

      con ese codigo hice pruebas, encontre que no se pueden hacer copias de carpetas que es lo que necesito pero si se pueden mover con la funcion "MoveTo", este codigo lo ejecuto en drive con la sheet api habilitada.

      Eliminar
  12. Buenas,
    como se puede crear una carpeta con el valor de una celda como nombre?;
    Ejemplo: cada vez que creo un cliente, dandole a un botón que se cree una carpeta en drive con el nombre del cliente de una sheet.
    gracia y un saludo.
    Hice experimentos con el codigo

    ResponderEliminar
  13. Me podrías apoyar como puedo sobre escribir un archivo pdf ya creado? Vaya estoy genera ya el PDF pero quisiera que al generar el próximo PDF no generara uno nuevo si no solo sustituya el que ya esta.

    ResponderEliminar
    Respuestas
    1. Buenas,
      Has probado a borrar el antiguo y crear entonces el nuevo?

      Eliminar
  14. Excelente aporte... consulta: es posible crear una función para crear una subcarpeta teniendo como parámetro de entrada el nombre de la subcarpeta a crear y el id de la carpeta padre?... intento obtener el id de la carpeta padre y no lo puedo capturar para usarlo como parámetro.

    ResponderEliminar
    Respuestas
    1. No le veo ningún problema. Pasame el código que tienes hecho e intento echarte un cable

      Eliminar
    2. function crearCarpeta(nombre){
      var carpeta = DriveApp.createFolder(nombre);
      idCarpeta = carpeta.getId;
      return idCarpeta;
      }

      function creaSubCarpeta(idcarpetaPadre, nombreSubcarpeta){
      var carpetaPadre = DriveApp.getFolderById(idcarpetaPadre);
      var subCarpeta = carpetaPadre.createFolder(nombreSubcarpeta);
      idSubCarpeta = subCarpeta.getId;
      return idSubCarpeta;
      }

      function pruebaCarpetas(){
      var idCarpeta = crearCarpeta("Carpeta Raiz-1");
      var idSubCarpeta = creaSubCarpeta(idCarpeta, "SubCarpeta-1");
      }

      Eliminar
    3. usando logger pude ver que en vez de capturar el id carpeta me captura: function () { [native code] }

      Eliminar

Tal vez te interese