Groups
Groups

Ayuda con: Reescribir un documento pdf creado desde un docs google

187 views
Skip to first unread message

CARLOS ALVAREZ GARDEA

unread,
Apr 15, 2023, 2:33:42 PM4/15/23
to Google Apps Script Community
tengo el siguiente código:

function onOpen() {
  var ui = DocumentApp.getUi();
  ui.createMenu('Mis funciones')
      .addItem('Generar PDF', 'generarPDF')
      .addToUi();
}

function generarPDF() {
  var response = DocumentApp.getUi().alert('¿Desea generar un PDF del documento actual?', DocumentApp.getUi().ButtonSet.YES_NO);
  if (response == DocumentApp.getUi().Button.YES) {
    var nombreCarpeta = "mi carpeta";
    var nombreArchivoPDF = DocumentApp.getActiveDocument().getName() + ".pdf";
    var carpeta = DriveApp.getFoldersByName(nombreCarpeta).next();
    var archivoPDFId = buscarArchivoEnCarpeta(carpeta, nombreArchivoPDF);
    Logger.log("Id = "+archivoPDFId);
    if (!archivoPDFId) {
      DocumentApp.getUi().alert('No se encontró un archivo PDF con el mismo nombre del documento actual en la carpeta "' + nombreCarpeta + '".');
      return;
    }
    var blobPDF = DocumentApp.getActiveDocument().getAs('application/pdf');
    DriveApp.getFileById(archivoPDFId).setContent(blobPDF);
    DocumentApp.getUi().alert('El PDF ha sido generado y guardado en la carpeta "' + nombreCarpeta + '".');
  }
}

function buscarArchivoEnCarpeta(carpeta, nombreArchivo) {
   Logger.log("carpeta = "+ carpeta);
   Logger.log("nombreArchivo = "+ nombreArchivo);
  var archivos = carpeta.getFilesByName(nombreArchivo);
  if (archivos.hasNext()) {
    return archivos.next().getId();
  } else {
    var carpetas = carpeta.getFolders();
    while (carpetas.hasNext()) {
      var subCarpeta = carpetas.next();
      var archivoPDF = buscarArchivoEnCarpeta(subCarpeta, nombreArchivo);
      if (archivoPDF) {
        return archivoPDF;
      }
    }
    return null;
  }
}

y si me funciona correctamente, pero el contenido que tengo en el documento google no me lo pone en el pdf, solo me pone: la palabra Blob  ,lo que estoy haciendo es modificar el pdf desde el documento, y quiero que el pdf se quede con el mismo id, porque esa URL la utilizo en un QR. no he podido dar con la solución , si alguien me pudiera ayudar selo agradecería.
Responder a todos
Responder al autor
Reenviar

Nerio Villalobos

unread,
Apr 15, 2023, 4:38:14 PM4/15/23
to google-apps-sc...@googlegroups.com
El problema se debe a que estás intentando establecer el contenido de un archivo PDF existente en Google Drive con el blob generado por DocumentApp.getActiveDocument().getAs('application/pdf'). El método DriveApp.getFileById(id).setContent(content) espera una cadena de texto como segundo parámetro, pero getAs('application/pdf') devuelve un objeto blob.

En su lugar, debes crear un nuevo archivo PDF en la carpeta y establecer su contenido con el blob generado. Luego, puedes eliminar el archivo PDF antiguo y renombrar el nuevo archivo PDF con el mismo nombre y ID del archivo antiguo. Puedes hacerlo con el siguiente código:

