谷歌脚本 - 如何使用解压缩

3
我正在从网站下载一个.zip文件,其中包含一个.txt文件。我想访问txt中的数据并将其写入电子表格。我可以直接访问它而不解压缩zip文件,也可以提取zip文件,将txt保存到Google Drive文件夹中,并在保存后访问它。
当我使用Utilities.unzip()时,我无法解压缩文件,通常会出现“无效参数”错误。在下面的代码中,else之前的最后一部分包含解压缩命令。它成功地将文件保存到正确的Google文件夹中,但是我无法提取它。
function myFunction() {
  // define where to gather data from
  var url = '<insert url here>';
  var filename = "ReportUploadTesting05.zip";
  
  var response = UrlFetchApp.fetch(url, {
    // muteHttpExceptions: true,
    // validateHttpsCertificates: false,
    followRedirects: true  // Default is true anyway.
  });

  // get spreadsheet for follow up info
  var Sp = SpreadsheetApp.getActiveSpreadsheet();
  
  if (response.getResponseCode() === 200) {
    // get folder details of spreadsheet for saving future files
    var folderURL = getParentFolder(Sp);
    var folderID = getIdFromUrl(folderURL);
    var folder = DriveApp.getFolderById(folderID);
    
    // save zip file
    var blob = response.getBlob();
    var file = folder.createFile(blob);
    file.setName(filename);
    file.setDescription("Downloaded from " + url);
    var fileID = file.getId();
    Logger.log(fileID);
    Logger.log(blob)
    
    // extract zip (not working)
    file.setContent('application/zip')
    var fileUnzippedBlob = Utilities.unzip(file);  // invalid argument error occurs here
    var filename = 'unzipped file'
    var fileUnzipped = folder.createFile(fileUnzippedBlob)
    fileUnzipped.setName(filename)
  }
  else {
    Logger.log(response.getResponseCode());
  }
}

我遵循了Utilities页面上的说明。我可以使他们的确切示例工作。我尝试在我的计算机上创建一个.zip文件,将其上传到Google Drive并尝试打开它,但不成功。显然,我错过了使用解压缩的一些细节。您能帮助我理解这个吗?

2
unzip expects Blob type, so you can try do Utilities.unzip(blob) - Kos
1
根据我的有限测试,如果您跳过这段代码file.setContent('application/zip')并且完全不设置setContent,那么对我来说代码就可以正常工作。注意:我已经将一个压缩文件上传到Google Drive并进行了测试! - Jack Brown
1
我看到你正在通过createFile存储zip文件,你能否在应用脚本之外手动提取该zip文件?也许问题出在保存步骤上。顺便说一句,即使这是多余的(我不确定),我仍建议在文件上调用getBlob(),这样更清晰易懂。 - Cameron Roberts
@CameronRoberts,感谢您的参与!我能够将zip文件下载到计算机并解压缩。当我这样做时,大小为540 KB。当我尝试使用“Zip Extractor”(Google Drive应用程序)解压缩它时,提取器选项卡需要很长时间才能过去'loading',最终加载时,它说文件是4 GB!我还尝试跳过createFile,直接将blob放入unzip,但没有成功。 - rdipert
1
同样的,我能够重现你的错误的唯一方法是当我给它一个非zip文件来解压缩。我认为你走在正确的轨道上,代码没有问题。相反,我认为这与压缩算法未被Utilities.unzip识别有关。为了测试这个问题,使用Google Drive压缩软件压缩一堆文件,然后使用代码进行解压缩。应该可以工作! - Jack Brown
显示剩余3条评论
3个回答

4
我是一名有帮助的助手,以下是您需要翻译的内容:

在我的测试中,我遇到了相同的“无效参数”错误,因此不使用:

file.setContent('application/zip')

我使用了:

file.setContentTypeFromExtension();

这就解决了我的问题。 此外,正如@tukusejssirs所提到的,zip文件可以包含多个文件,因此unzip()返回一个blob数组(如文档中所述)。 这意味着您需要遍历文件,或者如果您知道只有一个文件,则显式引用数组中的位置,像这样:

var fileUnzipped = folder.createFile(fileUnzippedBlob[0])

以下是整个脚本,它涵盖了这两个问题:
/**
 * Fetches a zip file from a URL, unzips it, then uploads a new file to the user's Drive.
 */
function uploadFile() {
  var url = '<url goes here>';
  var zip = UrlFetchApp.fetch('url').getBlob();

  zip.setContentTypeFromExtension();

  var unzippedFile = Utilities.unzip(zip);
  var filename = unzippedFile[0].getName();
  var contentType = unzippedFile[0].getContentType();
  var csv = unzippedFile[0];

  var file = {
    title: filename,
    mimeType: contentType
  };

  file = Drive.Files.insert(file, csv);
  Logger.log('ID: %s, File size (bytes): %s', file.id, file.fileSize);

  var fileId = file.id;

  // Move the file to a specific folder within Drive (Link: https://drive.google.com/drive/folders/<folderId>)
  var folderId = '<folderId>';
  var folder = DriveApp.getFolderById(folderId);
  var driveFile = DriveApp.getFileById(fileId);

  folder.addFile(driveFile);

}

1

0

我相信从文件(在这种情况下是.zip文件)创建blob需要使用.next(),否则对我来说无法工作。

另外请注意,.zip文件可能包含多个文件,因此我包括了一个for循环。

总之,我的可行/测试解决方案/脚本如下:

function unzip(folderName, fileZipName){
  // Variables
  // var folderName = "folder_name";
  // var fileZipName = "file_name.zip";
  var folderId = getFolderId(folderName);
  var folder = DriveApp.getFolderById(folderId);
  var fileZip = folder.getFilesByName(fileZipName);
  var fileExtractedBlob, fileZipBlob, i;

  // Decompression
  fileZipBlob = fileZip.next().getBlob();
  fileZipBlob.setContentType("application/zip");
  fileExtractedBlob = Utilities.unzip(fileZipBlob);
  for (i=0; i < fileExtractedBlob.length; i++){
    folder.createFile(fileExtractedBlob[i]);
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接