使用Google Apps脚本将所有工作表转换为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$/,“”); //用于将图纸导

我正在尝试将包含多张表单的Google电子表格转换为PDF文件。下面的脚本可以工作,但它只创建一个带有电子表格最后一页的PDF

函数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对任何图纸进行操作。默认情况下,它希望处理包含脚本的“活动电子表格”

  • 只需“正常”授权即可操作;无需激活高级服务(嗯……您确实需要一些,请参阅)或摆弄
    oAuthConfig

    用于检索电子表格PDF的
    fetch()
    调用的OAuth2授权是通过授予的,这为当前用户提供了OAuth2.0访问令牌

通过一些研究和努力,您可以连接到一个在线PDF合并API,以生成单个PDF文件。除此之外,在谷歌提供一种将所有工作表导出为一个PDF的方法之前,你只能使用单独的文件。查看吉尔伯特的调整,获得多张床单的方法

脚本:

/**
*将电子表格中的一张或所有图纸导出为用户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()