创建谷歌驱动器内一个zip文件与应用程序的脚本(Creating a zip file inside

2019-06-18 22:33发布

我有包含几个文件谷歌驱动器文件夹的文件夹。 我想打一个谷歌的Apps脚本是压缩同一文件夹内的文件夹和包装箱的zip文件中的所有文件。 我发现,有Utilities.zip()功能的视频。 但对于没有API参考。 如何使用它? 提前致谢。

Answer 1:

实际上,它比那更容易。 文件已经斑点(任何有getBlob()可以给需要斑点任何函数传递)。 因此,代码如下所示:

var folder = DocsList.getFolder('path/to/folder');
folder.createFile(Utilities.zip(folder.getFiles(), 'newFiles.zip'));

此外,如果您有在文件夹名称相同的多个文件,也不会工作...谷歌云端硬盘文件夹支持,但Zip文件没有。

为了与具有相同名称的多个文件,这项工作:

var folder = DocsList.getFolder('path/to/folder');
var names = {};
folder.createFile(Utilities.zip(folder.getFiles().map(function(f){
  var n = f.getName();
  while (names[n]) { n = '_' + n }
  names[n] = true;
  return f.getBlob().setName(n);
}), 'newFiles.zip'));


Answer 2:

由于DocsList已被弃用,你可以使用下面的代码来压缩包含文件和子文件夹的整个文件夹,并保持它的结构:

var folder = DriveApp.getFolderById('<YOUR FOLDER ID>');
var zipped = Utilities.zip(getBlobs(folder, ''), folder.getName()+'.zip');
folder.getParents().next().createFile(zipped);

function getBlobs(rootFolder, path) {
  var blobs = [];
  var files = rootFolder.getFiles();
  while (files.hasNext()) {
    var file = files.next().getBlob();
    file.setName(path+file.getName());
    blobs.push(file);
  }
  var folders = rootFolder.getFolders();
  while (folders.hasNext()) {
    var folder = folders.next();
    var fPath = path+folder.getName()+'/';
    blobs.push(Utilities.newBlob([]).setName(fPath)); //comment/uncomment this line to skip/include empty folders
    blobs = blobs.concat(getBlobs(folder, fPath));
  }
  return blobs;
}

getBlobs功能使文件夹中的所有文件的数组,并改变每个文件名,它是相对路径,以保持结构时成为拉链。

要压缩包含具有相同名称的使用这种多个项目的文件夹getBlob功能:

function getBlobs(rootFolder, path) {
  var blobs = [];
  var names = {};
  var files = rootFolder.getFiles();
  while (files.hasNext()) {
    var file = files.next().getBlob();
    var n = file.getName();
    while(names[n]) { n = '_' + n }
    names[n] = true;
    blobs.push(file.setName(path+n));
  }
  names = {};
  var folders = rootFolder.getFolders();
  while (folders.hasNext()) {
    var folder = folders.next();
    var n = folder.getName();
    while(names[n]) { n = '_' + n }
    names[n] = true;
    var fPath = path+n+'/';
    blobs.push(Utilities.newBlob([]).setName(fPath)); //comment/uncomment this line to skip/include empty folders
    blobs = blobs.concat(getBlobs(folder, fPath));
  }
  return blobs;
}


Answer 3:

有没有确实API参考。 你可以打开Google Apps脚本对此发布请求问题跟踪 。 但是,从代码完成节目推断,这里是我的理解:

var folder = DocsList.getFolder('path/to/folder');
var files = folder.getFiles();
var blobs = [];
for( var i in files )
  blobs.push(files[i].getBlob());
var zip = Utilities.zip(blobs, 'newFiles.zip');
folder.createFile(zip);

但我没有测试此代码,所以我不知道它是否会奏效。 另外,文件不仅为那些或它的一个子集转换成谷歌的格式,或者它可能只工作。 好吧,如果你尝试一下,找到的东西,请与我们分享在这里。 一个极限,你肯定会面对的是文件大小,它可能会无法正常工作,如果zip文件变得“太”大...是啊,你就必须得测试此限制。



Answer 4:

我能够使用@Hafez发布的代码,但我需要修改它,因为它不是为我工作。 我添加的前三行,因为我所需要的文件夹ID是一个字符串值,并且不是文件夹的名称。

var folderName = DriveApp.getFoldersByName("<folderName>");
var theFolder = folderName.next();
var folderID =theFolder.getId();
var folder = DriveApp.getFolderById(folderID);
var zipped = Utilities.zip(getBlobs(folder, ''), folder.getName()+'.zip');
folder.getParents().next().createFile(zipped);

function getBlobs(rootFolder, path) {
  var blobs = [];
  var files = rootFolder.getFiles();
  while (files.hasNext()) {
    var file = files.next().getBlob();
    file.setName(path+file.getName());
    blobs.push(file);
  }
  var folders = rootFolder.getFolders();
  while (folders.hasNext()) {
    var folder = folders.next();
    var fPath = path+folder.getName()+'/';
    blobs.push(Utilities.newBlob([]).setName(fPath)); //comment/uncomment this line to skip/include empty folders
    blobs = blobs.concat(getBlobs(folder, fPath));
  }
  return blobs;
}

那我遇到的唯一奇怪的是,当我运行该脚本,它说TypeError: Cannot call method "getFiles" of undefined. (line 10, file "Code") TypeError: Cannot call method "getFiles" of undefined. (line 10, file "Code") 当我偶然看到这个地方这个脚本住在哪里也有人说是完整的5个zip文件。 它的工作原理,但我仍然得到这个错误。 奇怪......但是这个代码对我的作品。 感谢大家对这个线程。 干杯!



文章来源: Creating a zip file inside google drive with apps script