如何用Google Apps Script把已创建的电子表格下载为xlsx或CSV格式
Google Apps Script 创建的电子表格导出为本地xlsx/CSV格式的实现方案
你已经通过 const newDocument = SpreadsheetApp.create("docname"); 完成了云端电子表格的创建,要实现xlsx或CSV格式的本地下载,核心是通过Drive的导出能力生成带授权的可访问文件流,再触发浏览器下载流程,具体实现步骤如下:
核心导出链接构建逻辑
拿到已创建电子表格的文件ID后,可以直接拼接对应格式的导出接口地址:
- xlsx格式导出地址:
const fileId = newDocument.getId(); const xlsxExportBaseUrl = `https://www.googleapis.com/drive/v3/files/${fileId}/export?mimeType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet&alt=media`; - CSV格式导出地址:
注意:CSV格式仅支持单次导出单个工作表的内容,无法一次性导出多Sheet为单个CSV文件const csvExportBaseUrl = `https://www.googleapis.com/drive/v3/files/${fileId}/export?mimeType=text/csv&alt=media`;
触发本地下载的两种实现路径
Apps Script 本身无法在纯脚本运行环境下直接唤起浏览器的本地下载动作,需要根据使用场景选择对应的实现方式:
快速测试:生成临时授权下载链接
运行脚本时自动给导出链接加上当前账号的授权token,弹出链接供用户点击,点击后即可直接触发对应格式的文件下载:
function generateDownloadLink() { const newDocument = SpreadsheetApp.create("docname"); const fileId = newDocument.getId(); // 获取当前登录用户的临时授权token const authToken = ScriptApp.getOAuthToken(); // 拼接带权限的xlsx下载链接 const fullXlsxLink = `https://www.googleapis.com/drive/v3/files/${fileId}/export?mimeType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet&alt=media&access_token=${authToken}`; // 在表格界面弹出提示,展示可点击的下载链接 SpreadsheetApp.getUi().alert(`文件已创建,点击下载xlsx文件:${fullXlsxLink}`); }
注意:该临时链接仅对当前登录的Google账号有效,有效期约1小时,不可泄露给未授权用户
正式使用:部署Web应用实现一键自动下载
如果需要实现用户打开页面就自动触发下载的体验,可以将脚本部署为Web应用,结合前端逻辑自动完成下载流程:
- 先在脚本项目的“高级服务”中开启 Drive API 权限
- 编写对应服务端和前端逻辑:
// 服务端方法:获取指定格式的文件Blob对象 function getFileBlob() { const newDocument = SpreadsheetApp.create("docname"); const fileId = newDocument.getId(); // 以xlsx格式拉取文件内容,需要导出CSV格式时替换mimeType为text/csv即可 const fileBlob = Drive.Files.get(fileId, { alt: "media", mimeType: MimeType.MICROSOFT_EXCEL }).getBlob(); fileBlob.setName("docname.xlsx"); return fileBlob; } // Web应用入口 function doGet() { return HtmlService.createHtmlOutput(` <script> // 页面加载完成后自动获取文件流,触发下载 window.addEventListener('load', () => { google.script.run.withSuccessHandler((blob) => { const blobUrl = URL.createObjectURL(blob); const downloadAnchor = document.createElement('a'); downloadAnchor.href = blobUrl; downloadAnchor.download = 'docname.xlsx'; downloadAnchor.click(); URL.revokeObjectURL(blobUrl); }).getFileBlob(); }) </script> `); }
常见注意事项
- 未开启Drive API高级服务时,调用
Drive.Files相关方法会报权限错误,需要先在脚本编辑器的“项目设置-高级服务”中完成启用 - 导出CSV格式时如果需要覆盖所有工作表内容,需要逐表拉取内容拼接后再生成对应的CSV文件流
- 带授权token的导出链接不要嵌入公开可访问的页面,避免非授权用户访问到你的文件内容
内容的提问来源于stack exchange,提问作者Nane Petrosyan
相关产品推荐
相关产品推荐