function generarPDF() {
  var response = DocumentApp.getUi().alert('¿Desea generar un PDF del documento actual?', DocumentApp.getUi().ButtonSet.YES_NO);
  if (response == DocumentApp.getUi().Button.YES) {
    var nombreCarpeta = "mi carpeta";
    var nombreArchivoPDF = DocumentApp.getActiveDocument().getName() + ".pdf";
    var carpeta = DriveApp.getFoldersByName(nombreCarpeta).next();
    var archivoPDFId = buscarArchivoEnCarpeta(carpeta, nombreArchivoPDF);
    Logger.log("Id = "+archivoPDFId);
    var blobPDF = DocumentApp.getActiveDocument().getAs('application/pdf');
    if (!archivoPDFId) {
      // Si no se encuentra el archivo PDF, se crea uno nuevo en la carpeta
      var nuevoArchivoPDF = carpeta.createFile(blobPDF).setName(nombreArchivoPDF);
      archivoPDFId = nuevoArchivoPDF.getId();
    } else {
      // Si se encuentra el archivo PDF, se establece su contenido con el blob generado
      var archivoPDF = DriveApp.getFileById(archivoPDFId);
      archivoPDF.setContent(blobPDF);
      archivoPDF.setName(nombreArchivoPDF);

    }
    DocumentApp.getUi().alert('El PDF ha sido generado y guardado en la carpeta "' + nombreCarpeta + '".');
  }
}

Este código crea un nuevo archivo PDF si no se encuentra uno existente en la carpeta, o establece el contenido del archivo existente con el blob generado. Luego, renombra el archivo PDF con el mismo nombre y ID del archivo antiguo para que la URL del QR siga funcionando.

--
You received this message because you are subscribed to the Google Groups "Google Apps Script Community" group.
To unsubscribe from this group and stop receiving emails from it, send an email to google-apps-script-c...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/google-apps-script-community/aa3badf1-2d8c-43b0-90d0-a1ae45821252n%40googlegroups.com.


--
__________________________
Nerio Enrique Villalobos Morillo
Buenos Aires, Argentina

CARLOS ALVAREZ GARDEA

unread,
Apr 16, 2023, 9:51:12 AM4/16/23
to google-apps-sc...@googlegroups.com
con mi código modificado como me dijiste:
function onOpen() {
  var ui = DocumentApp.getUi();
  ui.createMenu('Mis funciones')
      .addItem('Generar PDF''generarPDF')
      .addToUi();
}

function generarPDF() {
  var response = DocumentApp.getUi().alert('¿Desea generar un PDF del documento actual?'DocumentApp.getUi().ButtonSet.YES_NO);
  if (response == DocumentApp.getUi().Button.YES) {
    var nombreCarpeta = "QRs";
    var nombreArchivoPDF = DocumentApp.getActiveDocument().getName() + ".pdf";
    var carpeta = DriveApp.getFoldersByName(nombreCarpeta).next();
    var archivoPDFId = buscarArchivoEnCarpeta(carpetanombreArchivoPDF);
    Logger.log("Id = "+archivoPDFId);
    var blobPDF = DocumentApp.getActiveDocument().getAs('application/pdf');
    if (!archivoPDFId) {
      // Si no se encuentra el archivo PDF, se crea uno nuevo en la carpeta
      var nuevoArchivoPDF = carpeta.createFile(blobPDF).setName(nombreArchivoPDF);
      archivoPDFId = nuevoArchivoPDF.getId();
    } else {
      // Si se encuentra el archivo PDF, se establece su contenido con el blob generado
      var archivoPDF = DriveApp.getFileById(archivoPDFId);
      archivoPDF.setContent(blobPDF);
      archivoPDF.setName(nombreArchivoPDF);
    }
    var ruta = obtenerRutaArchivo(archivoPDFId);
    Logger.log("Ruta PDF = "ruta);
    DocumentApp.getUi().alert('El PDF ha sido generado y guardado en la carpeta "' + ruta + '".');
  }
}


function buscarArchivoEnCarpeta(carpetanombreArchivo) {
   Logger.log("carpeta = "carpeta);
   Logger.log("nombreArchivo = "nombreArchivo);
  var archivos = carpeta.getFilesByName(nombreArchivo);
  if (archivos.hasNext()) {
    return archivos.next().getId();
  } else {
    var carpetas = carpeta.getFolders();
    while (carpetas.hasNext()) {
      var subCarpeta = carpetas.next();
      var archivoPDF = buscarArchivoEnCarpeta(subCarpetanombreArchivo);
      if (archivoPDF) {
        return archivoPDF;
      }
    }
    return null;
  }
}

