Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

241
Vistas
Why does this JS function run upon clicking on a button, but not when called within another function?

The function I'm primarily running savePo() saves the html page input data into a spreadsheet and it works fine. If I add savefile() to the bottom of the function, I see that it gets run, but it doesn't save the pdf file to the destination. If I run this function directly (button click), it runs normally. What am I missing?

Function saving form data to a spreadsheet

function savePo(user) {
  //...gets html page input data and builds a 2D array, which gets saved in a Spreadsheet
  google.script.run
    .withFailureHandler(function (e) {
      alert("The PO could not be saved./No se pudo guardar el pedido. " + e);
    })
    .savePoData(poData, poOrigin);

  savefile(); //How to run this function, which is detailed below

  //Hides Order Po Header Field and its label
  document.getElementById("selectOrderPo").style.display = "none";
  document.getElementById("orderPoLabel").setAttribute("hidden", "hidden");
  window.print();
  google.script.host.close();
}

Function that gets current page as a pdf and sends to server-side

function savefile() {
  var element = document.getElementById("pgBody");
  var opt = {
    margin: [2, 5, 2, 5], //top, left, bottom, right
    filename: supplier + " - " + poNumber + ".pdf",
    image: {
      type: "jpeg",
      quality: 0.98,
    },
    html2canvas: {
      scale: 2,
    },
    jsPDF: {
      unit: "mm",
      orientation: "landscape",
    },
  };

  const base64File = html2pdf()
    .set(opt)
    .from(element)
    .outputPdf()
    .then(function (p) {
      google.script.run.savePdf(btoa(p), filename);
    });
}

Function saving the file to a Google Drive Folder

function savePdf(data){
  const file = Utilities.newBlob(Utilities.base64Decode(data), MimeType.PDF).setName('fileName.pdf');
  DriveApp.getFolderById('folder_ID').createFile(file);
}
almost 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

In your script, I thought that the reason for your issue might be due to that savefile() is run with the asynchronous process. By this, google.script.host.close() is run before google.script.run.savePdf(btoa(p), filename) is run, and your issue occurs. If my understanding is correct, how about the following modification?

Pattern 1:

function savePo(user) {
  //...gets html page input data and builds a 2D array, which gets saved in a Spreadsheet
  google.script.run
    .withFailureHandler(function (e) {
      alert("The PO could not be saved./No se pudo guardar el pedido. " + e);
    })
    .savePoData(poData, poOrigin);

  savefile(); //How to run this function, which is detailed below

  //Hides Order Po Header Field and its label
  // document.getElementById("selectOrderPo").style.display = "none";
  // document.getElementById("orderPoLabel").setAttribute("hidden", "hidden");
  // window.print();
  // google.script.host.close();
}

function savefile() {
  var element = document.getElementById("pgBody");
  var opt = {
    margin: [2, 5, 2, 5], //top, left, bottom, right
    filename: supplier + " - " + poNumber + ".pdf",
    image: {
      type: "jpeg",
      quality: 0.98,
    },
    html2canvas: {
      scale: 2,
    },
    jsPDF: {
      unit: "mm",
      orientation: "landscape",
    },
  };

  const base64File = html2pdf()
    .set(opt)
    .from(element)
    .outputPdf()
    .then(function (p) {
      google.script.run.withFailureHandler(function () {
        document.getElementById("selectOrderPo").style.display = "none";
        document.getElementById("orderPoLabel").setAttribute("hidden", "hidden");
        window.print();
        google.script.host.close();
      }).savePdf(btoa(p), filename);
    });
}

Pattern 2:

function savePo(user) {
  //...gets html page input data and builds a 2D array, which gets saved in a Spreadsheet
  google.script.run
    .withFailureHandler(function (e) {
      alert("The PO could not be saved./No se pudo guardar el pedido. " + e);
      savefile(); //How to run this function, which is detailed below
    })
    .savePoData(poData, poOrigin);
}

function savefile() {
  var element = document.getElementById("pgBody");
  var opt = {
    margin: [2, 5, 2, 5], //top, left, bottom, right
    filename: supplier + " - " + poNumber + ".pdf",
    image: {
      type: "jpeg",
      quality: 0.98,
    },
    html2canvas: {
      scale: 2,
    },
    jsPDF: {
      unit: "mm",
      orientation: "landscape",
    },
  };

  const base64File = html2pdf()
    .set(opt)
    .from(element)
    .outputPdf()
    .then(function (p) {
      google.script.run.withFailureHandler(function () {
        document.getElementById("selectOrderPo").style.display = "none";
        document.getElementById("orderPoLabel").setAttribute("hidden", "hidden");
        window.print();
        google.script.host.close();
      }).savePdf(btoa(p), filename);
    });
}
almost 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda