我有包含几个文件谷歌驱动器文件夹的文件夹。 我想打一个谷歌的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文件。 它的工作原理,但我仍然得到这个错误。 奇怪......但是这个代码对我的作品。 感谢大家对这个线程。 干杯!