I want to automatically produce a PDF of my invoices. The worksheet (master) where I generate the invoices has several tabs which I do not want to print. My thoughts were to create a single tab sheet and print from that. To do this I set up a sheet (PDF Print) which uses IMPORTRANGE
to bring in the invoice details. I then run a script from the master sheet which puts the current invoice number into A64 of the PDF print sheet.
Using the script below (running in the PDF print sheet) I was hoping to start the PDF print process. The script works if run manually but not by the OnEdit trigger). I wondered if the problem was that OnEdit only works when the cell contents has been changed manually.
My script is:
function onEdit(e) {
if (e.range.getA1Notation() == 'A64') {
savePDFs();
}
}
function savePDFs(optSSId, optSheetId) {
var ss = (optSSId) ? SpreadsheetApp.openById(optSSId) : SpreadsheetApp.getActiveSpreadsheet();
var url = ss.getUrl().replace(/edit$/, '');
var parents = DriveApp.getFileById(ss.getId()).getParents();
var folders = DriveApp.getFoldersByName('Invoices PDF'); // Modified
var folder = folders.hasNext() ? folders.next() : parents.next(); // Modified
var sheets = ss.getSheets();
for (var i = 0; i < sheets.length; i++) {
var sheet = sheets[i];
if (optSheetId && optSheetId !== sheet.getSheetId()) continue;
var url_ext = 'export?exportFormat=pdf&format=pdf' //export as pdf
+
'&gid=' + sheet.getSheetId() //the sheet's Id
// following parameters are optional...
+
'&size=A4' // paper size
+
'&portrait=true' // orientation, false for landscape
+
'&fitp=true' // fit to width, false for actual size
+
'&sheetnames=false&printtitle=false&pagenumbers=false' //hide optional headers and footers
+
'&gridlines=false' // hide gridlines
+
'&fzr=false'; // do not repeat row headers (frozen rows) on each page
var options = {
headers: {
'Authorization': 'Bearer ' + ScriptApp.getOAuthToken()
}
}
var response = UrlFetchApp.fetch(url + url_ext, options);
var valor = sheet.getRange('c1').getValue(); // Modified
var blob = response.getBlob().setName(valor + '.pdf');
folder.createFile(blob);
ClearPrintTrig()
}
}
function ClearPrintTrig() {
var spreadsheet = SpreadsheetApp.getActive();
spreadsheet.getRange('A64').activate();
spreadsheet.getActiveRangeList().clear({
contentsOnly: true,
skipFilteredRows: true
});
}