首页 > 解决方案 > 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 导出文件,所以我无法删除文件夹结构。

标签: javascriptgoogle-apps-scriptunziputilities

解决方案


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

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片段/
SO Snippets/addCheckboxes
SO片段/appendIdtolocalStorage
SO 片段/clearAllIdsFromLocalStorage
SO 片段/clearIdsFromLocalStorage
SO片段/dataUrl
SO片段/delCheckedQuestion
SO Snippets/delCheckedQuestions
SO Snippets/delUnWantedQuestions
SO 片段/getCurrentIdsInLocalStorage
SO 片段/loadIdsIntoLocalStorage
SO片段/刷新页面
SO 片段/remDupsSort
SO Snippets/removeFooter%26SideBar
SO 片段/removeSomeIds
SO Snippets/removeSomeOlderIds
SO片段/viewCookies
SO片段/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);
}

推荐阅读