function obtenerRutaArchivo(archivoId) {
  var archivo = DriveApp.getFileById(archivoId);
  var ruta = "";
  var padres = archivo.getParents();
  while (padres.hasNext()) {
    var padre = padres.next();
    ruta = "/" + padre.getName() + ruta;
  }
  ruta = ruta + "/" + archivo.getName();
  return ruta;
}


si lo encuentra y lo genera pero me sigue saliendo esto:
está en el archivo adjunto, y dbería salir solo un párrafo, es solo una muestra!


Libre de virus.www.avast.com

You received this message because you are subscribed to a topic in the Google Groups "Google Apps Script Community" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/google-apps-script-community/WHRPEcDBHC0/unsubscribe.
To unsubscribe from this group and all its topics, send an email to google-apps-script-c...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/google-apps-script-community/CAC4ZdVF3BL6r3Uqq2tkDp4B4SOWn-MAxxVuvK5%2BU4dthTLrdiQ%40mail.gmail.com.
Error Blog.PNG

CARLOS ALVAREZ GARDEA

unread,
Apr 16, 2023, 9:51:59 AM4/16/23
to google-apps-sc...@googlegroups.com
muchas gracias!!

Libre de virus.www.avast.com

Nerio Villalobos

unread,
Apr 17, 2023, 12:16:13 AM4/17/23
to google-apps-sc...@googlegroups.com
Por lo que logro entender estás intentando generar un archivo PDF a partir del documento activo en Google Docs y guardarlo en una carpeta específica en Google Drive.

El problema que estás experimentando podría deberse a que el archivo PDF generado está siendo guardado en Drive como un objeto "Blob" en lugar de ser guardado como un archivo PDF con su contenido completo.

Una solución sería ajustar la función generarPDF() para guardar el archivo PDF generado correctamente. Aquí te dejo una versión actualizada de la función generarPDF() que debería ayudarte a solucionar este problema prueba y me dices que tal:


function generarPDF() {
  var response = DocumentApp.getUi().alert('¿Desea generar un PDF del documento actual?', DocumentApp.getUi().ButtonSet.YES_NO);
  if (response == DocumentApp.getUi().Button.YES) {
    var nombreCarpeta = "QRs";
    var nombreArchivoPDF = DocumentApp.getActiveDocument().getName() + ".pdf";
    var carpeta = DriveApp.getFoldersByName(nombreCarpeta).next();
    var archivoPDFId = buscarArchivoEnCarpeta(carpeta, nombreArchivoPDF);
    Logger.log("Id = "+archivoPDFId);
    var blobPDF = DocumentApp.getActiveDocument().getAs('application/pdf');
    if (!archivoPDFId) {
      // Si no se encuentra el archivo PDF, se crea uno nuevo en la carpeta
      var nuevoArchivoPDF = carpeta.createFile(blobPDF).setName(nombreArchivoPDF);
      archivoPDFId = nuevoArchivoPDF.getId();
    } else {
      // Si se encuentra el archivo PDF, se establece su contenido con el blob generado
      var archivoPDF = DriveApp.getFileById(archivoPDFId);
      archivoPDF.setContent(blobPDF.getBytes());

      archivoPDF.setName(nombreArchivoPDF);
    }
    var ruta = obtenerRutaArchivo(archivoPDFId);
    Logger.log("Ruta PDF = "+ ruta);
    DocumentApp.getUi().alert('El PDF ha sido generado y guardado en la carpeta "' + ruta + '".');
  }
}

En resumen, se agrega getBytes() a la línea que establece el contenido del archivo PDF para asegurarse de que se está guardando el archivo completo, y no solo el objeto Blob,

Saludos,

Reply all
Reply to author
Forward
0 new messages
Search
Clear search
Close search
Google apps
Main menu