【问题标题】:Export Individual Sheet to PDF将单个工作表导出为 PDF
【发布时间】:2020-11-23 00:24:40
【问题描述】:

编辑:我解决了我的问题 事实证明,它是从我作为备份的另一个 .gs 文件中提取函数,我从未注释掉该函数。它总是简单的事情。

我有一个我修改并运行良好的脚本here,但它没有任何隐藏网格线的功能。

我花了几个小时搜索,发现这个效果非常好,但它会导出整个文档,而不仅仅是我需要的单个工作表。我需要做什么才能让它只导出第一张工作表?

//global
        var SS = SpreadsheetApp.getActiveSpreadsheet();
        var Invoice_Sheet = SS.getSheetByName("Private Invoice");

function generatePdf() {
  // 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
      // following parameters are optional...
      + '&size=A4'      // 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
      + '&gid=0'; //first page
  var options = {
    headers: {
      'Authorization': 'Bearer ' +  ScriptApp.getOAuthToken()
    }
  }
  var Name = Invoice_Sheet.getRange("C12").getValue();
  var curDate = Utilities.formatDate(new Date(), "GMT+1", "dd/MM/yyyy")
  var pdfName = Name + " - " + curDate + " - " + "Suds Invoice";
  var response = UrlFetchApp.fetch("https://docs.google.com/spreadsheets/" + url_ext, options);
  var blob = response.getBlob().setName(pdfName + '.pdf');

  folder.createFile(blob);

}

【问题讨论】:

    标签: google-apps-script google-sheets google-drive-api


    【解决方案1】:

    解释:

    你需要在你的代码中做如下两处修改:

    • 您需要在主 url 中指定电子表格 ID:

      "https://docs.google.com/spreadsheets/d/"+ ssID

      在哪里:var ss = SpreadsheetApp.getActive(); & var ssID = ss.getId();

    • 您需要指定要从中提取 pdf 的工作表的 gid。在您的情况下,鉴于 Invoice_Sheet 是所需的工作表,您需要找到它的 gid:

      var shID = Invoice_Sheet.getSheetId();

      然后将其添加到url_ext 变量中。

    在您的代码中,已包含第 2 步。但我认为问题在于gid=0 可能不是第一张纸或Invoice_Sheet。

    解决办法:

    //global
    var SS = SpreadsheetApp.getActiveSpreadsheet();
    var Invoice_Sheet = SS.getSheetByName("Private Invoice");
    
    function generatePdf() {
    // 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 ssID = SS.getId();
      var shID = Invoice_Sheet.getSheetId();
    
      //additional parameters for exporting the sheet as a pdf
    
      var url_ext = "/export?exportFormat=pdf&format=pdf"+
          // following parameters are optional...
          + '&size=A4'      // 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
          + '&gid='+shID; // NEW CODE
    
      
        var options = {
        headers: {
          'Authorization': 'Bearer ' +  ScriptApp.getOAuthToken()
        }
      }
      
      var Name = Invoice_Sheet.getRange("C12").getValue();
      var curDate = Utilities.formatDate(new Date(), "GMT+1", "dd/MM/yyyy")
      var pdfName = Name + " - " + curDate + " - " + "Suds Invoice";
      var response = UrlFetchApp.fetch("https://docs.google.com/spreadsheets/d/"+ ssID + url_ext, options); // NEW CODE
      var blob = response.getBlob().setName(pdfName + '.pdf');
    
      folder.createFile(blob);
    
    }
    

    请注意:

    如果您不想获得Invoice_Sheet 的 pdf,而是 first 表的 pdf,则使用相同的代码并替换:

    var shID = Invoice_Sheet.getSheetId();

    与:

    var shID = ss.getSheets()[0].getSheetId();

    【讨论】:

    • 抱歉,我有一些全局变量。我用额外的变量编辑了这篇文章。我尝试了您建议的编辑,但它仍在生成包含所有工作表的 pdf。
    • @liamgore 现在检查我的完整解决方案。如果这不起作用,很遗憾我无法重现该问题,因为它对我有用。确保您正在查看正确文档的正确文件夹。您可能会打开一些旧文档,并且所有工作表都可见。确保您确实看到了新生成的 pdf。
    • 好吧,它仍然不起作用,我会养成在运行它之前隐藏多余的工作表的习惯,然后再试一次。感谢您的帮助!
    • @liamgore 确保在脚本编辑器中更新代码后保存更改。如果您手动执行函数generatePdf,则会自动保存脚本。但如果您通过自定义按钮菜单使用它,则需要保存更改。我知道这些是基本的东西,但我们经常忽略一些使我们的代码表现不同的细节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    • 2017-01-19
    • 2019-10-18
    • 2016-12-09
    • 1970-01-01
    • 2016-11-15
    相关资源
    最近更新 更多