首页 > 解决方案 > 在 Google Sheet 中保存为 PDF 脚本

问题描述

我已经看过社区,但我正在努力构建脚本应该执行以下操作:

我尝试录制宏但不起作用。你能给出一些关于如何继续前进的提示吗?谢谢。

标签: google-apps-script

解决方案


这些参考链接可以帮助您获得一些关于如何实现目标的提示:

第一个链接向您展示了如何将一系列单元格下载为 PDF:

将谷歌表格中的一系列单元格以 PDF 格式下载到本地计算机和其他自动化脚本的脚本?

参考第一个链接并由 ZektorH 回答的将范围导出为无边框 PDF 的脚本:

function downloadRangeToPdf() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getRange("A1:E20");

  //Create temporary Spreadsheet
  var tempSpreadsheet = SpreadsheetApp.create("tempSheetInvoiceExport", range.getValues().length, range.getValues()[0].length);
  var tempSheet = tempSpreadsheet.getSheets()[0];
  var tempRange = tempSheet.getRange("A1:E20");

  tempRange.setValues(range.getDisplayValues());
  tempRange.setTextStyles(range.getTextStyles());
  tempRange.setBackgrounds(range.getBackgrounds());
  tempRange.setFontColors(range.getFontColors());
  tempRange.setFontFamilies(range.getFontFamilies());
  tempRange.setFontLines(range.getFontLines());
  tempRange.setFontStyles(range.getFontStyles());
  tempRange.setFontWeights(range.getFontWeights());
  tempRange.setHorizontalAlignments(range.getHorizontalAlignments());
  tempRange.setNumberFormats(range.getNumberFormats());
  tempRange.setTextDirections(range.getTextDirections());
  tempRange.setTextRotations(range.getTextRotations());
  tempRange.setVerticalAlignments(range.getVerticalAlignments());
  tempRange.setWrapStrategies(range.getWrapStrategies());

  SpreadsheetApp.flush(); //Force changes to be written before proceeding.

  //Generate Download As PDF Link

  var url = 'https://docs.google.com/spreadsheets/d/{ID}/export?'.replace('{ID}', tempSpreadsheet.getId());
  var exportOptions = 'exportFormat=pdf&format=pdf' + // export as pdf / csv / xls / xlsx
    '&size=letter' + // paper size legal / letter / A4
    '&portrait=true' + // orientation, false for landscape
    '&fitw=true&source=labnol' + // fit to page width, false for actual size
    '&sheetnames=false&printtitle=false' + // hide optional headers and footers
    '&pagenumbers=false&gridlines=false' + // hide page numbers and gridlines
    '&fzr=false' + // do not repeat row headers (frozen rows) on each page
    '&top_margin=0.00' + //All four margins must be set!
    '&bottom_margin=0.00' + //All four margins must be set!
    '&left_margin=0.00' + //All four margins must be set!
    '&right_margin=0.00' + //All four margins must be set!
    '&gridlines=false' + //true/false
    '&gid=' + tempSheet.getSheetId(); // the sheet's Id
  var token = ScriptApp.getOAuthToken();

  var blob = UrlFetchApp.fetch(url + exportOptions, {
    headers: {
                               Authorization: 'Bearer '+token
    }
  }).getBlob().setName(tempSpreadsheet.getName()+".pdf");

  var pdfFile = DriveApp.createFile(blob);

  var downloadLink = HtmlService
    .createHtmlOutput('<p>Download your file <a href="' + pdfFile.getUrl() + '" target="_blank">here</a>.</p>')
    .setWidth(200)
    .setHeight(100);

  SpreadsheetApp.getUi().showModalDialog(downloadLink, "Download PDF");

  DriveApp.getFileById(tempSpreadsheet.getId()).setTrashed(true); //Place temporary sheet on trash

}

然后第二个链接向您展示如何将电子表格作为 PDF 下载到本地计算机。您可以在这里最好地参考 Tanaike 的回答:

如何以 PDF 格式下载单张纸(不导出到 Google Drive)

已编辑(在下面回答您的问题):

您需要使用第二张工作表的 sheetID 来保存第二张工作表的 PDF。

你应该改变

从:

var sheetId = SpreadsheetApp.getActiveSheet().getSheetId();

至:

var sheetId = ss.getSheetId();

因为您通过以下逻辑获得第二个电子表格的引用:

var ss = SpreadsheetApp.getActiveSpreadsheet().getSheets()[1];

因此,您只需要使用以下代码来获取第二个电子表格的工作表 ID:

var sheetId = ss.getSheetId();

对于您的原始逻辑,即var sheetId = SpreadsheetApp.getActiveSheet().getSheetId(); 它只会获得第一张纸的 sheetId。


推荐阅读