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

Google Sheets脚本需求:实现多区域分页导出PDF

解决方案:多区域导出并合并为单PDF

核心逻辑:逐个导出每个区域为独立PDF Blob,再合并这些Blob为单个多页PDF。

完整修改代码

function ExportMultipleRangesToPDF() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getActiveSheet();
  
  // 定义需要导出的多个区域,顺序对应PDF页码顺序
  var targetRanges = [
    sheet.getRange("A1:C14"),
    sheet.getRange("A16:C29"),
    sheet.getRange("A31:C44")
    // 可继续添加更多区域,格式为 sheet.getRange("起始单元格:结束单元格")
  ];

  // 通用导出配置,可根据需求调整参数
  var baseExportUrl = 'https://docs.google.com/spreadsheets/d/' + spreadsheet.getId()
      + '/export?exportFormat=pdf&format=pdf'
      + '&size=A4'
      + '&portrait=true'
      + '&fitw=true'
      + '&top_margin=1'
      + '&bottom_margin=1'
      + '&left_margin=1'
      + '&right_margin=1'
      + '&sheetnames=false'
      + '&printtitle=false'
      + '&pagenum=false'
      + '&gridlines=false'
      + '&fzr=FALSE'
      + '&gid=' + sheet.getSheetId();

  var pdfBlobs = [];
  var authToken = ScriptApp.getOAuthToken();

  // 逐个导出每个区域为PDF Blob
  targetRanges.forEach(function(range) {
    var rangeExportUrl = baseExportUrl
        + '&r1=' + (range.getRow() - 1)
        + '&r2=' + range.getLastRow()
        + '&c1=' + (range.getColumn() - 1)
        + '&c2=' + range.getLastColumn();
    
    var response = UrlFetchApp.fetch(rangeExportUrl, {
      muteHttpExceptions: true,
      headers: { Authorization: 'Bearer ' + authToken }
    });
    
    pdfBlobs.push(response.getBlob());
  });

  // 合并多个PDF Blob为单个多页PDF
  var mergedPdf = mergePdfBlobs(pdfBlobs);
  mergedPdf.setName(spreadsheet.getName() + "_多区域导出.pdf");
  
  // 保存到Drive并弹出链接提示
  var savedFile = DriveApp.createFile(mergedPdf);
  SpreadsheetApp.getUi().alert("导出完成,PDF链接:\n" + savedFile.getUrl());
}

// 辅助函数:合并多个PDF Blob
function mergePdfBlobs(pdfBlobs) {
  if (pdfBlobs.length === 0) return null;
  if (pdfBlobs.length === 1) return pdfBlobs[0];

  var mergedBytes = [];
  var eofMarkerRegex = /%%EOF[\r\n]/g;

  pdfBlobs.forEach(function(blob, index) {
    var bytes = blob.getBytes();
    var content = Utilities.newBlob(bytes).getDataAsString();
    
    // 移除当前PDF的EOF标记(最后一个PDF保留)
    if (index !== pdfBlobs.length - 1) {
      content = content.replace(eofMarkerRegex, "");
      bytes = Utilities.newBlob(content).getBytes();
    }
    
    mergedBytes = mergedBytes.concat(Array.from(bytes));
  });

  return Utilities.newBlob(mergedBytes, "application/pdf");
}

关键说明

  • 区域配置:在targetRanges数组中添加或修改导出区域,数组顺序就是PDF的页码顺序
  • 合并逻辑:通过移除每个PDF(除最后一个)的%%EOF结束标记,将字节流拼接实现多页合并
  • 配置复用:抽离基础导出参数到baseExportUrl,减少重复代码,方便统一调整

使用步骤

  1. 打开Google Sheets对应的脚本编辑器
  2. 替换原代码为上述完整代码
  3. 修改targetRanges中的区域为你需要的范围
  4. 运行ExportMultipleRangesToPDF函数,授权后即可完成导出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 12:40:16