【问题标题】:Export a Google sheet as PDF setting parameters such as margin将 Google 表格导出为 PDF 设置参数,例如边距
【发布时间】:2020-03-11 21:42:56
【问题描述】:

我正在尝试将电子表格中的特定工作表导出到 PDF 文件,文件将根据单元格值设置名称,我想设置导出设置,以便所有边距都设置为 0

我在网上获得了以下代码,并对其进行了修改以满足我的需要,但导出并没有像我想要的那样通过文件名,它也没有将导出边距设置为 0 并适合页面:

有没有人知道我如何通过应用程序脚本来做到这一点(如果有人有更好的脚本,我愿意尝试:))

function exportPDF() { 
  var sourceSpreadsheet = SpreadsheetApp.getActive();

  var sheets = sourceSpreadsheet.getSheets();
  var sheetName = sourceSpreadsheet.getActiveSheet().getName();
  var sourceSheet = sourceSpreadsheet.getSheetByName("Agreement");

  var ss = SpreadsheetApp.getActive();
  var sh = ss.getSheetByName("Agreement");
  var sheet = ss.getSheetByName("Input");
  var name = sheet.getRange("C3").getValue();
  var company = sheet.getRange("C4").getValue();
  var order = sheet.getRange("C11").getValue();
  var gAcc = sheet.getRange("C12").getValue();
  var pdfName = "Agreement_" & name;

  if(company != "")
  {
    pdfName = pdfName + "_" & company & "_" & order & "_" & gAcc;
  }
  else
  {
    pdfName = pdfName + "_" & order & "_" & gAcc;
  }

  var parents = DriveApp.getFileById(sourceSpreadsheet.getId()).getParents();
  if (parents.hasNext()) {
    var folder = parents.next();
  }
  else {
    folder = DriveApp.getRootFolder();
  }

  var destSpreadsheet = SpreadsheetApp.open(DriveApp.getFileById(sourceSpreadsheet.getId()).makeCopy("tmp_convert_to_pdf", folder))

  var sheets = destSpreadsheet.getSheets();
  for (i = 0; i < sheets.length; i++) {
    if (sheets[i].getSheetName() != sheetName){
      destSpreadsheet.deleteSheet(sheets[i]);
    }
  }

  var destSheet = destSpreadsheet.getSheets()[0];

  var sourceRange = sourceSheet.getRange("A1:I57");
  var sourcevalues = sourceRange.getValues();
  var destRange = destSheet.getRange(1, 1, destSheet.getMaxRows(), destSheet.getMaxColumns());
  destRange.setValues(sourcevalues);

  var theBlob = destSpreadsheet.getBlob().getAs('application/pdf').setName(pdfName);
  var newFile = folder.createFile(theBlob);

  DriveApp.getFileById(destSpreadsheet.getId()).setTrashed(true);
}

【问题讨论】:

标签: google-apps-script google-sheets


【解决方案1】:

文件名是通过重新排列代码并正确连接一些字符串来实现的。

我在几个地方修改了你的脚本,如下:

function exportPDF() { 

  var sourceSpreadsheet = SpreadsheetApp.getActive();

  var sheets = sourceSpreadsheet.getSheets();
  var sheetName = sourceSpreadsheet.getActiveSheet().getName();
  var sourceSheet = sourceSpreadsheet.getSheetByName("Agreement");

  var name = sourceSheet.getRange("C3").getValue();
  var company = sourceSheet.getRange("C4").getValue();
  var order = sourceSheet.getRange("C11").getValue();
  var gAcc = sourceSheet.getRange("C12").getValue();
  var pdfName = "Agreement_" + name;

  if(company != "")
  {
    pdfName = pdfName + "_" + company + "_" + order + "_" + gAcc;
  }
  else
  {
    pdfName = pdfName + "_" + order + "_" + gAcc;
  }

  var parents = DriveApp.getFileById(sourceSpreadsheet.getId()).getParents();
  var folder;
  if (parents.hasNext()) {
     folder = parents.next();
  }
  else {
    folder = DriveApp.getRootFolder();
  }

  var destSpreadsheet = SpreadsheetApp.open(DriveApp.getFileById(sourceSpreadsheet.getId()).makeCopy(pdfName, folder))

  var sheets = destSpreadsheet.getSheets();
  for (i = 0; i < sheets.length; i++) {
    if (sheets[i].getSheetName() != sheetName){
      destSpreadsheet.deleteSheet(sheets[i]);
    }
  }

  var destSheet = destSpreadsheet.getSheets()[0];

  var sourceRange = sourceSheet.getDataRange();
  var sourcevalues = sourceRange.getValues();
  var destRange = destSheet.setActiveSelection(sourceRange.getA1Notation());
  destRange.setValues(sourcevalues);

  var theBlob = getBlob();
  var newFile = folder.createFile(theBlob).setName(pdfName);

  DriveApp.getFileById(destSpreadsheet.getId()).setTrashed(true);
}

到目前为止,您已经创建了一个包含所需数据和名称的 pdf。但是边距仍然不是您想要的。


设置 pdf 边距:

使用 UrlFetchApp 获取 blob

function getBlob(){
  var url = 'https://docs.google.com/spreadsheets/d/';
  var id = '<YOUR-FILE-ID>';
  var url_ext = '/export?'
  +'format=pdf'
  +'&size=a4'                      //A3/A4/A5/B4/B5/letter/tabloid/legal/statement/executive/folio
  +'&portrait=true'                //true= Potrait / false= Landscape
  +'&scale=1'                      //1= Normal 100% / 2= Fit to width / 3= Fit to height / 4= Fit to 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=true'               //true/false
  +'&printnotes=false'             //true/false
  +'&pageorder=2'                  //1= Down, then over / 2= Over, then down
  +'&horizontal_alignment=LEFT'  //LEFT/CENTER/RIGHT
  +'&vertical_alignment=TOP'       //TOP/MIDDLE/BOTTOM
  +'&printtitle=false'             //true/false
  +'&sheetnames=false'             //true/false
  +'&fzr=false'                    //true/false
  +'&fzc=false'                    //true/false
  +'&attachment=false'
  +'&gid=0';
  // console.log(url+id+url_ext);
  var blob = UrlFetchApp.fetch(url+id+url_ext).getBlob().getAs('application/pdf');
  return blob;
}

你有它。从工作表导出的没有边距的 pdf。

注意: 为避免在使用UrlFetchApp 时进行身份验证,您可以公开您的工作表

【讨论】:

  • 能否提供这些 url 参数的文档链接?
【解决方案2】:

我一直在寻找如何获得缩放因子,也就是缩放(在第 5 缩放模式下,即在 GUI 中自定义)。

spct(比例百分比,例如 1.3 表示 130%)必须与 scale=5 参数结合使用。

看起来像...&amp;scale=5&amp;spct=1.3&amp;...

【讨论】:

  • 作为一种解决方法,可以将比例设置为适合宽度/高度然后修改边距吗?
  • @MattBowyer 我已经尝试过该选项,但没有按预期工作。修改边距只能为隐藏单元格出现在可用区域中提供更多可用空间,而不是缩放/缩放。无论我尝试什么选项 (scale={1..4}),它都没有提供任何缩放效果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-28
  • 2016-02-16
  • 1970-01-01
相关资源
最近更新 更多