0

0

Google Apps Script教程:一键将Google文档导出为PDF

聖光之護

聖光之護

发布时间:2025-11-02 14:37:00

|

689人浏览过

|

来源于php中文网

原创

google apps script教程:一键将google文档导出为pdf

本教程将指导您如何利用Google Apps Script自动化将Google文档转换为PDF并提供下载。通过结合使用`DocumentApp`创建文档和`DriveApp`的`getFileById()`及`getAs('application/pdf')`方法,您可以轻松地将动态生成或现有Google文档导出为PDF格式,并提供下载链接,从而提高工作效率。

在日常办公自动化中,将Google文档(Google Docs)动态生成的内容导出为PDF格式是一个常见的需求。无论是报告、发票还是其他定制化文档,能够通过脚本一键生成并下载PDF,都能极大提升工作效率。本教程将详细介绍如何使用Google Apps Script实现这一功能。

核心实现原理

Google Apps Script提供了强大的DriveApp服务,允许我们与Google Drive中的文件进行交互。要将Google文档转换为PDF,主要利用以下两个关键步骤:

  1. 获取Google文档文件对象:通过DriveApp.getFileById(documentId)方法,根据Google文档的ID获取对应的文件对象。
  2. 转换为PDF格式的Blob:文件对象提供了getAs(mimeType)方法。通过指定'application/pdf'作为MIME类型,我们可以将文档内容转换为PDF格式的二进制大对象(Blob)。

获得PDF Blob后,您可以选择将其保存到Google Drive中,或者直接生成一个可供用户下载的链接。

详细步骤与代码示例

我们将基于您现有的脚本进行修改,使其在生成Google文档内容后,能够自动将其转换为PDF并提供下载。

1. 创建和填充Google文档

首先,您的脚本需要像原来一样创建Google文档并填充内容。这是生成PDF的基础。

Rose.ai
Rose.ai

一个云数据平台,帮助用户发现、可视化数据

下载
/**
 * 根据用户输入创建Google文档,并将其导出为PDF。
 */
function downloadGeneratedDocAsPdf() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();

  var userParams = [];
  for(var i = 0; i <= 5; i++) {
    userParams.push(data[i][1]);
  }

  // 假设 genData 函数已在其他地方实现,用于根据参数生成内容
  var problems = genData(
    userParams[0], userParams[1], userParams[2],
    userParams[3], userParams[4], userParams[5]
  );

  // 1. 创建Google文档并获取其ID
  var documentTitle = `Problems: ${userParams.toString().replace(/,/g, ", ")}`;
  var doc = DocumentApp.create(documentTitle);
  var docId = doc.getId(); // 获取新创建文档的ID
  var body = doc.getBody();

  // 设置文档样式
  var FontStyle = {};
  FontStyle[DocumentApp.Attribute.FONT_FAMILY] = "Courier";
  FontStyle[DocumentApp.Attribute.FONT_SIZE] = 24;
  body.setAttributes(FontStyle);

  // 写入内容到文档
  for(var i = 0; i < problems.length; i++) {
    body.appendParagraph(problems[i].replace(/,/g, ", ") + "\n");
  }

  // 确保所有更改已保存并关闭文档,以便DriveApp可以访问最新内容
  doc.saveAndClose();

  // ... 接下来的PDF转换逻辑
}

// genData 函数的占位符,实际应根据您的业务逻辑实现
function genData(param1, param2, param3, param4, param5, param6) {
  Logger.log(`Generating data with params: ${param1}, ${param2}, ${param3}, ${param4}, ${param5}, ${param6}`);
  return ["这是生成的第一行内容。", "这是生成的第二行内容,包含更多细节。"];
}

2. 将Google文档转换为PDF Blob

文档创建并保存后,我们可以使用DriveApp将其转换为PDF。

// 承接 downloadGeneratedDocAsPdf 函数内部

  // 2. 将Google文档转换为PDF Blob
  var docFile = DriveApp.getFileById(docId); // 根据文档ID获取文件对象
  var pdfBlob = docFile.getAs('application/pdf'); // 将文件内容转换为PDF格式的Blob

3. 在Google Drive中创建PDF文件(可选)

您可以选择将这个PDF Blob作为一个新的文件保存到Google Drive中。这样做的好处是,您可以得到一个持久的PDF文件,并能更方便地获取其下载链接。

// 承接 downloadGeneratedDocAsPdf 函数内部

  // 3. (可选)在Google Drive中创建PDF文件并命名
  // 如果您只是想直接下载而不保留在Drive中,可以跳过这一步,但通常建议创建
  var pdfFileName = `${documentTitle.replace(/[: ]/g, "_")}.pdf`; // 清理标题作为文件名
  var pdfFile = DriveApp.createFile(pdfBlob).setName(pdfFileName); // 在Drive中创建新文件

4. 获取PDF的查看/下载链接

获取PDF文件后,我们需要一个URL来让用户访问或下载它。

// 承接 downloadGeneratedDocAsPdf 函数内部

  // 4. 获取PDF的查看/下载链接
  // getDownloadUrl() 可以直接获取下载链接,但Apps Script中直接触发下载可能受权限限制。
  // 更推荐的方式是打开PDF的预览链接,用户可以在预览界面选择下载。
  var pdfViewUrl = `https://drive.google.com/file/d/${pdfFile.getId()}/view?usp=sharing`;
  // 如果需要尝试直接下载,可以使用:
  // var downloadUrl = pdfFile.getDownloadUrl();

5. 通过客户端脚本打开链接,触发下载或预览

由于Apps Script的服务器端脚本不能直接控制用户的浏览器行为(如打开新标签页),我们需要借助HtmlService来注入一段客户端JavaScript代码以实现此目的。

