Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

239
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!