google-apps-script - 在 Google Sheet 中保存为 PDF 脚本
问题描述
我已经看过社区,但我正在努力构建脚本应该执行以下操作:
- 选择 Google Sheet 工作表的特定范围的单元格
- 将所选区域保存为 PDF 以在 PC 上下载(无需保存到 GDrive 或为 PDF 添加特定名称)
我尝试录制宏但不起作用。你能给出一些关于如何继续前进的提示吗?谢谢。
解决方案
这些参考链接可以帮助您获得一些关于如何实现目标的提示:
第一个链接向您展示了如何将一系列单元格下载为 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。
推荐阅读
- javascript - FirebaseError browserErrorMessage:“无法注册 ServiceWorker:ServiceWorker 脚本评估失败”
- python - Esri 磁贴不显示 PyViz
- css - React Semantic UI - 步骤组件未在卡片上正确显示
- enums - 用 List 变量定义枚举
类型 - math - 如何实现自适应步长 Runge-Kutta Cash-Karp?
- makefile - 如何使用 cmake 增量生成 makefile
- ssh - 通过 SSH 隧道进行远程调试:接收“在套接字 y 上发送 x 字节时出现问题:管道损坏”
- php - 带有值会话的 JSON 文件?
- javascript - 在不使用 async/await 的情况下按顺序执行一组 Promise
- c# - Datagridview - 将选定的单元格复制到新的 DataTable