You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

打印Google Sheets单个工作表为PDF时保留公式引用

解决Google Sheets跨表引用下的PDF导出问题

我完全懂你的困扰——当工作表存在跨表引用时,常规脚本只复制单个表导出PDF,必然会因为缺少被引用的其他表而出现#REF!错误。下面是修改后的解决方案,通过复制完整工作簿来保留所有引用关系,再清理冗余工作表,最终导出和原文件同名、同位置的PDF:

完整脚本代码

function onOpen() {
  // 给Sheets添加自定义菜单
  const ui = SpreadsheetApp.getUi();
  ui.createMenu('导出工具')
    .addItem('打印为PDF', 'exportAsPDF')
    .addToUi();
}

function exportAsPDF() {
  try {
    const originalSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    const targetSheet = originalSpreadsheet.getActiveSheet();
    const sheetName = targetSheet.getName();
    const originalFileName = originalSpreadsheet.getName();
    const parentFolder = DriveApp.getFileById(originalSpreadsheet.getId()).getParents().next();

    // 复制整个工作簿到同一文件夹(保留所有引用)
    const tempSpreadsheet = originalSpreadsheet.copy(`${originalFileName} - PDF临时副本`);
    const allTempSheets = tempSpreadsheet.getSheets();

    // 删除副本中除目标工作表外的所有表
    allTempSheets.forEach(sheet => {
      if (sheet.getName() !== sheetName) {
        tempSpreadsheet.deleteSheet(sheet);
      }
    });

    // 构造PDF导出的请求链接
    const exportUrl = `https://docs.google.com/spreadsheets/d/${tempSpreadsheet.getId()}/export?` +
      `format=pdf` +
      `&size=letter` + // 可修改为A4、legal等纸张尺寸
      `&portrait=true` + // true为纵向,false为横向
      `&fitw=true` + // 自动适应页面宽度
      `&sheetnames=false&printtitle=false&pagenumbers=false` + // 隐藏页眉页脚的额外元素
      `&gridlines=false` + // 是否显示网格线,按需调整
      `&gid=${targetSheet.getSheetId()}`; // 指定要导出的工作表ID

    // 获取PDF内容并保存到原文件夹
    const response = UrlFetchApp.fetch(exportUrl, {
      headers: { 'Authorization': 'Bearer ' + ScriptApp.getOAuthToken() }
    });
    const pdfBlob = response.getBlob().setName(`${originalFileName}.pdf`);
    parentFolder.createFile(pdfBlob);

    // 清理临时工作簿(移到回收站)
    DriveApp.getFileById(tempSpreadsheet.getId()).setTrashed(true);

    // 导出成功提示
    SpreadsheetApp.getUi().alert('PDF已成功导出,保存至原文件所在文件夹!');
  } catch (error) {
    SpreadsheetApp.getUi().alert(`导出失败:${error.message}`);
  }
}

核心修改思路

  • 复制完整工作簿:不再单独复制单个工作表,而是复制整个工作簿,确保所有跨表引用在副本中依然有效,彻底避免#REF!错误。
  • 自动清理冗余表:复制完成后,自动删除副本中不需要的工作表,保证PDF只包含你需要的目标内容。
  • 保留原文件属性:导出的PDF和原表格同名,直接保存到原文件所在的Google Drive文件夹,无需手动调整位置和命名。
  • 异常捕获提示:添加错误处理逻辑,导出失败时会弹出具体错误信息,方便排查问题。

部署操作步骤

  1. 打开你的Google Sheets,点击菜单栏「扩展程序」→「Apps脚本」。
  2. 清空默认代码,粘贴上面的脚本内容。
  3. 点击保存按钮,给项目起一个易识别的名字(比如「PDF导出工具」)。
  4. 关闭脚本编辑器,刷新Sheets页面,顶部菜单栏会多出「导出工具」选项,点击「打印为PDF」即可执行导出。

注意:第一次运行脚本会要求授权,按照页面提示完成授权即可(需要允许脚本访问你的Google Drive和Sheets权限)。

内容的提问来源于stack exchange,提问作者Latent-code

火山引擎 最新活动