使用apps脚本在Google云端硬盘中创建一个zip文件

Lol*_*ake 14 google-apps-script google-drive-api

我在谷歌驱动器文件夹中有一个包含少量文件的文件夹.我想制作一个谷歌应用程序脚本,压缩该文件夹中的所有文件,并在同一文件夹中创建zip文件.我发现了一个有Utilities.zip()函数的视频.但是没有API参考.如何使用它?提前致谢.

Haf*_*ari 12

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;
}
Run Code Online (Sandbox Code Playgroud)

getBlobs function生成文件夹中所有文件的数组,并将每个文件名更改为它的相对路径,以便在压缩时保持结构.

要压缩包含多个具有相同名称的项目的文件夹,请使用以下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;
}
Run Code Online (Sandbox Code Playgroud)


Cor*_*y G 11

实际上它比那更容易.文件已经是Blob(任何具有getBlob()的东西都可以传递给任何需要Blob的函数).所以代码看起来像这样:

var folder = DocsList.getFolder('path/to/folder');
folder.createFile(Utilities.zip(folder.getFiles(), 'newFiles.zip'));
Run Code Online (Sandbox Code Playgroud)

此外,如果您在文件夹中有多个具有相同名称的文件,它将无法工作... Google云端硬盘文件夹支持该功能,但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'));
Run Code Online (Sandbox Code Playgroud)

  • 此外,如果您在文件夹中有多个具有相同名称的文件,它将无法工作... Google云端硬盘文件夹支持该功能,但Zip文件不支持. (2认同)
  • @CoreyG太棒了,2行代码很漂亮,谢谢 (2认同)