Utilities.unzip 不适用于包含子文件夹的 zip 文件

问题描述

我正在尝试编写一些 Google Apps 脚本来提取包含 3 个子文件夹的 zip 文件。根据文件夹的不同,我将遍历各种文件并进行相应的处理。

当 zip 文件包含子文件夹时,我无法让 Utilities.unzip 工作。我用一个简单的 zip 文件测试了我的代码,它按预期工作,所以我猜这是我遗漏的东西,或者 .unzip 根本不适用于子文件夹。

有没有办法让它起作用?或者我可以通过javascript提取文件并将它们传递给应用程序脚本吗?我查看了几个执行此操作的 javascript 库,但不知道如何将这些库导入我的 Google Web App。

更新:这是我用来测试的代码

function ExtractSecurityZip() {

var iZIP =DriveApp.getFileById("1RAhI_mGQHay9boCQ9tt5T_0iqF6w5Eky").getBlob().setContentTypeFromExtension()

Utilities.unzip(iZIP)

return

}

我不关心在 zip 文件中维护文件夹结构,我只需要所有文件

非常感谢任何帮助。

戴夫

PS:如果有帮助,zip 文件是 Oracle LCM 导出文件,因此我无法删除文件夹结构。

解决方法

这会将所有文件解压缩到目标目录

function getAllZips(dstdir,zipid) {
  const dstFolder = DriveApp.getFolderById(dstdir);
  const zipFile = DriveApp.getFileById(zipid);
  const blobs = Utilities.unzip(zipFile.getBlob());
  blobs.forEach((b,i) => {
    let pA = b.getName().split('/');
    if(pA[pA.length-1]) {
      dstFolder.createFile(b).setName(pA[pA.length-1]);
    }
  });
}

以下是通过 blobs.getName() 循环显示的内容:

姓名
SO Snippets/
SO Snippets/addCheckboxes
SO Snippets/appendIdtolocalStorage
SO Snippets/clearAllIdsFromLocalStorage
SO Snippets/clearIdsFromLocalStorage
SO Snippets/dataUrl
SO Snippets/delCheckedQuestion
SO Snippets/delCheckedQuestions
SO Snippets/delUnWantedQuestions
SO Snippets/getCurrentIdsInLocalStorage
SO Snippets/loadIdsIntoLocalStorage
SO Snippets/refreshPage
SO Snippets/remDupsSort
SO Snippets/removeFooter%26SideBar
SO Snippets/removeSomeIds
SO Snippets/removeSomeOlderIds
SO Snippets/viewCookies
SO Snippets/zButton

以'/'结尾的是目录,其他的是文件。我试图恢复目录结构,但工作量比我想象的要多一些。因此,您可能希望将 Javascript 标签添加到您的标签列表中。我猜他们中的一个人已经想通了。

关于 andrewjames 提出的问题:你能在你的 zip 文件上运行这个,以便我可以看到它的样子吗?

function lookingInTheBlob(zipid='1QnrP-1lngoLQtNsqd373_UytVptuqoI1') {
  const zipFile = DriveApp.getFileById(zipid);
  const blobs = Utilities.unzip(zipFile.getBlob());
  let data = [];
  blobs.forEach((b,i) => {data.push([b.getName()]);});
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getSheetByName('Sheet3');
  sh.clearContents();
  sh.getRange(1,1,data.length,data[0].length).setValues(data);
}