14

Google ドライブ フォルダにいくつかのファイルを含むフォルダがあります。そのフォルダー内のすべてのファイルを圧縮し、同じフォルダー内に zip ファイルを作成する Google Apps Script を作成したいと考えています。

機能があるビデオを見つけましたがUtilities.zip()、その API リファレンスはありません。どうやって使うの?前もって感謝します。

4

5 に答える 5

15

実際にはそれよりもさらに簡単です。ファイルはすでに Blob です (getBlob() を持つものはすべて、Blob を期待する関数に渡すことができます)。したがって、コードは次のようになります。

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

さらに、フォルダに同じ名前のファイルが複数あると機能しません... 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'));
于 2012-11-07T03:09:48.603 に答える
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;
}

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;
}
于 2015-01-19T05:08:58.227 に答える
2

@Hafez が投稿したコードを使用できましたが、うまくいかなかったため、変更する必要がありました。最初の 3 行を追加したのは、文字列値であり、フォルダーの名前ではないフォルダー 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"). このスクリプトが存在する場所をたまたま見たところ、完成した zip ファイルも 5 つありました。動作しますが、それでもエラーが発生します。奇妙な...しかし、このコードは私にとってはうまくいきます。このスレッドの皆さんに感謝します。乾杯!

于 2016-02-26T21:38:55.923 に答える
1

実際、API リファレンスはありません。Apps Script issue trackerで、これに関する問題リクエストを開くことができます。しかし、コード補完が示すものから推測すると、ここに私の理解があります:

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);

しかし、私はこのコードをテストしていないので、うまくいくかどうかはわかりません。また、Google の形式に変換されていないファイルに対してのみ機能するか、それらのファイルまたはそのサブセットに対してのみ機能する可能性があります。試してみて何かを見つけたら、ここで共有してください。確実に直面する制限の 1 つはファイルサイズです。zip ファイルが「大きすぎる」場合はおそらく機能しません... ええ、この制限もテストする必要があります。

于 2012-11-06T20:54:25.230 に答える
0

Hafez ソリューションがうまくいかず、このエラーが発生した場合

TypeError: 未定義のプロパティ 'getFiles' を読み取れません

これをやってみてください

/**
 * Creates a zipFile of the mentioned document ID and store it in Drive. You can search the zip by folderName.zip
 */

function createAndSendDocument() {
    var files = DriveApp.getFolderById("DOCUMENT ID CAN BE FIND IN THE URL WHEN A DOCUMENT IS OPENED");
    var folder = files;
    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;
}
于 2021-05-28T21:32:39.040 に答える