|
// 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); |
|
} |
Hello,
I've taking the liberty to modify @primaryobjects script(very nice work indeed) a little, in order to avoid the REF issues mentioned.
Just an idea!
`function generatePdf() {
var ss, source, newTab, newSheet;
source = SpreadsheetApp.openById("10wh47mXtvXEdfgdfgdfgdfgdfgdfg").getSheetByName('PrintFATURAFINAL');
ss = SpreadsheetApp.openById("10wh47mXtvXEVUHdfgdfgdfgdfgdfgdfgd");
var pdfName = source.getRange('E10').getDisplayValue();
/*By using the value on a cell as the name for the pdf file you can dynamically change it to be display as a distinct list with no repetition.
ei: client A.pdf
client B.pdf
,etc...
*/
newTab = source.copyTo(ss) // copy sheet to the same spreadsheet
newTab.getDataRange().setValues(newTab.getDataRange().getDisplayValues())
newSheet = SpreadsheetApp.create('Temp');
newTab.copyTo(newSheet);
newSheet.deleteSheet(newSheet.getSheets()[0]);
var folderId = '16ZABtdfgdfgdfgdfgdfgdfgdfgdfg';
var folder = DriveApp.getFolderById(folderId);
// Save to pdf.
var theBlob = newSheet.getBlob().getAs('application/pdf').setName(pdfName);
var newFile = folder.createFile(theBlob);
var delet = ss.deleteSheet(newTab);
DriveApp.getFileById(newSheet.getId()).setTrashed(true);
}`