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

Google Script问题:如何仅将指定工作表存为PDF至Drive指定文件夹

解决Google Script仅保存指定工作表为PDF到Drive文件夹的问题

问题根源

你当前保存到Drive的代码是直接将整个电子表格转换为PDF Blob,而非使用已经通过导出URL获取到的指定工作表的PDF内容:

SpreadsheetApp.getActiveSpreadsheet()
  .getBlob()
  .getAs(`application/pdf`)

这段代码会导出整个工作簿,而非你需要的JSA工作表。

修改方案

  1. 直接复用之前通过UrlFetchApp.fetch获取到的PDF内容(也就是res对象的内容),因为这部分已经是指定工作表的PDF。
  2. 修正文件名变量的重复拼接问题,避免生成错误的文件名。

修改后的完整代码

function downloadPdf() {
  var ss = SpreadsheetApp.getActive(),
    id = ss.getId(),
    // 直接获取目标工作表JSA,而非当前活动表
    sht = ss.getSheetByName("JSA"),
    shtId = sht.getSheetId(),
    url =
      'https://docs.google.com/spreadsheets/d/' +
      id +
      '/export' +
      '?format=pdf&gid=' +
      shtId
    + '&size=letter' // 纸张大小 legal / letter / A4
    + '&portrait=false' // 方向,false为横向
    + '&scale=2'  // 缩放比例 1=正常100% / 2=适配宽度 / 3=适配高度 / 4=适配页面
    + '&fitw=true'                   // 适配宽度,false为实际尺寸
    + '&top_margin=0.25'              // 必须设置四个边距!
    + '&bottom_margin=0.25'           // 必须设置四个边距!
    + '&left_margin=0.25'             // 必须设置四个边距!
    + '&right_margin=0.25'            // 必须设置四个边距!
    + '&sheetnames=false&printtitle=false' // 隐藏可选页眉页脚
    + '&pagenum=false&gridlines=false' // 隐藏页码和网格线
    + '&fzr=false' // 每页不重复行标题(冻结行)
    + '&horizontal_alignment=CENTER' // 水平对齐 LEFT/CENTER/RIGHT
    + '&vertical_alignment=TOP'; // 垂直对齐 TOP/MIDDLE/BOTTOM
  
  // 获取自定义文件名内容
  var val = SpreadsheetApp.getActive().getRange('H2').getValue();// 用getValue()而非getValues(),避免数组问题
  var val2= Utilities.formatDate(SpreadsheetApp.getActive().getRange("N2").getValue(), ss.getSpreadsheetTimeZone(), "MM/dd/YY");
  var val3= " - ";
  var pdfFileName = val + val3 + val2 + '.pdf';
  
  // 获取指定工作表的PDF内容
  var res = UrlFetchApp.fetch(url, {
    headers: { Authorization: 'Bearer ' + ScriptApp.getOAuthToken() },
  });
  
  // 触发前端下载
  SpreadsheetApp.getUi().showModelessDialog(
    HtmlService.createHtmlOutput(
      '<a target ="_blank" download="' +
        pdfFileName +
        '" href = "data:application/pdf;base64,' +
        Utilities.base64Encode(res.getContent()) +
        '">Click here</a> to download, if download did not start automatically' +
        '<script> \
        var a = document.querySelector("a"); \
        a.addEventListener("click",()=>{setTimeout(google.script.host.close,10)}); \
        a.click(); \
        </script>'
    ).setHeight(50),
    'Downloading PDF..'
  );

  // 保存PDF到指定Drive文件夹
  const folderName = `Test`;
  // 找到目标文件夹
  const targetFolder = DriveApp.getFoldersByName(folderName).next();
  // 使用已获取的PDF内容创建文件
  targetFolder.createFile(
    res.getBlob().setName(pdfFileName)
  );                    
}

关键修改点说明

  • 指定目标工作表:将sht = ss.getActiveSheet()改为sht = ss.getSheetByName("JSA"),确保导出的是固定的目标工作表,而非当前活动表。
  • 修正文件名获取:将getValues()改为getValue(),避免返回数组导致文件名拼接错误;同时新建pdfFileName变量统一管理文件名,避免重复拼接。
  • 复用PDF内容:保存到Drive时,直接使用res.getBlob(),这是已经通过导出URL获取到的JSA工作表的PDF内容,而非整个工作簿的Blob。
  • 代码可读性优化:拆分文件夹查找和文件创建步骤,让逻辑更清晰。

内容的提问来源于stack exchange,提问作者J.Raab

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 08:18:36