Google apps script 谷歌应用程序脚本问题格式化PDF

Google apps script 谷歌应用程序脚本问题格式化PDF,google-apps-script,google-sheets,pdf-generation,Google Apps Script,Google Sheets,Pdf Generation,我正在使用GAS在源电子表格中生成给定表单的PDF。 我的做法是首先将给定的表格复制到一个新的电子表格文件中,我称之为“中间”,对其进行样式设置,然后使用fileToPDF.getAs(“application/PDF”)将其转换为PDF格式 创建该文件后,它拥有我想要的所有内容,除了两个问题: 我已经使用sheet.getRange(borderRange).setBordOrder(true,true,true,true,true,true)将一些边框应用于一些范围并且它们在“中间”文件中

我正在使用GAS在源电子表格中生成给定表单的PDF。 我的做法是首先将给定的表格复制到一个新的电子表格文件中,我称之为“中间”,对其进行样式设置,然后使用
fileToPDF.getAs(“application/PDF”)将其转换为PDF格式

创建该文件后,它拥有我想要的所有内容,除了两个问题:

  • 我已经使用
    sheet.getRange(borderRange).setBordOrder(true,true,true,true,true,true)将一些边框应用于一些范围并且它们在“中间”文件中显示时没有问题。但是,它们会消失在PDF中
  • 我已经合并了一些范围集,这没有问题,但有一个大的例外,即工作表中最后一个合并的范围在PDF中没有显示为一个合并的单元格
我使用的代码如下所示:

函数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());
常量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);
样式表(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);
}
函数样式表(工作表){
//声明我们的常数
常数arrToMerge=[“B24:G24”、“B25:G25”、“B26:G26”、“B40:H40”、“B20:C20”、“B21:C21”、“B22:C22”];
常数arrToBorder=[“B20:D22”、“B24:H26”、“G27:H28”];
常数arrToBold=[“B11”、“B20”、“B21”、“B22”、“B24”、“B31”、“B33”、“B34”、“B35”、“B36”、“G28”、“H3”、“H24”、“H28”];
//直接调整
sheet.setHiddenGridlines(真);
表1.设置柱宽(1,15);
sheet.getDataRange().setFontFamily(“开放式SAN”);
表.getRange(“B40”).setWrap(真);
表.getRange(“B40:B47”).setFontSize(9);
表.自动重设零(40,1);
表1.设置柱宽(3,54);
//表1.设置柱宽(2,79);
第37、3、7页;
//表1.设置路高(40、7、16);
表.getRange(“h24”).设置水平对齐(“右”);
表1.getRange(“B24:H24”).setBackground(“#666666”).setFontColor(“白色”);
//用于多个范围调整的循环
for(让波幅变大){
sheet.getRange(range.merge();
}
for(arrToBold的let单元格){
表.getRange(单元格).setFontWeight(“粗体”);
}
for(订单的let范围){
sheet.getRange(range).setBorder(真,真,真,真,真,真);
}
}
为了便于理解,我还从原始文件中删除了一些单元格(没有真正删除代码中的所有引用,因此如果看到对单元格的引用看起来是空的,请不要感到惊讶)

下面的图片对应于:

原始电子表格

中间文件(生成此文件是因为原始电子表格中有许多工作表)

最终PDF

最后,一个

“getAs”(“application/pdf”)方法是否存在一些已知的奇怪行为?有没有办法让它正常工作

提前感谢您的帮助

不要使用
getAs()
将工作表导出为pdf 你可以自己做

  • 创建导出链接
    ”https://docs.google.com/spreadsheets/d/“+destId+”/export?”
  • 使用
  • 从响应的
  • 用于确保在执行导出为pdf之前完成电子表格的格式设置
样本:

函数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());
常量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);
SpreadsheetApp.flush();
样式表(destSheet);
SpreadsheetApp.flush();
const destId=dest.getId();
//这是新的
var token=ScriptApp.getOAuthToken();
变量url=”https://docs.google.com/spreadsheets/d/“+destId+”/export?”;
var url_ext='exportFormat=pdf&format=pdf'//导出为pdf/csv/xls/xlsx
//根据需要调整以下参数
+“&size=letter”//纸张大小合法/letter/A4
+“&纵向=真”//方向,横向为假
+“&top_margin=0.50”
+“&bottom_margin=0.50”
+“&左_边距=0.50”
+“&右边距=0.50”
+“&gridlines=false”
//其他参数,如果需要
/*
+“&fitw=true&source=labnol”//适合页面宽度,实际大小为false
+“&sheetnames=false&printtitle=false”//隐藏可选的页眉和页脚
+“&pagenumbers=false”//隐藏页码
+“&fzr=false”//不要在每页上重复行标题(冻结行)
+“&gid=”;//工作表的Id
*/
var response=UrlFetchApp.fetch(url+u