You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Sheets导出PDF:如何实现跨页文本自动分页显示?

Google Sheets导出PDF自动分页解决方案

问题背景

我编写了一个Google Sheets脚本,可从表格文件中获取多个单元格区域,并将每个区域导出为PDF的单页。目前脚本运行正常,但遇到核心问题:当某行内容超出A4页面尺寸时,页面外的内容无法显示。请问是否有办法实现自动分页,让超出的文本显示在新页面上?

原脚本代码:

async function PDFAngebot() {
  var sheetId = "1949460457"; // Sheet ID – 链接末尾的数字部分
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var ssId = ss.getId();
  var sheet = ss.getSheetByName('AN_Vorlage');

  var pageAmmount = sheet.getRange('V13').getValue();
  pageAmmount -= 1;
  var rangeVariable =3 + pageAmmount;
  var rangeInput = 'X3' + ':' + 'X' + rangeVariable;
  var ranges = sheet.getRange(rangeInput).getValues(); // 需要导出的区域

  ss.toast('pageAmmount: ' + pageAmmount + 'rangeVariable: ' + rangeVariable + 'ranges: ' + ranges);

  var token = ScriptApp.getOAuthToken();
  var data = ranges.map(r => {
    var url = `https://docs.google.com/spreadsheets/d/${ssId}/export?format=pdf&exportFormat=pdf&size=A4&portrait=true&scale=2&top_margin=0.15&left_margin=0&right_margin=0&bottom_margin=0.15&range=${r}&gid=${sheetId}`;
    return new Uint8Array(UrlFetchApp.fetch(url, { headers: { Authorization: "Bearer " + token } }).getContent());
  });

  // 加载pdf-lib.js
  var cdnUrl = "https://cdn.jsdelivr.net/npm/pdf-lib/dist/pdf-lib.min.js";
  eval(UrlFetchApp.fetch(cdnUrl).getContentText().replace(/setTimeout\(.*?,.*?(\d*?)\)/g, "Utilities.sleep($1);return t();"));
  // 合并PDF数据
  var pdfDoc = await PDFLib.PDFDocument.create();
  for (let i = 0; i < data.length; i++) {
    var pdfData = await PDFLib.PDFDocument.load(data[i]);
    var pages = await pdfDoc.copyPages(pdfData, [...Array(pdfData.getPageCount())].map((_, i) => i));
    pages.forEach(page => pdfDoc.addPage(page));
  }
  var bytes = await pdfDoc.save();
  var contents = Utilities.newBlob([...new Int8Array(bytes)], MimeType.PDF, "sample.pdf");

  // 保存PDF到指定文件夹
  var inputs = sheet.getRange('H9:H10').getValues();
  var folder = DriveApp.getFolderById(inputs[1][0]);
  DriveApp.createFile(contents).setName(inputs[0][0] + ".pdf").moveTo(folder);
}

解决方案

1. 利用Google Sheets原生分页能力(最简单有效)

你当前的脚本通过range=${r}参数强制每个区域为单页,导致超出内容被截断。Google Sheets本身支持根据A4尺寸自动分页,只需修改导出逻辑:

  • 先在AN_Vorlage工作表中,通过文件>设置打印区域>设置打印区域指定整体导出范围
  • 若需要手动控制分页位置,右键目标行号选择「插入分页符」;也可让系统根据A4高度自动拆分页面
  • 修改导出URL,移除range=${r}参数,让Google Sheets自动处理分页

2. 修改后的完整脚本

async function PDFAngebot() {
  var sheetId = "1949460457"; // Sheet ID – 链接末尾的数字部分
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var ssId = ss.getId();
  var sheet = ss.getSheetByName('AN_Vorlage');

  // 可选:给目标区域设置自动换行,减少内容溢出
  sheet.getRange("A1:Z" + sheet.getLastRow()).setWrap(true);

  var token = ScriptApp.getOAuthToken();
  // 移除range参数,让系统自动按A4分页
  var url = `https://docs.google.com/spreadsheets/d/${ssId}/export?format=pdf&exportFormat=pdf&size=A4&portrait=true&scale=2&top_margin=0.15&left_margin=0&right_margin=0&bottom_margin=0.15&gid=${sheetId}&fitw=true&gridlines=false`;
  // 直接导出带自动分页的完整PDF
  var data = [new Uint8Array(UrlFetchApp.fetch(url, { headers: { Authorization: "Bearer " + token } }).getContent())];

  // 加载pdf-lib合并PDF(单PDF可省略此步骤,直接保存)
  var cdnUrl = "https://cdn.jsdelivr.net/npm/pdf-lib/dist/pdf-lib.min.js";
  eval(UrlFetchApp.fetch(cdnUrl).getContentText().replace(/setTimeout\(.*?,.*?(\d*?)\)/g, "Utilities.sleep($1);return t();"));
  
  var pdfDoc = await PDFLib.PDFDocument.create();
  for (let i = 0; i < data.length; i++) {
    var pdfData = await PDFLib.PDFDocument.load(data[i]);
    var pages = await pdfDoc.copyPages(pdfData, [...Array(pdfData.getPageCount())].map((_, i) => i));
    pages.forEach(page => pdfDoc.addPage(page));
  }
  var bytes = await pdfDoc.save();
  var contents = Utilities.newBlob([...new Int8Array(bytes)], MimeType.PDF, "sample.pdf");

  // 保存到指定文件夹
  var inputs = sheet.getRange('H9:H10').getValues();
  var folder = DriveApp.getFolderById(inputs[1][0]);
  DriveApp.createFile(contents).setName(inputs[0][0] + ".pdf").moveTo(folder);
}

3. 保留多区域导出同时支持分页(进阶)

如果必须按原逻辑导出多个独立区域且每个区域自动分页,可临时切换打印区域:

// 保存原打印区域
var originalPrintRange = sheet.getPrintRange();
var data = ranges.map(r => {
  // 设置当前区域为打印区域
  sheet.setPrintRange(r);
  var url = `https://docs.google.com/spreadsheets/d/${ssId}/export?format=pdf&exportFormat=pdf&size=A4&portrait=true&scale=2&top_margin=0.15&left_margin=0&right_margin=0&bottom_margin=0.15&gid=${sheetId}&fitw=true&gridlines=false`;
  return new Uint8Array(UrlFetchApp.fetch(url, { headers: { Authorization: "Bearer " + token } }).getContent());
});
// 恢复原打印区域
sheet.setPrintRange(originalPrintRange);

内容的提问来源于stack exchange,提问作者godspeed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 10:45:06