Google脚本-如何使用解压缩

问题描述 投票:1回答:3

我正在从网站下载.zip。它包含一个.txt文件。我想访问txt中的数据并将其写入电子表格。我愿意直接访问它而不提取该zip或提取该zip,将txt保存到Google云端硬盘文件夹,并在保存后访问它。

[当我使用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 page上的说明进行操作。我可以得到他们确切的例子。我尝试在计算机上创建.zip,然后将其上传到Google云端硬盘,并尝试将其打开失败。显然,使用我缺少的解压缩功能有些微妙。

您能帮我理解吗?

google-apps-script unzip
3个回答
1
投票

我认为您的问题的答案可以在这里找到。 Is there a size limit to a blob for Utilities.unzip(blob) in Google Apps Script? 如果下载大小超过100 mb,则无法下载完整文件。因此,它不会采用正确的zip格式。抛出无法解压缩文件错误。


1
投票

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

file.setContent('application/zip')

我用过:

file.setContentTypeFromExtension();

而且,这为我解决了问题。另外,如@tukusejssirs所述,一个zip文件可以包含多个文件,因此unzip()返回一个blob数组(如here所述)。这意味着您要么需要遍历文件,要么如果您知道只有一个,则显式引用它在数组中的位置,如下所示:

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);

}

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]);
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.