Google Apps Script Docs插件docx转PDF报错解决方法
问题根因
DocumentApp.getActiveDocument() 仅支持访问原生Google Docs格式的文档实例。当Docs插件打开的是.docx格式文件(Office兼容预览模式)时,该方法无法获取文档对象,会直接抛出文档不可访问的异常,也无法通过该对象直接导出PDF。
可行实现方案
不需要复制原文件生成副本再删除,直接通过Drive高级服务的导出接口,基于当前打开文件的ID直接完成内存级的PDF转换,全程不会在云盘生成额外文件,所有逻辑由代码自动完成,无手动操作步骤。
- 首先修改项目清单文件
appsscript.json,开启Drive v3高级服务并配置对应权限:
{ "timeZone": "Asia/Shanghai", "dependencies": { "enabledAdvancedServices": [ { "userSymbol": "Drive", "version": "v3", "serviceId": "drive" } ] }, "oauthScopes": [ "https://www.googleapis.com/auth/documents.currentonly", "https://www.googleapis.com/auth/drive.file" ], "runtimeVersion": "V8" }
- 替换原有导出PDF的业务代码,跳过
getActiveDocument()调用,直接通过文件ID导出PDF流:
function getPDF() { // 获取当前Docs环境打开的文件ID,同时兼容原生Google Doc、docx两种格式 const currentFileId = DocumentApp.getActiveDocumentSpec().getId(); // 调用Drive导出接口直接返回PDF二进制流,无临时文件生成 const pdfBlob = Drive.Files.export(currentFileId, 'application/pdf'); return { name: pdfBlob.getName().replace(/\.(docx|gdoc)$/i, '.pdf'), base64: Utilities.base64Encode(pdfBlob.getBytes()) }; }
方案说明
- 转换逻辑全程在内存中完成,不会在Google Drive中生成任何文件副本、临时转换文件,不需要执行额外的删除操作
- 不需要手动将docx文件转换为Google Docs格式,用户直接打开docx文件时插件即可正常导出PDF
- 注意必须在Apps Script编辑器的「高级服务」面板中确认Drive API已启用,否则会出现服务未定义的报错
内容的提问来源于stack exchange,提问作者MatejDodevski
相关产品推荐
相关产品推荐

