Google apps script 谷歌脚本-如何使用解压

Google apps script 谷歌脚本-如何使用解压,google-apps-script,unzip,Google Apps Script,Unzip,我正在从网站下载.zip文件。它包含一个.txt文件。我想访问txt中的数据并将其写入电子表格。我愿意直接访问它,而不是提取压缩文件,或者提取压缩文件,将txt保存到Google Drive文件夹,保存后再访问 当我使用Utilities.unzip()时,我无法让它解压缩文件,通常会导致“无效参数”错误。在下面的代码中,else前面的最后一节包含解压命令。它成功地将文件保存到正确的Google文件夹中,但我无法提取它 函数myFunction(){ //定义从何处收集数据 var url=''

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

当我使用
Utilities.unzip()
时,我无法让它解压缩文件,通常会导致“无效参数”错误。在下面的代码中,
else
前面的最后一节包含解压命令。它成功地将文件保存到正确的Google文件夹中,但我无法提取它

函数myFunction(){
//定义从何处收集数据
var url='';
var filename=“ReportUploadTesting05.zip”;
var response=UrlFetchApp.fetch(url{
//muteHttpExceptions:true,
//validateHttpsCertificates:false,
followRedirects:true//Default无论如何都是true。
});
//获取跟进信息的电子表格
var Sp=SpreadsheetApp.getActiveSpreadsheet();
if(response.getResponseCode()==200){
//获取电子表格的文件夹详细信息以保存将来的文件
var folderURL=getParentFolder(Sp);
var folderID=getIdFromUrl(folderURL);
var folder=DriveApp.getFolderById(folderID);
//保存压缩文件
var blob=response.getBlob();
var file=folder.createFile(blob);
file.setName(文件名);
file.setDescription(“从“+url下载”);
var fileID=file.getId();
Logger.log(fileID);
Logger.log(blob)
//提取拉链(不工作)
file.setContent('application/zip')
var fileUnzippedBlob=Utilities.unzip(file);//此处出现无效参数错误
var filename='解压缩文件'
var fileUnzipped=folder.createFile(fileUnzippedBlob)
fileunzip.setName(文件名)
}
否则{
Logger.log(response.getResponseCode());
}
}
我已经按照上面的说明做了。我可以让他们的榜样发挥作用。我尝试在我的电脑上创建一个.zip文件,将其上传到谷歌硬盘,并试图打开它,但没有成功。很明显,使用解压还有一些我没有注意到的微妙之处


你能帮我理解一下吗?

我想你的问题的答案可以在这里找到。如果下载超过100 mb,则无法下载完整文件。因此,它将不是正确的zip格式。抛出无法解压缩文件错误。

我认为从文件(在本例中为
.zip
文件)创建blob需要
.next()
;否则我就不行了

还要注意,
.zip
文件可能包含多个文件,因此我为循环包含了一个

无论如何,我的工作/测试解决方案/脚本如下:

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]);
  }
}
函数解压缩(folderName,fileZipName){
//变数
//var folderName=“文件夹名称”;
//var fileZipName=“file_name.zip”;
var folderId=getFolderId(folderName);
var folder=DriveApp.getFolderById(folderId);
var fileZip=folder.getFilesByName(fileZipName);
var fileExtractedBlob,fileZipBlob,i;
//减压
fileZipBlob=fileZip.next().getBlob();
setContentType(“application/zip”);
fileExtractedBlob=Utilities.unzip(fileZipBlob);
对于(i=0;i
我在测试中遇到了相同的“无效参数”错误,因此没有使用:

file.setContent('application/zip')
我用过:

file.setContentTypeFromExtension();
这就解决了我的问题。另外,正如@tukusejsirs提到的,一个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);

}
/**
*从URL获取zip文件,解压缩它,然后将新文件上载到用户的驱动器。
*/
函数uploadFile(){
var url='';
var zip=UrlFetchApp.fetch('url').getBlob();
setContentTypeFromExtension();
var unzippedFile=Utilities.unzip(zip);
var filename=解压文件[0].getName();
var contentType=解压缩文件[0]。getContentType();
var csv=解压缩文件[0];
变量文件={
标题:文件名,
mimeType:contentType
};
file=Drive.Files.insert(文件,csv);
Logger.log('ID:%s,文件大小(字节):%s',File.ID,File.fileSize);
var fileId=file.id;
//将文件移动到驱动器中的特定文件夹(链接:https://drive.google.com/drive/folders/)
var folderId='';
var folder=DriveApp.getFolderById(folderId);
var driveFile=DriveApp.getFileById(fileId);
folder.addFile(驱动文件);
}

unzip
需要Blob类型,因此您可以尝试执行
实用程序。解压(Blob)
@Kos,谢谢,是的,我已经尝试过了,只是再次执行此操作以再次检查。我抓取了我已经创建的
blob
变量,并将其放入
Utilities.unzip
。它会在同一行中产生相同的错误消息。为了明确指出这一点,我了解到文件是blob,对其调用
getBlob()
是多余的。在我有限的测试中,如果您跳过此代码
file.setContent('application/zip')
,而根本不设置内容,代码对我来说就很好。注意:我上传了一个压缩文件到谷歌硬盘并测试了它!我看到您正在通过createFile存储zip,您是否能够在应用程序脚本之外手动提取该zip?可能问题出在保存步骤中。顺便说一句,我会对该文件调用getBlob(),即使它是多余的(我不确定它是否是),为了清晰起见,这是一个好主意。同样,我可以重现您的错误的唯一方法是当我给它非压缩文件解压时。我认为你的思路是对的,代码没有问题。相反,我认为这与压缩有关