使用Google Apps Script按文件夹ID压缩文件并获取压缩包ID遇阻求助
修正后的Google Drive文件夹压缩方案
原代码存在的问题
getBlobs函数的return blobs写在while循环内部,仅能获取文件夹内第一个文件的Blob,无法收集全部文件。Utilities.zip生成的是Blob对象,没有getId()方法,必须将该Blob保存到Drive中才能获取文件ID。- 未声明
folder、zipFileId等变量,存在隐式全局变量风险。
修正后的完整代码
// 获取指定文件夹内所有文件的Blob集合(保留原文件名) function getBlobs(folderId) { const blobs = []; const folder = DriveApp.getFolderById(folderId); const files = folder.getFiles(); while (files.hasNext()) { const file = files.next(); blobs.push(file.getBlob().setName(file.getName())); } return blobs; } // 将Blob集合压缩并保存到Drive,返回压缩包文件ID function zipFilesInFolder(folderId, zipFilename) { const blobs = getBlobs(folderId); if (blobs.length === 0) { throw new Error("目标文件夹内无文件可压缩"); } const zipBlob = Utilities.zip(blobs, `${zipFilename}.zip`); // 将压缩包保存到Drive根目录,可修改为指定文件夹保存 const zipFile = DriveApp.createFile(zipBlob); Logger.log("压缩包文件ID: " + zipFile.getId()); return zipFile.getId(); } // 示例调用 function testZip() { const targetFolderId = "123456789a94..."; // 替换为你的目标文件夹ID const zipName = "myzip"; try { const zipFileId = zipFilesInFolder(targetFolderId, zipName); console.log("压缩完成,文件ID: " + zipFileId); } catch (err) { console.error(err.message); } }
关键说明
getBlobs中通过setName(file.getName())为Blob绑定原文件名,避免压缩包内文件丢失原始名称。zipFilesInFolder新增空文件判断,避免无文件时执行压缩报错;通过DriveApp.createFile(zipBlob)将压缩包Blob保存到Drive,从而获取到合法的文件ID。
步骤b:生成共享下载链接并嵌入HTML
拿到压缩包FileId后,可通过以下代码生成符合共享权限的下载链接,并嵌入HTML模板:
// 根据文件ID生成共享下载链接(适配共享驱动器权限) function getDownloadLink(fileId) { const file = DriveApp.getFileById(fileId); // 按共享驱动器权限设置文件可见性,可根据需求调整权限等级 file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW); return file.getDownloadUrl(); } // 生成包含下载链接的HTML内容 function generateDownloadHtml(zipFileId) { const downloadUrl = getDownloadLink(zipFileId); return ` <html> <body> <h3>压缩包下载</h3> <a href="${downloadUrl}" target="_blank">点击下载</a> </body> </html> `; }
内容的提问来源于stack exchange,提问作者Jakob Czapski
相关产品推荐
相关产品推荐

