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

如何修改Google Apps Script,实现网页转类浏览器打印的纯文本PDF

问题

需要将Google Sheet中的批量URL转换为适合文本分析的纯文本PDF文件。现有Google Apps Script代码生成的PDF包含多余页眉、HTML元素,体验较差;而浏览器直接打印网页能得到干净的纯文本样式PDF。如何修改代码实现类似浏览器打印的效果?

原使用代码:

function saveURLAsPDF() {
  var ss = SpreadsheetApp.openById("1_4rjweZYHTTed6j740rVSZIFVPsrww6KvKwFikmlOzM")
  var sheetName = "Sheet1"
  var sheet = ss.getSheetByName(sheetName)
  var data = sheet.getDataRange().getValues()
  var links = data.map(function(e){return e[0]})
  //Logger.log(links) // DEBUG

  // Create a new folder
  var parentFolderId = "1ASMLEDl8rYEQG595TZYtZ9DVUa2u97n_"
  var parentFolder = DriveApp.getFolderById(parentFolderId);
  var pdfFolder = parentFolder.createFolder("PDFS");

  // create arrays to track errors, file url, and file name
  var errors = []
  var pdfURL = []
  var fileName = []

  for (var i=0;i<links.length;i++){
    //Logger.log("DEBUG: i"+i+", url:"+links[i])
    var url = links[i]
    var parseID = url.toString().split("/")[7]
    //Logger.log(parseID)
    var pdfName = +(i+1)+"-"+parseID+".pdf"
    //Logger.log("i:"+i+", name: "+pdfName)

    try{
      var response = UrlFetchApp.fetch(url);
      var htmlBody = response.getContentText();
      var blob = Utilities.newBlob(htmlBody,'text/html').getAs('application/pdf').setName(pdfName);     
      var newFile = pdfFolder.createFile(blob);
      var fileURL= newFile.getUrl()
      errors.push(['OK'])
      pdfURL.push([fileURL])
      fileName.push([pdfName])
  }
  catch (error){
    errors.push(["failed"])
    pdfURL.push([" "])
    fileName.push([" "])
   }
  }

  sheet.getRange(1,2,links.length,1).setValues(errors)
  sheet.getRange(1,3,links.length,1).setValues(fileName)
  sheet.getRange(1,4,links.length,1).setValues(pdfURL)
}

测试用Google Sheet:ID为1_4rjweZYHTTed6j740rVSZIFVPsrww6KvKwFikmlOzM的表格
问题表现:生成的PDF包含冗余元素,与浏览器打印的纯文本效果差异明显


解决方案

核心思路是模拟浏览器打印时的样式重置,通过注入自定义CSS隐藏冗余元素、优化排版,同时用HtmlService.createHtmlOutput替代直接转换原始HTML,还原浏览器级别的渲染效果。

修改后的代码

function saveURLAsPDF() {
  var ss = SpreadsheetApp.openById("1_4rjweZYHTTed6j740rVSZIFVPsrww6KvKwFikmlOzM")
  var sheetName = "Sheet1"
  var sheet = ss.getSheetByName(sheetName)
  var data = sheet.getDataRange().getValues()
  var links = data.map(function(e){return e[0]})

  var parentFolderId = "1ASMLEDl8rYEQG595TZYtZ9DVUa2u97n_"
  var parentFolder = DriveApp.getFolderById(parentFolderId);
  var pdfFolder = parentFolder.createFolder("PDFS");

  var errors = []
  var pdfURL = []
  var fileName = []

  // 自定义打印样式:隐藏冗余元素、优化文本排版
  var printStyle = `
    <style>
      @page {
        margin: 1cm;
        size: A4;
      }
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
      body {
        font-family: Arial, sans-serif;
        line-height: 1.6;
        color: #333;
        max-width: 100%;
        padding: 0.5cm;
      }
      /* 隐藏常见冗余元素,可根据目标网页调整选择器 */
      header, footer, nav, aside, .ad-banner, .sidebar, .menu-bar {
        display: none !important;
      }
      /* 保证内容自适应页面 */
      img {
        max-width: 100%;
        height: auto;
      }
      table {
        width: 100%;
        border-collapse: collapse;
        margin: 1em 0;
      }
      th, td {
        border: 1px solid #ddd;
        padding: 0.5em;
      }
    </style>
  `;

  for (var i=0;i<links.length;i++){
    var url = links[i]
    var parseID = url.toString().split("/")[7]
    var pdfName = (i+1)+"-"+parseID+".pdf"

    try{
      var response = UrlFetchApp.fetch(url);
      var htmlBody = response.getContentText();
      
      // 将自定义样式插入HTML头部
      var modifiedHtml = htmlBody.replace('</head>', printStyle + '</head>');
      
      // 用HtmlService模拟浏览器渲染,设置接近A4的尺寸
      var htmlOutput = HtmlService.createHtmlOutput(modifiedHtml)
        .setWidth(800)
        .setHeight(1130);
      
      var blob = htmlOutput.getAs('application/pdf').setName(pdfName);     
      var newFile = pdfFolder.createFile(blob);
      var fileURL= newFile.getUrl()
      errors.push(['OK'])
      pdfURL.push([fileURL])
      fileName.push([pdfName])
    }
    catch (error){
      errors.push(["failed"])
      pdfURL.push([" "])
      fileName.push([" "])
    }
  }

  sheet.getRange(1,2,links.length,1).setValues(errors)
  sheet.getRange(1,3,links.length,1).setValues(fileName)
  sheet.getRange(1,4,links.length,1).setValues(pdfURL)
}

关键修改说明

  • 注入自定义CSS:通过@page规则定义PDF页面边距和尺寸,重置全局样式消除默认间距,同时隐藏网页中常见的冗余模块(如导航栏、广告栏等),可根据目标网页的实际结构调整CSS选择器。
  • 使用HtmlService渲染:替代直接用Utilities.newBlob转换HTML,HtmlService模拟Chrome浏览器的渲染逻辑,生成的PDF排版更接近浏览器打印效果。
  • 设置渲染尺寸:通过setWidth和setHeight设置与A4纸匹配的渲染尺寸,保证内容排版的一致性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 17:33:23