【发布时间】:2021-04-21 06:05:04
【问题描述】:
我正在使用 GAS 在源电子表格中生成给定工作表的 PDF。
我的方法是首先将给定的工作表复制到一个新的电子表格文件中,我称之为“中间”,设置样式,然后使用fileToPDF.getAs("application/pdf"); 将其 PDF 化。
文件被创建,它拥有我想要的一切,除了两个问题:
- 我使用
sheet.getRange(borderRange).setBorder(true, true, true, true, true, true);为某些范围应用了一些边框,它们在“中间”文件中显示没有问题。但是,它们在 PDF 中消失了。 - 我已经合并了几组范围,那里没有问题,但是有一个很大的例外,工作表中最后一个合并的范围在 PDF 中没有显示为一个合并的单元格。
我使用的代码如下:
function crearPdf() {
const ssID = SpreadsheetApp.getActiveSpreadsheet().getId();
const destFolder = DriveApp.getFileById(ssID).getParents().next();
const ss = SpreadsheetApp.getActiveSpreadsheet();
const ws = ss.getActiveSheet();
const sourceRange = ws.getRange(1, 1, ws.getMaxRows(), ws.getMaxColumns());
const numFac = ws.getRange("D20");
const sourceValues = sourceRange.getDisplayValues();
const dest = SpreadsheetApp.create("temp " + Date());
const destSheet = dest.getSheets()[0];
const destRange = destSheet.getRange(1, 1, destSheet.getMaxRows(), destSheet.getMaxColumns());
destRange.setValues(sourceValues);
styleSheet(destSheet);
const destId = dest.getId();
const fileToPDF = DriveApp.getFileById(destId);
const fileAsPDF = fileToPDF.getAs("application/pdf");
const newFile = DriveApp.createFile(fileAsPDF).setName("Factura " + numFac.getValue() + ' - ' + " '21");
// const fileUrl = newFile.getDownloadUrl();
newFile.moveTo(destFolder);
// fileToPDF.setTrashed(true);
}
function styleSheet(sheet) {
// Declaring our constants
const arrToMerge = ["B24:G24", "B25:G25", "B26:G26", "B40:H40", "B20:C20", "B21:C21", "B22:C22"];
const arrToBorder = ["B20:D22", "B24:H26", "G27:H28"];
const arrToBold = ["B11", "B20", "B21", "B22", "B24", "B31", "B33", "B34", "B35", "B36", "G28", "H3", "H24", "H28"];
// Direct tweaks
sheet.setHiddenGridlines(true);
sheet.setColumnWidth(1, 15);
sheet.getDataRange().setFontFamily("Open Sans");
sheet.getRange("B40").setWrap(true);
sheet.getRange("B40:B47").setFontSize(9);
sheet.autoResizeRows(40, 1);
sheet.setColumnWidth(3, 54);
// sheet.setColumnWidth(2, 79);
sheet.setRowHeights(37, 3, 7);
// sheet.setRowHeights(40, 7, 16);
sheet.getRange("h24").setHorizontalAlignment("right");
sheet.getRange("B24:H24").setBackground("#666666").setFontColor("white");
// Loops for multiple ranges tweaks
for (let range of arrToMerge) {
sheet.getRange(range).merge();
}
for (let cell of arrToBold) {
sheet.getRange(cell).setFontWeight("bold");
}
for (let range of arrToBorder) {
sheet.getRange(range).setBorder(true, true, true, true, true, true);
}
}
我还从原始文件中删除了一些单元格以使其更易于理解(并没有真正删除代码中的所有引用,所以如果您看到对看起来为空的单元格的引用不要感到惊讶)
而下图分别对应:
原始电子表格
中间文件(生成此文件是因为原始电子表格中有很多工作表)
最终的 PDF
最后,link to a public spreadsheet with dummy data
`getAs("application/pdf") 方法是否存在一些已知的奇怪行为?有没有办法让它正常工作?
提前感谢您的帮助!
【问题讨论】:
标签: google-apps-script google-sheets pdf-generation