|
// Simple function to add a menu option to the spreadsheet "Export", for saving a PDF of the spreadsheet directly to Google Drive. |
|
// The exported file will be named: SheetName and saved in the same folder as the spreadsheet. |
|
// To change the filename, just set pdfName inside generatePdf() to something else. |
|
|
|
// Running this, sends the currently open sheet, as a PDF attachment |
|
function onOpen() { |
|
var submenu = [{name:"Save PDF", functionName:"generatePdf"}]; |
|
SpreadsheetApp.getActiveSpreadsheet().addMenu('Export', submenu); |
|
} |
|
|
|
function generatePdf() { |
|
// Get active spreadsheet. |
|
var sourceSpreadsheet = SpreadsheetApp.getActive(); |
|
|
|
// Get active sheet. |
|
var sheets = sourceSpreadsheet.getSheets(); |
|
var sheetName = sourceSpreadsheet.getActiveSheet().getName(); |
|
var sourceSheet = sourceSpreadsheet.getSheetByName(sheetName); |
|
|
|
// Set the output filename as SheetName. |
|
var pdfName = sheetName; |
|
|
|
// Get folder containing spreadsheet to save pdf in. |
|
var parents = DriveApp.getFileById(sourceSpreadsheet.getId()).getParents(); |
|
if (parents.hasNext()) { |
|
var folder = parents.next(); |
|
} |
|
else { |
|
folder = DriveApp.getRootFolder(); |
|
} |
|
|
|
// Copy whole spreadsheet. |
|
var destSpreadsheet = SpreadsheetApp.open(DriveApp.getFileById(sourceSpreadsheet.getId()).makeCopy("tmp_convert_to_pdf", folder)) |
|
|
|
// Delete redundant sheets. |
|
var sheets = destSpreadsheet.getSheets(); |
|
for (i = 0; i < sheets.length; i++) { |
|
if (sheets[i].getSheetName() != sheetName){ |
|
destSpreadsheet.deleteSheet(sheets[i]); |
|
} |
|
} |
|
|
|
var destSheet = destSpreadsheet.getSheets()[0]; |
|
|
|
// Repace cell values with text (to avoid broken references). |
|
var sourceRange = sourceSheet.getRange(1,1,sourceSheet.getMaxRows(),sourceSheet.getMaxColumns()); |
|
var sourcevalues = sourceRange.getValues(); |
|
var destRange = destSheet.getRange(1, 1, destSheet.getMaxRows(), destSheet.getMaxColumns()); |
|
destRange.setValues(sourcevalues); |
|
|
|
// Save to pdf. |
|
var theBlob = destSpreadsheet.getBlob().getAs('application/pdf').setName(pdfName); |
|
var newFile = folder.createFile(theBlob); |
|
|
|
// Delete the temporary sheet. |
|
DriveApp.getFileById(destSpreadsheet.getId()).setTrashed(true); |
|
} |
Hi,
I have a problem related to multiple pdf generation within my script.
I can generate and register a pdf file from my sheet on my drive using the following code lines :
These lines create a pdf file from my sheet "as it is" at the moment I start my script.
Then I took this code and puted it in a loop to generate multiple pdf files for different customer using the same sheet
Between every pdf file generation my script modifies one cell ("A1")
In other cells I have formulas refering to "A1" that should update their values.
// Access the sheet from which I generate PDF FILE
var FFACGEN= document.getSheetByName("FACGEN")
// Browsing threw a list of customer
for (var i=0;i<10;i++){
// I put the number of the customer into cell A1
FFACGEN.getRange("A1").setValue(i);
// Generate and register pdf file using FFACGEN sheet
var theBlob = Document.getBlob().getAs('application/pdf').setName("MyDocument.pdf");
var folder = DriveApp.getFolderById("FolderID");
var newFile = folder.createFile(theBlob);
}
The problem is that the sheet does not update its values before each pdf file is generate.
Result is : All my pdf file are exactly the same :
On the other end, i can see that A1 has been updated on my sheet.
It just does not change the content of the pdf file
Do you know anyway to "force" googlesheet to recalculate all values on a sheet before I generate the pdf file ?
Thank you for your help.
Regards.
LeGueuxF