我正在从网站下载.zip。它包含一个.txt文件。我想访问txt中的数据并将其写入电子表格。我可以直接访问它而不是解压缩或解压缩zip,将txt保存到Google云端硬盘文件夹,并在保存后访问它。
当我使用Utilities.unzip()
时,我永远无法解压缩该文件,并且通常最终得到一个"无效的参数"错误。在下面的代码中,else
之前的最后一节包含unzip命令。它成功地将文件保存到正确的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());
}
}
&#13;
我已按照Utilities page上的说明操作。我可以得到他们的确切示例。我尝试在计算机上创建.zip,将其上传到Google云端硬盘并试图将其打开失败。显然,使用我失踪的解压缩有一些细微之处。
你能帮我理解一下吗?
答案 0 :(得分:2)
我在测试中遇到了相同的“无效参数”错误,所以不要使用:
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);
}
答案 1 :(得分:1)
我认为您的问题的答案可以在这里找到。 Is there a size limit to a blob for Utilities.unzip(blob) in Google Apps Script? 如果下载超过100 mb,则无法下载完整文件。因此,它不会采用正确的zip格式。抛出无法解压缩文件错误。
答案 2 :(得分: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]);
}
}