【问题标题】:Exporting Specific Range of Cells to PDF - Google Sheets将特定范围的单元格导出为 PDF - Google 表格
【发布时间】:2020-04-23 18:58:03
【问题描述】:

我使用 Google 电子表格创建发票。我想要一个脚本,通过它我可以导出 PDF 格式的选定范围 (F1:M44),文件名为发票编号(单元格 B2)+“发票”。
我已经尝试过来自堆栈和 youtube 的代码。它们都是用于导出工作表,而不是特定范围。

【问题讨论】:

  • 如何将该范围复制到临时工作表,导出然后将其删除。
  • 我通过选择范围 > 打印 > 打印所选单元格然后将文件另存为 pdf 来实现。我想减少这些步骤。一键保存文件

标签: google-apps-script google-sheets google-sheets-formula spreadsheet


【解决方案1】:

解决方案

为了能够将特定范围导出为 PDF,因为 Apps 脚本中没有特定的工具来执行此操作,您需要执行解决方法。

以下解决方法将自动将我们要导出的范围复制到新的空白电子表格中,然后只能导出确切的范围

为什么我们需要一个新的电子表格?

为了导出一个范围而不妨碍所有空白单元格,我们需要隐藏所有不相关的行和列。为此,最简单的方法是将所需范围粘贴到工作表的第一个单元格 (A1)。

此外,默认情况下,这将导出电子表格的所有工作表,因此我们只能将这个新范围的工作表安排在第一个单元格中,以避免其他数据介于两者之间。为避免删除原始工作表,实现此目的的最佳方法是创建一个新的电子表格,并在该过程完成后将其删除。

这是解决此问题的脚本。用 cmets 自行解释:

function myFunction() {
  // Get the range of cells you want to export 
  var rangeValues = SpreadsheetApp.getActive().getSheetByName('Sheet1').getRange('D10:F13').getValues();
  // Get the Drive folder you want to store your PDF to. Otherwise use root folder (if you dont mind about this)
  var folder = DriveApp.getFolderById('FOLDERID');
  
  // Create a blank spreadsheet to be able to export just the range
  var destSpreadsheet = SpreadsheetApp.create('PDF');
  
  // Check first if the sheet you are going to create exists. Otherwsie create it and copy paste the range
  // we want to export as PDF in the first values of the sheet. I.e if our range is 5 rows and 6 columns we want
  // it to be copied from A1 to F5 for example. Then we can hide the rest of columns and rows and export 
  // what we have left
  var sheet2 = destSpreadsheet.getSheetByName('sheet2');
  if(!sheet2){
    destSpreadsheet.insertSheet('sheet2').getRange('A1:C4').setValues(rangeValues);
    var sheet2 = destSpreadsheet.getSheetByName('sheet2');
  }
  
  // Hide all the rows and columns that do not have content 
  sheet2.hideRows(sheet2.getLastRow()+1, sheet2.getMaxRows()-sheet2.getLastRow());
  sheet2.hideColumns(sheet2.getLastColumn()+1, sheet2.getMaxColumns()-sheet2.getLastColumn());
  // Delete the first sheet that is automatically created when you create a new spreadsheet
  destSpreadsheet.deleteSheet(destSpreadsheet.getSheetByName('Sheet1'));
  
  // Export our new spreadsheet to PDF
  var theBlob = destSpreadsheet.getBlob().getAs('application/pdf').setName('pdf');
  var newFile = folder.createFile(theBlob);
  
  //Delete the spreadsheet we created to export this range. 
  DriveApp.getFileById(destSpreadsheet.getId()).setTrashed(true);
}

我希望这对您有所帮助。让我知道您是否需要其他任何内容或者您是否不理解某些内容。 :)

【讨论】:

  • 这很好用,并且可以生成值的 pdf 但是我如何发送格式(包括字体、列宽等的常规格式以及条件格式?)我看不到 setFormatting 之类的有一个 setValues
【解决方案2】:

您必须添加引用该范围的参数。此示例将下载范围 b2:e46 :

https://docs.google.com/spreadsheets/d/{spreadsheet_id}/export?exportFormat=pdf&format=pdf&gridlines=false&size=A4&gid={gid_id}&range=b2:e46

以下是虚拟 ID:

{spreadsheet_id} 是一个长字符串,代表电子表格e.g. 3qT8h59XF67dac7dBL694VLSRPTCQ0_isnP--BBBpnrQ

{gid_id} 是工作表的id e.g. 2563688945

还可以根据需要更改range e.g. B2:E46 or B:E or 2:46

【讨论】:

  • 这很好用,但是链接只能在桌面浏览器上打开 pdf。在移动设备上,您需要将链接复制并粘贴到 chrome 浏览器本身中,否则它会打开 google docs 应用程序?
【解决方案3】:

