【问题标题】:Is it possible to add page breaks into Google Spreadsheet using Apps Script?是否可以使用 Apps 脚本在 Google 电子表格中添加分页符?
【发布时间】:2019-10-14 23:13:33
【问题描述】:

我想在导出为 PDF 之前使用 Apps 脚本在我的 Google 电子表格中以编程方式设置分页符

应该可以,因为您可以在打印电子表格时手动设置分页符 (https://support.google.com/docs/answer/7663148?hl=en)

我在 Google Docs (https://developers.google.com/apps-script/reference/document/page-break) 中发现这是可能的,但他们没有在工作表上提及。

有没有办法做到这一点,即使它是“黑客”?

【问题讨论】:

  • 有一个更干净的PDF发送给客户
  • @victor-gabou 嗨,有分页符吗?
  • 嘿@AlexShevyakov,很遗憾没有,但是您可以将问题报告给 Google,希望有足够多的请求他们会看看...(电子表格 > 帮助和反馈 > 发送反馈)
  • @victor-gabou 试试下面的“hack”...

标签: pdf google-apps-script google-sheets page-break


【解决方案1】:

谈到“黑客”,当您尝试通过开发人员工具 - 网络将工作表另存为 PDF 时,您可能会尝试捕获从电子表格发送到 Google 的 HTTP 请求。

从这个链接你可以得到格式化参数 pc,在我的例子中是这样的:

[null,null,null,null,null,null,null,null,null,0,
[["1990607563"]],
10000000,null,null,null,null,null,null,null,null,null,null,null,null,null,null,
43866.56179325232,
null,null,
[0,null,1,0,0,0,1,1,1,1,2,1,null,null,2,1],
["A4",0,6,1,[0.75,0.75,0.7,0.7]],
null,0,
[["1990607563",[[45,92],[139,139]],[[0,15]]]],0]

地点:

[["1990607563",[[45,92],[139,139]],[[0,15]]]],0]  // page breaks parameters
  

请注意,我使用了自定义分页符和横向,这反映在上面的响应中。

综上所述,下面的代码可以解决问题:

function exportPDFtoGDrive (ssID, filename, source){
  var source = "1990607563"
  var dt = new Date();
  var d = encodeDate(dt.getFullYear(),dt.getMonth(),dt.getDate(),dt.getHours(),dt.getMinutes(),dt.getSeconds());
  var pc = [null,null,null,null,null,null,null,null,null,0,
            [[source]],
            10000000,null,null,null,null,null,null,null,null,null,null,null,null,null,null,
            d,
            null,null,
            [0,null,1,0,0,0,1,1,1,1,2,1,null,null,2,1],
            ["A4",0,6,1,[0.75,0.75,0.7,0.7]],
            null,0,
            [[source,[[45,92],[139,139]],[[0,15]]]],0];
           
  
 var folder = DriveApp.getFoldersByName("FolderNameGoesHere").next(); 
  
  var options = {
    'method': 'post',
    'payload': "a=true&pc="+JSON.stringify(pc)+"&gf=[]",
    'headers': {Authorization: "Bearer " + ScriptApp.getOAuthToken()},
      'muteHttpExceptions': true
};

const esid = (Math.round(Math.random()*10000000));
const theBlob = 
UrlFetchApp.fetch("https://docs.google.com/spreadsheets/d/"+ssID+"/pdf?id="+ssID+"&esid="+esid, options).getBlob();
folder.createFile(theBlob).setName(filename+".pdf");
}

function myExportPDFtoGDrive(){
  
  var ss = SpreadsheetApp.openById('yourSpreadSheetID');
  var sheet = ss.getSheetByName("NameGoesHere");

  var filename = ss.getName()+" ["+sheet.getName()+"]";
  exportPDFtoGDrive (ss.getId(),filename);
}

更详细的破解说明见此处 Export Google Sheets to PDF 虽然只有俄语。

【讨论】:

  • 感谢您的回答! encodeDate() 是从哪里来的?
  • 函数 encodeDate(yy,mm,dd,hh,ii,ss){ var days=[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; if(((yy % 4) == 0) && (((yy % 100) != 0) || ((yy % 400) == 0)))days[1]=29; for(var i=0; i
  • 哇哦,链接指南的作者所做的研究令人惊叹。我不会猜到谷歌表格实际上是在发送一个 pdf 的 url 请求。数组中的数据作者也有解释。
【解决方案2】:

我使用了一种解决方法。我通过改变行高来调整页面大小以适合我想要的纸张大小(A4)。 导出到 pdf 时,谷歌会更改大小以适应宽度。我将列的大小相加,然后相应地设置行高。数字是通过反复试验选择的。

var width = 0;
for(var z = 0; z < s4.getLastColumn(); z++){
  width += s4.getColumnWidth(z+1);
}
var a4PageHeightPixels = 1050 * width / 800;

因为我希望所有行的高度都相同,所以我将行高设置为我的页面高度除以行数。确保最后一行为空白后,我调整了最后一行以弥补舍入误差。

  rowHeight= Math.floor(a4PageHeightPixels/(numDataRows ));
  lastRowHeight = a4PageHeightPixels - (numDataRows -1) * rowHeight;
  s4.setRowHeights(pageFirstRow,numDataRows-1,rowHeight);
  s4.setRowHeight(pageFirstRow+numDataRows-1,lastRowHeight);

(s4 是我正在使用的表格)但是,我希望大多数人只想在每页底部插入一个空白行并调整其大小以适合 pdf 纸张大小。

【讨论】:

  • 您关于“我希望大多数人只想在每页底部插入一个空白行...”的评论是让我的头朝正确方向前进的原因 (+1)。
  • 我很惊讶在 gs 中没有办法自动执行此操作。
猜你喜欢
  • 2015-06-25
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 2016-09-25
  • 2023-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多