// 承接 downloadGeneratedDocAsPdf 函数内部

  // 5. 通过客户端脚本打开链接,触发下载或预览
  openUrlInNewTab(pdfViewUrl); // 调用辅助函数打开URL

  // 6. (可选)清理临时文件
  // 如果不需要保留原始Google Doc和生成的PDF,可以将其移动到回收站
  // docFile.setTrashed(true); // 将原始Google Doc移至回收站
  // pdfFile.setTrashed(true); // 将生成的PDF移至回收站
}

/**
 * 辅助函数:通过在模态对话框中嵌入JavaScript来在浏览器新标签页中打开URL。
 * 适用于从Google Sheets按钮或自定义菜单触发的Apps Script。
 * @param {string} url 要打开的URL。
 */
function openUrlInNewTab(url) {
  var htmlOutput = HtmlService.createHtmlOutput('<script>'
      + 'window.open("' + url + '", "_blank");' // 在新标签页打开URL
      + 'google.script.host.close();' // 关闭Apps Script创建的微型对话框
      + '</script>')
      .setWidth(100).setHeight(1); // 创建一个几乎不可见的微小对话框
  SpreadsheetApp.getUi().showModalDialog(htmlOutput, '正在打开PDF...'); // 显示对话框
}

完整代码示例

将上述所有片段整合,得到一个完整的Apps Script函数:

/**
 * 根据用户输入创建Google文档,并将其导出为PDF。
 * 该函数可绑定到Google Sheets中的按钮或自定义菜单。
 */
function downloadGeneratedDocAsPdf() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();

  var userParams = [];
  for(var i = 0; i <= 5; i++) {
    userParams.push(data[i][1]);
  }

  // 假设 genData 函数已在其他地方实现,用于根据参数生成内容
  var problems = genData(
    userParams[0], userParams[1], userParams[2],
    userParams[3], userParams[4], userParams[5]
  );

  // 1. 创建Google文档并获取其ID
  var documentTitle = `Problems: ${userParams.toString().replace(/,/g, ", ")}`;
  var doc = DocumentApp.create(documentTitle);
  var docId = doc.getId(); // 获取新创建文档的ID
  var body = doc.getBody();

  // 设置文档样式
  var FontStyle = {};
  FontStyle[DocumentApp.Attribute.FONT_FAMILY] = "Courier";
  FontStyle[DocumentApp.Attribute.FONT_SIZE] = 24;
  body.setAttributes(FontStyle);

  // 写入内容到文档
  for(var i = 0; i < problems.length; i++) {
    body.appendParagraph(problems[i].replace(/,/g, ", ") + "\n");
  }

  // 必须保存并关闭文档,确保所有更改已写入文件系统,以便DriveApp可以访问最新内容
  doc.saveAndClose();

  // 2. 将Google文档转换为PDF Blob
  var docFile = DriveApp.getFileById(docId); // 根据文档ID获取文件对象
  var pdfBlob = docFile.getAs('application/pdf'); // 将文件内容转换为PDF格式的Blob

  // 3. (可选)在Google Drive中创建PDF文件并命名
  // 这一步是可选的,如果只是想直接下载而不保留在Drive中,可以跳过。
  // 但为了获取一个稳定的下载链接,通常会先创建。
  var pdfFileName = `${documentTitle.replace(/[: ]/g, "_")}.pdf`; // 清理标题作为文件名
  var pdfFile = DriveApp.createFile(pdfBlob).setName(pdfFileName); // 在Drive中创建新文件

  // 4. 获取PDF的查看/下载链接
  // getDownloadUrl() 可以直接获取下载链接,但Apps Script中直接触发下载可能受权限限制。
  // 对于Apps Script,更推荐的方式是打开PDF的预览链接,用户可以在预览界面选择下载。
  var pdfViewUrl = `https://drive.google.com/file/d/${pdfFile.getId()}/view?usp=sharing`;

  // 5. 通过客户端脚本打开链接,触发下载或预览
  openUrlInNewTab(pdfViewUrl);

  // 6. (可选)清理临时文件
  // 如果不需要保留原始Google Doc和生成的PDF,可以将其移动到回收站
  // docFile.setTrashed(true); // 将原始Google Doc移至回收站
  // pdfFile.setTrashed(true); // 将生成的PDF移至回收站
}

/**
 * 辅助函数:通过在模态对话框中嵌入JavaScript来在浏览器新标签页中打开URL。
 * 适用于从Google Sheets按钮或自定义菜单触发的Apps Script。
 * @param {string} url 要打开的URL。
 */
function openUrlInNewTab(url) {
  var htmlOutput = HtmlService.createHtmlOutput('<script>'
      + 'window.open("' + url + '", "_blank");' // 在新标签页打开URL
      + 'google.script.host.close();' // 关闭Apps Script创建的微型对话框
      + '</script>')
      .setWidth(100).setHeight(1); // 创建一个几乎不可见的微小对话框
  SpreadsheetApp.getUi().showModalDialog(htmlOutput, '正在打开PDF...'); // 显示对话框
}

// genData 函数的占位符,实际应根据您的业务逻辑

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
PHP 命令行脚本与自动化任务开发
PHP 命令行脚本与自动化任务开发

本专题系统讲解 PHP 在命令行环境(CLI)下的开发与应用,内容涵盖 PHP CLI 基础、参数解析、文件与目录操作、日志输出、异常处理,以及与 Linux 定时任务(Cron)的结合使用。通过实战示例,帮助开发者掌握使用 PHP 构建 自动化脚本、批处理工具与后台任务程序 的能力。

67

2025.12.13

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

25

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

44

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

177

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

50

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

92

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

102

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

227

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

530

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 6万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.4万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号