使用Google Apps脚本将所有工作表转换为PDF
我正在尝试将包含多张表单的Google电子表格转换为PDF文件。下面的脚本可以工作,但它只创建一个带有电子表格最后一页的PDF使用Google Apps脚本将所有工作表转换为PDF,pdf,google-apps-script,google-sheets,pdf-generation,Pdf,Google Apps Script,Google Sheets,Pdf Generation,我正在尝试将包含多张表单的Google电子表格转换为PDF文件。下面的脚本可以工作,但它只创建一个带有电子表格最后一页的PDF 函数savePDFs(){ SpreadsheetApp.flush(); var ss=SpreadsheetApp.getActiveSpreadsheet(); var sheets=ss.getSheets(); var url=ss.getUrl(); //从url中删除尾部的“编辑” url=url.replace(/edit$/,“”); //用于将图纸导
函数savePDFs(){
SpreadsheetApp.flush();
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sheets=ss.getSheets();
var url=ss.getUrl();
//从url中删除尾部的“编辑”
url=url.replace(/edit$/,“”);
//用于将图纸导出为pdf格式的其他参数
var url_ext='export?exportFormat=pdf&format=pdf'+//导出为pdf
//以下参数是可选的。。。
'&size=字母'+//纸张大小
“&trait=false”+//方向,横向为false
“&fitw=true”+//适合宽度,实际尺寸为false
'&sheetnames=false&printtitle=false&PageNumber=false'+//隐藏可选
“&gridlines=false”+//false=隐藏网格线
'&fzr=false'+//不要在每页上重复行标题(冻结行)
“&gid=”;//暂时将ID保留为空,这将在for循环中填充
var token=ScriptApp.getOAuthToken();
//创建一个空数组来保存获取的blob
var blobs=[];
//.fetch被调用,响应存储在var blobs[]
对于(变量i=0;i
此函数是对“ianshedd…”提供的脚本的改编
它:
- 生成电子表格中所有图纸的PDF,并将其存储在包含电子表格的同一文件夹中。(它假设只有一个文件夹可以执行此操作,尽管驱动器允许多个容器。)
- 使用电子表格和工作表名称命名pdf文件
- 使用驱动器服务(不推荐使用DocsList。)
- 可以使用可选的电子表格ID对任何图纸进行操作。默认情况下,它希望处理包含脚本的“活动电子表格”
- 只需“正常”授权即可操作;无需激活高级服务(嗯……您确实需要一些,请参阅)或摆弄
用于检索电子表格PDF的oAuthConfig
调用的OAuth2授权是通过授予的,这为当前用户提供了OAuth2.0访问令牌fetch()
/**
*将电子表格中的一张或所有图纸导出为用户Google Drive上的PDF文件,
*在包含原始电子表格的同一文件夹中。
*
*改编自https://code.google.com/p/google-apps-script-issues/issues/detail?id=3579#c25
*
*要导出的电子表格的@param{String}optSSId(可选)ID。
*如果未提供,脚本将假定它是
*工作表绑定并打开激活的电子表格。
*要导出的单个工作表的@param{String}optSheetId(可选)ID。
*如果未提供,将导出所有图纸。
*/
函数savePDFs(optSSId、optSheetId){
//如果提供了工作表ID,请打开该工作表,否则假定脚本为
//绑定图纸,然后打开激活的电子表格。
var ss=(optSSId)?SpreadsheetApp.openById(optSSId):SpreadsheetApp.getActiveSpreadsheet();
//获取电子表格的URL,并删除尾部的“编辑”
var url=ss.getUrl().replace(/edit$/,“”);
//获取包含电子表格的文件夹,以便以后导出
var parents=DriveApp.getFileById(ss.getId()).getParents();
if(parents.hasNext()){
var folder=parents.next();
}
否则{
folder=DriveApp.getRootFolder();
}
//获取电子表格中所有工作表的数组
var sheets=ss.getSheets();
//循环浏览所有图纸,生成PDF文件。
对于(var i=0;i我稍微调整了@Mogsdad代码,将整个电子表格打印为一个PDF。关键是调整导出参数。基本上替换为
'&gid=' + sheet.getSheetId() //the sheet's Id
与
所以上面的代码减去循环看起来像:
function savePDFs( optSSId, optSheetId ) {
// If a sheet ID was provided, open that sheet, otherwise assume script is
// sheet-bound, and open the active spreadsheet.
var ss = (optSSId) ? SpreadsheetApp.openById(optSSId) : SpreadsheetApp.getActiveSpreadsheet();
// Get folder containing spreadsheet, for later export
var parents = DriveApp.getFileById(ss.getId()).getParents();
if (parents.hasNext()) {
var folder = parents.next();
}
else {
folder = DriveApp.getRootFolder();
}
//additional parameters for exporting the sheet as a pdf
var url_ext = 'export?exportFormat=pdf&format=pdf' //export as pdf
// Print either the entire Spreadsheet or the specified sheet if optSheetId is provided
+ (optSheetId ? ('&gid=' + sheet.getSheetId()) : ('&id=' + ss.getId()))
// following parameters are optional...
+ '&size=letter' // paper size
+ '&portrait=true' // orientation, false for landscape
+ '&fitw=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("https://docs.google.com/spreadsheets/" + url_ext, options);
var blob = response.getBlob().setName(ss.getName() + '.pdf');
//from here you should be able to use and manipulate the blob to send and email or create a file per usual.
//In this example, I save the pdf to drive
folder.createFile(blob);
}
顺便说一句,谢谢——我一直在寻找解决方案!我还没有发表评论的名声,但是吉尔伯特W提交的上面的答案似乎有一个小问题……尽管我很可能没有理解一些东西
该解决方案包括生产线
+ (optSheetId ? ('&gid=' + sheet.getSheetId()) : ('&id=' + ss.getId()))
但是,在此之前,代码中未定义“sheet”。在Mogsdad的代码中,“sheet”是在已删除的循环中定义的:
for (var i=0; i<sheets.length; i++) {
var sheet = sheets[i];
这个解决方案适用于那些想要打印整个电子表格的人,这是被问到的问题。但是,代码不再适用于那些想要打印单个页面的人
Gilbert更新代码的另一个问题是HTML请求包含了对工作表ID的引用,而不是spr
for (var i=0; i<sheets.length; i++) {
var sheet = sheets[i];
var sheets = ss.getSheets();
function savePDFs( optSSId , optSheetName , optOutputName, optEmail) {
// If a sheet ID was provided, open that sheet, otherwise assume script is
// sheet-bound, and open the active spreadsheet.
var ss = (optSSId) ? SpreadsheetApp.openById(optSSId) : SpreadsheetApp.getActiveSpreadsheet();
var optSheetId = ss.getSheetByName(optSheetName).getSheetId();
var outputName = (optOutputName ? optOutputName : (optSheetName ? optSheetName : ss.getName()))
// Get folder containing spreadsheet, for later export
var parents = DriveApp.getFileById(ss.getId()).getParents();
if (parents.hasNext()) {
var folder = parents.next();
}
else {
folder = DriveApp.getRootFolder();
}
var url_base = ss.getUrl().replace(/edit$/,'');
//additional parameters for exporting the sheet as a pdf
var url_ext = 'export?exportFormat=pdf&format=pdf' //export as pdf
// Print either the entire Spreadsheet or the specified sheet if optSheetId is provided
+ (optSheetId ? ('&gid=' + optSheetId) : ('&id=' + ss.getId())) // Print either the entire Spreadsheet or the specified sheet if optSheetId is provided
// following parameters are optional...
+ '&size=letter' // paper size
+ '&portrait=true' // orientation, false for landscape
+ '&fitw=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_base + url_ext, options);
var blob = response.getBlob().setName((outputName)+ '.pdf');
folder.createFile(blob);
GmailApp.sendEmail(optEmail, "Here is a file named " + outputName, "Please let me know if you have any questions or comments.", {attachments:blob});
}
function test() {
// Create a PDF containing all the tabs in the active spreadsheet, name it
// after the spreadsheet, and email it
convertSpreadsheetToPdf('user@email.com')
// Create a PDF containing all the tabs in the spreadsheet specified, name it
// after the spreadsheet, and email it
convertSpreadsheetToPdf('user@email.com', '1r9INcnsyvSQmeduJWVYAvznOOYei9jeAjsy0acA3G1k')
// Create a PDF just containing the tab 'Sheet2' in the active spreadsheet, specify a name, and email it
convertSpreadsheetToPdf('user@email.com', null, 'Sheet2', 'PDF 3')
}
/*
* Save spreadsheet as a PDF
*
* @param {String} email Where to send the PDF [OPTIONAL]
* @param {String} spreadsheetId Or the active spreadsheet[OPTIONAL]
* @param {String} sheetName The tab to output [OPTIONAL]
* @param {String} PdfName [OPTIONAL]
*/
function convertSpreadsheetToPdf(email, spreadsheetId, sheetName, pdfName) {
var spreadsheet = spreadsheetId ? SpreadsheetApp.openById(spreadsheetId) : SpreadsheetApp.getActiveSpreadsheet();
spreadsheetId = spreadsheetId ? spreadsheetId : spreadsheet.getId()
var sheetId = sheetName ? spreadsheet.getSheetByName(sheetName).getSheetId() : null;
var pdfName = pdfName ? pdfName : spreadsheet.getName();
var parents = DriveApp.getFileById(spreadsheetId).getParents();
var folder = parents.hasNext() ? parents.next() : DriveApp.getRootFolder();
var url_base = spreadsheet.getUrl().replace(/edit$/,'');
var url_ext = 'export?exportFormat=pdf&format=pdf' //export as pdf
// Print either the entire Spreadsheet or the specified sheet if optSheetId is provided
+ (sheetId ? ('&gid=' + sheetId) : ('&id=' + spreadsheetId))
// following parameters are optional...
+ '&size=letter' // paper size
+ '&portrait=true' // orientation, false for landscape
+ '&fitw=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_base + url_ext, options);
var blob = response.getBlob().setName(pdfName + '.pdf');
folder.createFile(blob);
if (email) {
var mailOptions = {
attachments:blob
}
MailApp.sendEmail(
email,
"Here is a file named " + pdfName,
"Please let me know if you have any questions or comments.",
mailOptions);
}
} // convertSpreadsheetToPdf()