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

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的基础。

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

Google AI Studio

Google 推出的基于浏览器的集成开发环境

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

查看详情 Google Apps Script教程:一键将Google文档导出为PDF

/**  * 根据用户输入创建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 函数的占位符,实际应根据您的业务逻辑

暂无评论

发送评论 编辑评论


				
上一篇
下一篇
text=ZqhQzanResources