在 Apps 脚本中将单个 Sheet 导出为 PDF
Export Single Sheet to PDF in Apps Script
我在一个 Spreadsheet 中有很多 sheet。我有 2 个 sheet 每次都想导出。 Sheet 一个是sheet同资料。 Sheet 二是我需要提供给客户的 sheet,它参考了 Sheet 一。
目前,我创建了一个新的临时点差sheet,复制Sheet一个到新点差sheet,然后复制Sheet两个到临时点差sheet。之后,我将临时 spreadsheet 转换为 pdf。然后我删除临时传播sheet并将pdf保存到Google驱动器中的一个文件夹中。
创建的 PDF 包含两个 sheet 的 2 页。我只需要 Sheet 两个。如果我只传输 Sheet Two,sheet 会留下许多 #REF 错误,因为 Sheet One 不存在。有没有办法只导出 Sheet 两个而没有 #REF 错误?
下面是我的代码:
//create a temporary spreadsheet, copy both files onto it
var newSpreadsheet = SpreadsheetApp.create(nameOfSheet);
var d = ss.getSheetByName('Data').copyTo(newSpreadsheet); //the sheet with all the information
d.setName('Data');
sheetToCopy.copyTo(newSpreadsheet); //the sheet that uses references from the data sheet
newSpreadsheet.deleteSheet(newSpreadsheet.getSheetByName("Sheet1")); //delete the original sheet of the new spreadsheet
var blobOfNewSpreadsheet = newSpreadsheet.getBlob(); //create pdf
folder.createFile(blobOfNewSpreadsheet); //add to folder
//delete the temporary spreadsheet2
var deleteSpreadsheet = DriveApp.getFileById(newSpreadsheet.getId());
deleteSpreadsheet.setTrashed(true);
当通过 getBlob 导出传播sheet 时,不包括隐藏的 sheet。因此,您可以在导出之前暂时隐藏任何不需要的 sheet。
function export() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('Unwanted Sheet');
sheet.hideSheet();
DriveApp.createFile(ss.getBlob());
sheet.showSheet();
}
上面只隐藏了一个sheet,这在你的问题的上下文中就足够了。这是一个隐藏除一个以外的所有内容的版本。
function exportSheet(sheetName) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
for (var i = 0; i < sheets.length; i++) {
if (sheets[i].getSheetName() !== sheetName) {
sheets[i].hideSheet()
}
}
DriveApp.createFile(ss.getBlob());
for (var i = 0; i < sheets.length; i++) {
sheets[i].showSheet()
}
}
我有同样的查询,现在我已经尝试了很多解决方案,但据我所知,以下代码是最好的。此脚本不会创建临时 sheet 并且比旧方法快一点。
如果我错了,请原谅我,但只是为了大家的利益而分享。
function generatePdf() {
SpreadsheetApp.flush();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sourceSpreadsheet = SpreadsheetApp.getActive(); // Get active spreadsheet.
var sheets = sourceSpreadsheet.getSheets(); // Get active sheet.
var sheetName = sourceSpreadsheet.getActiveSheet().getName();
var sourceSheet = sourceSpreadsheet.getSheetByName(sheetName);
var pdfName = sheetName + ".pdf"; // Set the output filename as SheetName.
var parents = DriveApp.getFileById(sourceSpreadsheet.getId()).getParents(); // Get folder containing spreadsheet to save pdf in.
if (parents.hasNext()) {
var folder = parents.next();
} else {
folder = DriveApp.getRootFolder();
}
var theBlob = createblobpdf(sheetName, pdfName);
var newFile = folder.createFile(theBlob);
var email = Session.getActiveUser().getEmail() || 'admin@gmail.com';
var custemail = sourceSheet.getRange('A1').getValue();
email = email + "," + custemail;
// Subject of email message
const subject = `Your subject Attachement: ${sheetName}`;
// Email Body can be HTML too with your image
const body = "body";
if (MailApp.getRemainingDailyQuota() > 0)
GmailApp.sendEmail(email, subject, body, {
htmlBody: body,
attachments: [theBlob]
});
// delete pdf if already exists
var files = folder.getFilesByName(pdfName);
while (files.hasNext()) {
files.next().setTrashed(true);
}
sourceSpreadsheet.toast("Emailed to " + email, "Success");
}
function createblobpdf(sheetName, pdfName) {
var sourceSpreadsheet = SpreadsheetApp.getActive();
var sourceSheet = sourceSpreadsheet.getSheetByName(sheetName);
var url = 'https://docs.google.com/spreadsheets/d/' + sourceSpreadsheet.getId() + '/export?exportFormat=pdf&format=pdf' // export as pdf / csv / xls / xlsx
+ '&size=A4' // paper size legal / letter / A4
+ '&portrait=true' // orientation, false for landscape
+ '&fitw=true' // fit to page width, false for actual size
+ '&sheetnames=true&printtitle=false' // hide optional headers and footers
+ '&pagenum=RIGHT&gridlines=false' // hide page numbers and gridlines
+ '&fzr=false' // do not repeat row headers (frozen rows) on each page
+ '&horizontal_alignment=CENTER' //LEFT/CENTER/RIGHT
+ '&vertical_alignment=TOP' //TOP/MIDDLE/BOTTOM
+ '&gid=' + sourceSheet.getSheetId(); // the sheet's Id
var token = ScriptApp.getOAuthToken();
// request export url
var response = UrlFetchApp.fetch(url, {
headers: {
'Authorization': 'Bearer ' + token
}
});
var theBlob = response.getBlob().setName(pdfName);
return theBlob;
};
最佳解决方案对我不起作用。损坏的引用,即使其中有“修复”。
不过以下是。
它更优雅一些,因为它“隐藏”了您不需要的工作表。与复制电子表格、删除工作表然后下载它的顶级解决方案相反。
function exportSheet() {
var sheetName = "YOUR SHEET NAME HERE"
var ss = SpreadsheetApp.openById("YOUR SPREADSHEET ID HERE")
var sheets = ss.getSheets();
for (var i = 0; i < sheets.length; i++) {
if (sheets[i].getSheetName() !== sheetName) {
sheets[i].hideSheet()
}
}
var newFile = DriveApp.createFile(ss.getBlob());
for (var i = 0; i < sheets.length; i++) {
sheets[i].showSheet()
}
newFile.newFile.moveTo(DriveApp.getFolderById("FolderID"));
//I just did this to move the file to somewhere else.
}
我在一个 Spreadsheet 中有很多 sheet。我有 2 个 sheet 每次都想导出。 Sheet 一个是sheet同资料。 Sheet 二是我需要提供给客户的 sheet,它参考了 Sheet 一。
目前,我创建了一个新的临时点差sheet,复制Sheet一个到新点差sheet,然后复制Sheet两个到临时点差sheet。之后,我将临时 spreadsheet 转换为 pdf。然后我删除临时传播sheet并将pdf保存到Google驱动器中的一个文件夹中。
创建的 PDF 包含两个 sheet 的 2 页。我只需要 Sheet 两个。如果我只传输 Sheet Two,sheet 会留下许多 #REF 错误,因为 Sheet One 不存在。有没有办法只导出 Sheet 两个而没有 #REF 错误?
下面是我的代码:
//create a temporary spreadsheet, copy both files onto it
var newSpreadsheet = SpreadsheetApp.create(nameOfSheet);
var d = ss.getSheetByName('Data').copyTo(newSpreadsheet); //the sheet with all the information
d.setName('Data');
sheetToCopy.copyTo(newSpreadsheet); //the sheet that uses references from the data sheet
newSpreadsheet.deleteSheet(newSpreadsheet.getSheetByName("Sheet1")); //delete the original sheet of the new spreadsheet
var blobOfNewSpreadsheet = newSpreadsheet.getBlob(); //create pdf
folder.createFile(blobOfNewSpreadsheet); //add to folder
//delete the temporary spreadsheet2
var deleteSpreadsheet = DriveApp.getFileById(newSpreadsheet.getId());
deleteSpreadsheet.setTrashed(true);
当通过 getBlob 导出传播sheet 时,不包括隐藏的 sheet。因此,您可以在导出之前暂时隐藏任何不需要的 sheet。
function export() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('Unwanted Sheet');
sheet.hideSheet();
DriveApp.createFile(ss.getBlob());
sheet.showSheet();
}
上面只隐藏了一个sheet,这在你的问题的上下文中就足够了。这是一个隐藏除一个以外的所有内容的版本。
function exportSheet(sheetName) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
for (var i = 0; i < sheets.length; i++) {
if (sheets[i].getSheetName() !== sheetName) {
sheets[i].hideSheet()
}
}
DriveApp.createFile(ss.getBlob());
for (var i = 0; i < sheets.length; i++) {
sheets[i].showSheet()
}
}
我有同样的查询,现在我已经尝试了很多解决方案,但据我所知,以下代码是最好的。此脚本不会创建临时 sheet 并且比旧方法快一点。
如果我错了,请原谅我,但只是为了大家的利益而分享。
function generatePdf() {
SpreadsheetApp.flush();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sourceSpreadsheet = SpreadsheetApp.getActive(); // Get active spreadsheet.
var sheets = sourceSpreadsheet.getSheets(); // Get active sheet.
var sheetName = sourceSpreadsheet.getActiveSheet().getName();
var sourceSheet = sourceSpreadsheet.getSheetByName(sheetName);
var pdfName = sheetName + ".pdf"; // Set the output filename as SheetName.
var parents = DriveApp.getFileById(sourceSpreadsheet.getId()).getParents(); // Get folder containing spreadsheet to save pdf in.
if (parents.hasNext()) {
var folder = parents.next();
} else {
folder = DriveApp.getRootFolder();
}
var theBlob = createblobpdf(sheetName, pdfName);
var newFile = folder.createFile(theBlob);
var email = Session.getActiveUser().getEmail() || 'admin@gmail.com';
var custemail = sourceSheet.getRange('A1').getValue();
email = email + "," + custemail;
// Subject of email message
const subject = `Your subject Attachement: ${sheetName}`;
// Email Body can be HTML too with your image
const body = "body";
if (MailApp.getRemainingDailyQuota() > 0)
GmailApp.sendEmail(email, subject, body, {
htmlBody: body,
attachments: [theBlob]
});
// delete pdf if already exists
var files = folder.getFilesByName(pdfName);
while (files.hasNext()) {
files.next().setTrashed(true);
}
sourceSpreadsheet.toast("Emailed to " + email, "Success");
}
function createblobpdf(sheetName, pdfName) {
var sourceSpreadsheet = SpreadsheetApp.getActive();
var sourceSheet = sourceSpreadsheet.getSheetByName(sheetName);
var url = 'https://docs.google.com/spreadsheets/d/' + sourceSpreadsheet.getId() + '/export?exportFormat=pdf&format=pdf' // export as pdf / csv / xls / xlsx
+ '&size=A4' // paper size legal / letter / A4
+ '&portrait=true' // orientation, false for landscape
+ '&fitw=true' // fit to page width, false for actual size
+ '&sheetnames=true&printtitle=false' // hide optional headers and footers
+ '&pagenum=RIGHT&gridlines=false' // hide page numbers and gridlines
+ '&fzr=false' // do not repeat row headers (frozen rows) on each page
+ '&horizontal_alignment=CENTER' //LEFT/CENTER/RIGHT
+ '&vertical_alignment=TOP' //TOP/MIDDLE/BOTTOM
+ '&gid=' + sourceSheet.getSheetId(); // the sheet's Id
var token = ScriptApp.getOAuthToken();
// request export url
var response = UrlFetchApp.fetch(url, {
headers: {
'Authorization': 'Bearer ' + token
}
});
var theBlob = response.getBlob().setName(pdfName);
return theBlob;
};
最佳解决方案对我不起作用。损坏的引用,即使其中有“修复”。
不过以下是。
它更优雅一些,因为它“隐藏”了您不需要的工作表。与复制电子表格、删除工作表然后下载它的顶级解决方案相反。
function exportSheet() {
var sheetName = "YOUR SHEET NAME HERE"
var ss = SpreadsheetApp.openById("YOUR SPREADSHEET ID HERE")
var sheets = ss.getSheets();
for (var i = 0; i < sheets.length; i++) {
if (sheets[i].getSheetName() !== sheetName) {
sheets[i].hideSheet()
}
}
var newFile = DriveApp.createFile(ss.getBlob());
for (var i = 0; i < sheets.length; i++) {
sheets[i].showSheet()
}
newFile.newFile.moveTo(DriveApp.getFolderById("FolderID"));
//I just did this to move the file to somewhere else.
}