Cómo crear PDF's con Google Apps Script

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

Hay ocasiones en que puede resultar interesante exportar la información de nuestros documentos de Drive en formato pdf para luego poder enviarla a otras personas de una manera más sencilla.

Como siempre os digo, es más fácil generar pdf con Google Apps Script de lo que podría parecer.

Os lo explico con un ejemplo que vale más que mil palabras.

function PDF()
{
    var file = null;
 
    var files = DriveApp.getFilesByName(SpreadsheetApp.getActiveSpreadsheet().getName());
 
    if ( files.hasNext() )
            file = files.next();
 
    var newFile = DriveApp.createFile(file.getAs('application/pdf'));
}

Si ejecutáis este ejemplo en un hoja de cálculo de drive lo que hará será copiar el contenido de la hoja de cálculo en un documento pdf.

Las posibilidades son infinitas.

Recordad que si necesitáis ayuda para eso estamos.

49 comentarios:

  1. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
    Respuestas
    1. ummm.... Interesante pregunta... Supongo que si, pero sinceramente, jamás lo he probado ni se muy bien por donde empezaria. si encuentras la manera compartelo por favor, yo tb estoy interesado
      Nos vemos

      Eliminar
  2. Que pasa con los Documentos q tienen mas de una hoja?? y yo solo quiero el PDF de una sola hoja

    ResponderEliminar
    Respuestas
    1. Perdon por no responder hasta hoy, este comentario se me habia quedado traspapelado. La única manera que se me ocurre es que copies esa hoja en un documento nuevo con solo esa hoja y crees el documento pdf desde ahí.

      Eliminar
  3. como hacer para que el pdf quede con otro nombre? gracias

    ResponderEliminar
    Respuestas
    1. Al final del script pon lo siguiente: newFile.setName("Pon_aqui_el_nombre_que_quieras_ponerle");
      Ya contarás como te ha ido
      Nos vemos

      Eliminar
  4. Hola Pako quisiera saber si hay una posibilidad de exportar el nombre que este asociado a ese documento, para que sea personalizado la exportación.

    Gracias !

    ResponderEliminar
  5. No te acabo de entender.
    Al generar el PDF se genera con el mismo nombre que el original.
    El fichero de origen tiene este nombre: SpreadsheetApp.getActiveSpreadsheet().getName()

    Igual soy yo que no te entiendo, podrias volvermelo a explicar? o era esto?

    ResponderEliminar
  6. Hola Pako, Excelente aportación, quiero darle uso para crear PDF´s foliados a partir de una plantilla, el folio lo tomaría de una celda, todo bien hasta ahí, solo que los PDF´s los guarda en mi unidad de Drive y quisiera guardarlos dentro en una carpeta dentro en una unidad de equipo, te agradecería bastante me pudieras indicar como lograrlo.

    function onOpen()
    {
    var ui = SpreadsheetApp.getUi();
    ui.createMenu('PDF')
    .addItem('Exportar a PDF', 'PDF')
    .addToUi();
    }

    function PDF()
    {
    var file = null;

    var files = DriveApp.getFilesByName(SpreadsheetApp.getActiveSpreadsheet().getName());

    if ( files.hasNext() )
    file = files.next();

    var newFile = DriveApp.createFile(file.getAs('application/pdf'));
    var values = SpreadsheetApp.getActiveSheet().getRange("L2").getValues();
    Logger.log(values["L2"]);

    newFile.setName("Documento N° "+ values);
    }

    ResponderEliminar
    Respuestas
    1. Hola,

      En vez de hacer esto:

      var files = DriveApp.getFilesByName(SpreadsheetApp.getActiveSpreadsheet().getName());

      haria la creación del fichero donde lo quieres, y así te evitas problemas.

      Aquí tienes un ejemplo de como hacerlo:

      http://googleappscriptsweb.blogspot.com.es/2015/10/como-crear-ficheros-y-carpetas-con.html

      Nos vemos!

      Eliminar
  7. Hola buenas noches, he practicado crear PDF´s pero mi duda es si quieres crear unicamente las celdas seleccionadas del Spreadsheet... como se puede lograr esto??

    gracias!!

    ResponderEliminar
  8. Hola buenas noches junto con saludar y agradecer tu pos tengo la mims consulta que usuario anterior ¿como puede hacer para seleccionar un rango de una hoja determina para generar el PDF?

    dese ya muchas gracias

    ResponderEliminar
    Respuestas
    1. Hola, se me pasó el comentario anterior de responder.

      La única manera que le veo para hacerlo es copiar el rango que te interese en otro spreadsheet nuevo y entonces generar el PDF de ese nuevo spreadsheet.

      Espero que os sirva

      Nos vemos

      Eliminar
  9. PAra coger solo un rango de filas y columnas?

    ResponderEliminar
    Respuestas
    1. sheet.getRange(x,y,z,t) y copiar ese rango en otra hoja

      Creo que sería la mejor solucion

      Nos vemos

      Eliminar
  10. Como puedo enviar el PDF por correo electrónico?

    ResponderEliminar
    Respuestas
    1. Hola,
      Para enviar cualquier documento dentro un correo se tiene que enviar en forma de Blob dentro del campo attachments (parametro opcional)
      Si tienes el pdf cargado dentro de la variable pdf ( por ejemplo)
      MailApp.sendEmail('blabla@blibli.com', 'Envio de PDF en un correo', 'PDF incluido', {
      name: 'PDF Sender',
      attachments: [pdf.getAs(MimeType.PDF)]
      });

      Espero q te sirva

      Eliminar
  11. Hola, me gustaría saber cómo puedo hacer para que el pdf que genero se guarde con el nombre del cliente que está en una celda de la misma hoja...Se puede? Soy nueva en todo esto y aún no logro sacarlo. Gracias!!!

    ResponderEliminar
    Respuestas
    1. Hola Claro que se puede, mira yo lo he hecho así:

      var funcionario = sheetActive.getRange("B6").getValue();//Captura del nombre del funcionario de la hoja activa
      var cargo = sheetActive.getRange("D6").getValue();//Captura del cargo del funcionario
      var dateformat = sheetActive.getRange("D7").getValue();
      var process = sheetActive.getRange("B7").getValue();
      var emailAddress = 'correo@correo.com';//Correo electrónico al que enviará el archivo
      var filename = 'Transferencia Documental_'+ funcionario + '_' + fecha + '.pdf'; //Nombre del archivo en Pdf

      Eliminar
  12. Es mas sencillo de lo que parece.

    Tienes que obtener el id del pdf (GetID()) y con ese id a través del DriveApp, abrir el fichero y hacerle un setName.

    ya me explicaras como te ha ido

    ResponderEliminar
  13. Hola Amigo, favor tengo la gran complicación de imprimir PDF desde una plantilla que se rellena con una lista desplegable, podrías ayudarme con mi problema.?
    Gracias.

    ResponderEliminar
    Respuestas
    1. Me encantaria ayudarte pero hasta donde yo se, no se puede imprimir desde un script.

      Se puede crear el PDF, se puede enviar por correo, etc... pero imprimirlo es imposible.

      Sorry

      Eliminar
  14. Hola a todos, logro enviar la hoja activa por correo y como adjunto PDF, pero necesito que se envié en forma horizontal ?

    ResponderEliminar
    Respuestas
    1. Ahora no te entiendo, podrías explicarlo un poco más?

      Gracias

      Eliminar
    2. Tengo una hoja de google sheets, uso una función para transformar la hoja en PDF y luego enviarla por correo como adjunto.

      Pero no se como hacerlo para que esta funcion primero le de el formato horizontal (como cuando envias a imprimir) y luego cree el PDF.

      Eliminar
    3. Sinceramente ni idea.

      Tal vez haya alguna manera pero la verdad, no la conozco.

      Si la encuentras publícala, puede ser muy útil para muchas personas.

      Nos vemos

      Eliminar
  15. Hola a todos, necesito su ayuda, es posible guardar una hoja de google sheets como archivo PDF en el disco local (C:) o un disco compartido de un servidor en red???

    ResponderEliminar
    Respuestas
    1. Nope. Desde google apps script nunca podrás acceder a un PC o a un servidor, salvo que en ese PC o servidor hay algún tipo de servicio que te permita subir ficheros.

      Si te sirve un disco compartido en un servidor de red, te serviria una carpeta de Google Drive? Eso si que se podría hacer.

      Nos vemos

      Eliminar
    2. Creas el PDF en el drive, y usas una function download... De esta forma descargas el PDF creado en el drive al pc... Deberás solo configurar el browser para indicarle en que carpeta debe guardar las descargas.

      Eliminar
  16. hola a todos necesito su ayuda, es posible guardar el PDF en una carpeta especifica en mi drive, ya genero el pdf pero esta en drive y lo necesito en una carpeta especifica.

    ResponderEliminar
    Respuestas
    1. var pdf = DriveApp.getFile(id del PDF);
      pdf.makeCopy("PDF", folder);

      Con esto deberia funcionarte

      Eliminar
  17. no lo logre... soy nuevo en esto, pero necesito ayuda así voy,

    //var folder = DriveApp.getFoldersByName('pdf sierra');// aqui esta la carpeta donde deseo que el archivo se grabe
    var file = null;
    var now = new Date();
    var year = now.getFullYear();
    var month = now.getMonth()+1;
    var day = now.getUTCDate();
    var hora = now.getHours();
    var minutos = now.getMinutes();

    var string = day + "/" + month + "/" + year + "-" + hora + ":" + minutos + "\n";

    var files = DriveApp.getFilesByName(SpreadsheetApp.getActiveSpreadsheet().getName());

    if ( files.hasNext() )
    file = files.next();

    var newFile = DriveApp.createFile(file.getAs('application/pdf')); //archivo en pdf
    newFile.setName(string);// archivo con el nombre que deseo

    //+++++++++++++++++++++++ aqui es donde quiero que el archivo que esta en drive lo mueva a la carperta con nombre pdf sierra.

    var pdf = DriveApp.getFilesByName(newFile);
    var folder = DriveApp.getFoldersByName('pdf sierra');

    ResponderEliminar
  18. Hola,

    No puedo probarlo ahora mismo pero creo que esto te serviria:

    var pdf = DriveApp.getFilesByName(newFile); >> Elimina esta linea
    var pdf = newFile; // Si quieres ponle esta

    Si no recuerdo mal tienes una opcion que te permite copiar a un folder.

    Así que despues del var folder = DriveApp.getFoldersByName('pdf sierra');
    ponle pdf.CopyTo(folder) o pdf.MoveTo(folder); ( no recuerdo bien)

    Ya me diras

    Nos vemos

    ResponderEliminar
  19. hola LordPakus, lo siento no he podido, me sale este error. muchas gracias por tu ayuda


    Detalles del mensaje
    TypeError: No se puede encontrar la función MakeCopy en el objeto bitacora de sierra 13/8/2019-17:51. (línea 275, archivo "macros"

    var pdf = newFile;
    var folder = DriveApp.getFoldersByName('pdf_sierra')
    pdf.MakeCopy(folder);

    ResponderEliminar
    Respuestas
    1. var file = DriveApp.getFileById("adasadadad");
      var folder = DriveApp.getFoldersByName('pdf_sierra')
      file.makeCopy(folder);

      Esto deberia funcionarte.

      Fijate que es makeCopy y no MakeCopy.

      Usa el autocompletar del editor, para este tipo de cosas va muy bien

      Nos vemos

      Eliminar
  20. Hola, alguna función para contar las páginas que tiene un pdf?? Gracias

    ResponderEliminar
  21. Ufff, no es facil lo que pides.

    Los PDF no se pueden leer directamente con google apps script. Se ha de utilizar un OCR y entonces contar las paginas del resultado (y puede descuadrar).

    A ver si alguien tiene alguna solucion y te la puede compartir

    Suerte!

    ResponderEliminar
  22. hola LordPakus, gracias por tu ayuda pero me sigue saliendo este error no se si podras ayudame, mi urgencia es que este archivo quede en una carpeta del Drive para poder compartir esa carpeta a mas usuarios.

    este es el error

    TypeError: No se puede encontrar la función makeCopy en el objeto FileIterator. (línea 281, archivo "macros")

    este es el codigo:


    var file = null;
    var now = new Date();
    var year = now.getFullYear();
    var month = now.getMonth()+1;
    var day = now.getUTCDate();
    var hora = now.getHours();
    var minutos = now.getMinutes();

    var string = day + "/" + month + "/" + year + "-" + hora + ":" + minutos + "\n";

    var files = DriveApp.getFilesByName(SpreadsheetApp.getActiveSpreadsheet().getName());

    if ( files.hasNext() )
    file = files.next();

    var newFile = DriveApp.createFile(file.getAs('application/pdf'));
    newFile.setName(string);




    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    // codigo para buscar una carperta que se llama pdf_sierra en drive y mover el archivo creado en pdf a esa caarpeta, para poder compartirla con mas usuarios
    var pdf = DriveApp.getFilesByName(newFile);
    var folder = DriveApp.getFoldersByName('pdf_sierra');
    pdf.makeCopy(folder);

    mil gracias por compartir tus conocimientos saludos

    ResponderEliminar
  23. Hola,
    Evidentemente, el fileiterator sirve para iterar entre ficheros , no es un fichero como tal.

    La solucion es cambiar esta linea: var pdf = DriveApp.getFilesByName(newFile);
    por esta: var pdf = newFile;

    Ya me diras

    ResponderEliminar
  24. hola ya lo hice pero no mueve el archivo creado en pdf con el nombre (20/08/2019-17:6) a la carpeta que esta en Drive pdf_sierra, y me crea otro que se llama (FolderIterator) igual en pdf.

    no se por que razón no lo mueve me gustaria pegarte el pantallazo pero no se puede

    ResponderEliminar
    Respuestas
    1. Dame un dia que le pueda pegar un repaso. Ahora mismo estoy bastante liado con un proyecto que he de entregar. Te digo algo.

      Eliminar
    2. hola disculpa que te hable de este tema de nuevo pero no he podido..

      Eliminar
    3. Q va, he estado superliado, mis disculpas.

      Te tengo apuntado para revisarmelo cuando pueda, no te aseguro nada.

      Sorry

      Eliminar
  25. Hola que tal LordPakus

    Excelente la funcional para crear el PDF pero necesito que se envie solo una hoja especifica, intente con esto

    function PDF()
    {
    var file = null;

    //var files = DriveApp.getFilesByName(SpreadsheetApp.getActiveSpreadsheet().getName());
    var file2 = SpreadsheetApp.getActiveSpreadsheet();
    var files = file2.getSheetByName("RADICACION");

    if ( files.hasNext() )
    file = files.next();

    var newFile = DriveApp.createFile(file.getAs('application/pdf'));
    newFile.setName("Radicación diaria")
    }

    Pero me arroja error en .hasNext()

    Que podría hacer?

    ResponderEliminar
  26. Hola,
    Tienes un error grave de concepto. El hasNext solo se puede usar iteradores (en objetos del tipo getFilesByName por ejemplo)

    Una cosa es un file, otra un spreadsheet y otra un sheet. No se puede usar todo junto.

    En tu caso, hay una manera más elegante pero bastante más compleja de explicar, así que la forma fácil seria copiar la hoja que tu quieres en otro spreadsheet.

    Ya me diras como te va

    Nos vemos

    ResponderEliminar
  27. Hola @LordPakus y hay alguna forma de generar un archivo, pero en vez de PDP genere una excel (.xls) ?.

    Agradezco de antemano la respuesta.

    ResponderEliminar
  28. Sinceramente no lo he probado, pero a priori deberia permitirtelo.

    En este link verás la lista de MimeType que admite Google Apps Script : https://developers.google.com/apps-script/reference/base/mime-type

    En principio con MICROSOFT_EXCEL deberia permitirte trabajar con estos formatos.

    Nos vemos

    ResponderEliminar

Related Posts Plugin for WordPress, Blogger...