我发现这个适用于 Windows 的解决方案非常方便: How to Print sheet/range using .gs script in Google Sheets? 它不需要创建新的电子表格。相反,您首先选择工作表上的单元格,然后单击“打印”按钮,然后将所选范围传递给创建 PDF 的命令。 但是,我将在电子表格中创建一个新的临时工作表,而不是一个完整的新电子表格,将电子表格中各个位置的数据复制到其中,然后打印,然后将其删除。

【讨论】:

    【解决方案4】:

    这个答案非常具体到这个问题。它包括问题中要求导出的范围的范围“F1:M44”。此外,PDF 文件的名称来自 B2 中的单元格。

    可以从您的 Google 表格中导出一个范围,而无需隐藏表格选项卡、行和列,也无需创建临时的新电子表格。

    function exportRngToPdf(range,shTabName) {
      var blob,exportUrl,name,options,pdfFile,response,sheetTabId,ss,ssID,url_base;
    
      range = range ? range : "F1:M44";//Set the default to whatever you want
    
      shTabName = "Sheet1";//Replace the name with the sheet tab name for your situation
      ss = SpreadsheetApp.getActiveSpreadsheet();//This assumes that the Apps Script project is bound to a G-Sheet
      ssID = ss.getId();
      sh = ss.getSheetByName(shTabName);
      sheetTabId = sh.getSheetId();
      url_base = ss.getUrl().replace(/edit$/,'');
      name = sh.getRange("B2").getValue();
      name = name + "invoice"
    
      //Logger.log('url_base: ' + url_base)
    
      exportUrl = url_base + 'export?exportFormat=pdf&format=pdf' +
    
        '&gid=' + sheetTabId + '&id=' + ssID +
        '&range=' + range + 
        //'&range=NamedRange +
        '&size=A4' +     // paper size
        '&portrait=true' +   // orientation, false for landscape
        '&fitw=true' +       // fit to width, false for actual size
        '&sheetnames=true&printtitle=false&pagenumbers=true' + //hide optional headers and footers
        '&gridlines=false' + // hide gridlines
        '&fzr=false';       // do not repeat row headers (frozen rows) on each page
    
      //Logger.log('exportUrl: ' + exportUrl)
    
      options = {
        headers: {
          'Authorization': 'Bearer ' +  ScriptApp.getOAuthToken(),
        }
      }
    
      options.muteHttpExceptions = true;//Make sure this is always set
    
      response = UrlFetchApp.fetch(exportUrl, options);
    
      //Logger.log(response.getResponseCode())
    
      if (response.getResponseCode() !== 200) {
        console.log("Error exporting Sheet to PDF!  Response Code: " + response.getResponseCode());
        return;
    
      }
      
      blob = response.getBlob();
      blob.setName(name + '.pdf')
    
      pdfFile = DriveApp.createFile(blob);//Create the PDF file
      //Logger.log('pdfFile ID: ' +pdfFile.getId())
    }
    

    已使用多种策略将 Google 表格的一部分导出为 PDF。

    • 创建一个仅包含所需内容的新电子表格文件
    • 创建一个新的工作表选项卡,将内容放在工作表选项卡中并隐藏任何 其他工作表标签,隐藏不需要的行和列
    • 使用范围设置构建下载 URL
      • 使用范围地址
      • 使用命名范围 - &gid=sheetId&range=NamedRange
    • 将内容导出到 Google 文档并从 Google 文档创建 PDF
    • 将 G-Sheet 内容与模板文件合并,并从 模板文件。
    • 从工作表中获取一系列内容,将其转换为 HTML 并使用 用于创建 PDF 文件的 HTML

    我会使用构建下载 URL 的方法,下载 URL 中包含的范围。

    【讨论】:

      【解决方案5】:

      我将上述参数与 JavaScript 结合使用。

      参数如下:

      export?format=pdf&size=A4&fzr=true&portrait=true&fitw=true&gridlines=false&printtitle=false&sheetnames=false&pagenum=UNDEFINED&gid=1215564098&ir=false&ic=false&r1=0&c1=6&r2=44&c2=20&attachment=true
      

      结合JavaScript,这就是结果。我创建了一个书签并将以下 JavaScript 作为 URL。

      javascript:var winURL = window.location.href;if(winURL.indexOf('/edit#gid=') > 0)%7Bwindow.location.assign(winURL.replace('/edit#gid=', '/export?format=pdf&size=A4&fzr=true&portrait=true&fitw=true&gridlines=false&printtitle=false&sheetnames=false&pagenum=UNDEFINED&ir=false&ic=false&r1=0&c1=6&r2=44&c2=20&attachment=true&gid='));%7Delse%7Balert('Incorrect URL format');%7D
      

      每次我需要导出 Google 表格时,我只需单击书签即可完成导出。我希望这也能对你有所帮助。

      我仍然缺少一个参数,这是重命名导出的 PDF 的可能性。

      【讨论】:

        猜你喜欢
        • 2022-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-19
        • 1970-01-01
        相关资源
        最近更新 更多