Google文档在日常办公中使用频率很高,但每次要生成PDF都得手动点文件菜单、选择下载、等待浏览器弹出保存窗口,重复操作多了非常烦人。其实Google提供了一套完全免费的脚本工具Google Apps Script,只要写上十几行代码,就能实现一键把当前文档或指定文档导出为PDF,甚至还能批量转换整个文件夹里的所有文件。这篇文章从零开始讲解完整实现过程,包括脚本怎么写、文档ID从哪里拿、如何加自定义菜单和定时任务,照着做就能跑起来。

一、Google Apps Script是什么,为什么适合做PDF导出
Google Apps Script是Google推出的基于JavaScript的云端脚本平台,可以直接操作Google文档、表格、幻灯片以及云端硬盘等几乎所有Google服务。它运行在Google的服务器上,不占用本地资源,也无需安装任何开发环境,只要有浏览器就能编写和运行脚本。
用它做PDF导出有天然的优势:Google Drive本身提供了导出接口,允许把Google Docs格式的文件转换成PDF、Word、HTML等多种格式,而Apps Script把这个能力封装成了简单的调用,几行代码就能拿到转换结果。相比调用外部转换API或者本地装软件,这种方式免费、稳定、速度快,导出的PDF排版也和文档里看到的基本一致。
另一个好处是脚本能和文档本身绑定。你可以把脚本挂到某个文档的自定义菜单里,点一下按钮就完成导出,也可以做成独立脚本批量处理多个文件,灵活性非常高。
二、核心代码:导出指定文档为PDF
先看核心实现。导出PDF的关键是使用DriveApp的getBlobById配合exportLinks思路,不过最常用的简洁写法是直接通过URL获取导出内容。下面的脚本把指定ID的Google文档转换成PDF并保存到云盘根目录:
function exportDocToPdf() {
// 替换成你自己的文档ID
var docId = '你的文档ID写在这里';
// 通过导出地址获取PDF内容
var url = 'https://docs.google.com/document/d/' + docId + '/export?format=pdf';
var blob = UrlFetchApp.fetch(url, {
headers: {
Authorization: 'Bearer ' + ScriptApp.getOAuthToken()
}
}).getBlob().setName('导出的文档.pdf');
// 保存到云端硬盘根目录
var pdfFile = DriveApp.createFile(blob);
Logger.log('PDF已生成,文件链接:' + pdfFile.getUrl());
}代码逻辑分三步:第一步拼接导出URL,其中format=pdf指定了输出格式;第二步用UrlFetchApp.fetch带上授权令牌去请求这个地址,拿到二进制内容并命名为PDF文件;第三步用DriveApp.createFile把内容存成云盘文件。运行后打开日志查看器就能看到生成的PDF链接。
这里有个关键点必须说明:Authorization请求头不能省略。因为Google文档默认是私有的,直接fetch导出地址会被重定向到登录页,拿到的就不是PDF而是HTML页面。加上ScriptApp.getOAuthToken()获取的令牌后,Google才认得这是脚本所有者发起的合法请求。此外,脚本还需要文档读取权限,第一次运行时会弹出授权窗口,按提示确认即可。
获取文档ID的方法也很简单:打开目标文档,看浏览器地址栏中/d/和/edit之间的那串字符就是ID。例如地址为https://docs.google.com/document/d/abc123xyz/edit,那么ID就是abc123xyz。
三、进阶:添加自定义菜单实现真正的一键导出
上面那种方式适合转换固定文档,但每次要改ID不方便。更实用的做法是把脚本绑定到文档上,并添加一个菜单项,点一下就导出当前文档。打开目标文档,依次点击扩展程序、Apps Script,进入绑定脚本的编辑器,写入以下代码:
function onOpen() {
// 文档打开时创建自定义菜单
DocumentApp.getUi()
.createMenu('PDF工具')
.addItem('导出当前文档为PDF', 'exportCurrentDoc')
.addToUi();
}
function exportCurrentDoc() {
var doc = DocumentApp.getActiveDocument();
var docId = doc.getId();
var docName = doc.getName();
var url = 'https://docs.google.com/document/d/' + docId + '/export?format=pdf';
var blob = UrlFetchApp.fetch(url, {
headers: {
Authorization: 'Bearer ' + ScriptApp.getOAuthToken()
}
}).getBlob().setName(docName + '.pdf');
var pdfFile = DriveApp.createFile(blob);
DocumentApp.getUi().alert('导出成功!PDF链接:\n' + pdfFile.getUrl());
}onOpen是内置触发函数,文档每次被打开时会自动执行,从而在菜单栏生成一个叫PDF工具的菜单。点击导出当前文档为PDF后,脚本通过DocumentApp.getActiveDocument()拿到当前文档对象,自动获取ID和文件名,导出的PDF也会以文档原名命名,不需要手动修改任何参数。
如果希望PDF保存到指定文件夹而不是根目录,可以把DriveApp.createFile(blob)改成先获取目标文件夹再创建文件。比如DriveApp.getFolderById('文件夹ID')拿到文件夹对象后,调用folder.createFile(blob)即可,文件夹ID同样可以从浏览器地址栏中找到。
四、批量转换与定时任务
批量场景也很常见,比如把某个文件夹里所有Google文档统一转成PDF归档。思路是遍历文件夹中的文件,筛选出文档类型的文件逐个导出:
function exportFolderToPdf() {
var folder = DriveApp.getFolderById('文件夹ID');
var files = folder.getFilesByType(MimeType.GOOGLE_DOCS);
while (files.hasNext()) {
var file = files.next();
var url = 'https://docs.google.com/document/d/' + file.getId() + '/export?format=pdf';
var blob = UrlFetchApp.fetch(url, {
headers: {
Authorization: 'Bearer ' + ScriptApp.getOAuthToken()
}
}).getBlob().setName(file.getName() + '.pdf');
folder.createFile(blob);
Logger.log('已完成:' + file.getName());
}
}getFilesByType(MimeType.GOOGLE_DOCS)只筛选Google文档,跳过已经存在的PDF和其他格式文件,避免重复转换。生成的PDF直接放在同一文件夹里,方便对照检查。
想实现定时自动转换,可以在脚本编辑器的触发器页面新建时间驱动触发器,比如设置为每天凌晨两点执行一次批量导出函数,这样团队共享文件夹里的文档每天都会自动归档出PDF版本,完全不需要人工干预。需要注意的是免费账号的执行总时长有配额限制,单个文件夹文件量特别大时建议分批处理或者拆分成多个触发任务。
五、常见问题与注意事项
使用过程中可能会遇到几个典型问题。一是授权报错,通常是因为脚本作用域不够,检查脚本是否声明了对文档和外部请求的权限,或者重新走一遍授权流程。二是导出的PDF内容为空或者变成HTML,大概率是授权头没加或者令牌过期,重新运行一次脚本一般就能解决。三是文件名包含斜杠等特殊字符会导致创建失败,保存前最好做一次字符替换处理。
另外要提醒的是,导出接口对Google Docs编辑页面有效,如果你操作的是表格,把URL中的document/d/换成spreadsheets/d/并加上导出参数即可;幻灯片同理换成presentation/d/。掌握这个规律后,三类文档的PDF导出都可以用同一套代码思路搞定,日常办公中的自动化需求基本都能覆盖。
Google Apps ScriptGoogle文档导出PDFPDF导出脚本修改时间:2026-09-12 19:06:33