2012-11-06 13 views
10

Ich habe einen Ordner im Google Drive-Ordner mit einigen Dateien. Ich möchte ein Google-Apps-Skript erstellen, das alle Dateien in diesem Ordner komprimiert und die Zip-Datei in diesem Ordner zusammenfasst. Ich habe ein Video mit der Funktion Utilities.zip() gefunden. Aber dafür gibt es keine API-Referenz. Wie man es benutzt? Danke im Voraus.Erstellen einer Zip-Datei in Google Drive mit Apps-Skript

+0

Ich sehe, es gibt jetzt eine API-Referenz dafür. https://developers.google.com/apps-script/reference/utilities/utilities#zip(BlobSource) – ChrisJJ

+0

Irgendwelche Fortschritte dabei? Irgendeine Arbeitsmethode? –

Antwort

8

Eigentlich ist es sogar einfacher als das. Dateien sind bereits Blobs (alles, was getBlob() hat, kann an jede Funktion übergeben werden, die Blobs erwartet). So ist der Code wie folgt aussieht:

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

Darüber hinaus wird es nicht funktionieren, wenn Sie mehrere Dateien mit dem gleichen Namen im Ordner ... Google Drive-Ordner haben unterstützen das, aber Zip-Dateien nicht.

Um diese Arbeit mit mehreren Dateien, die die gleichen Namen haben:

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')); 
+0

Gut danke für die Antwort.Aber leider funktioniert Code nicht. Es gibt mir einen Fehler "Fehler aufgetreten: Konnte keine Zip erstellen." Ich habe nach Ordner Existenz usw. überprüft. –

+2

Darüber hinaus wird es nicht funktionieren, wenn Sie mehrere Dateien mit dem gleichen Namen im Ordner haben ... Google Drive-Ordner unterstützen, aber Zip-Dateien nicht. –

+0

@Corey Danke für die "alles, was hat' GetBlob "Erklärung. Sehr wenige. –

2

Es gibt tatsächlich keine API-Referenz. Sie könnten eine entsprechende Problemanfrage zu Apps Script issue tracker öffnen. Aber herzuleiten aus, was die Code-Vervollständigung zeigt, hier ist mein Verständnis:

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

Aber ich habe diesen Code nicht getestet, so dass ich weiß nicht, ob es funktionieren wird. Außerdem funktioniert es möglicherweise nur für Dateien, die nicht in das Google-Format konvertiert wurden, oder nur für diese oder eine Teilmenge. Nun, wenn du es ausprobierst und etwas findest, teile es bitte hier mit uns. Ein Limit, dem Sie sicher begegnen werden, ist die Dateigröße, es wird wahrscheinlich nicht funktionieren, wenn die Zip-Datei "zu" groß wird ... ja, Sie müssen dieses Limit auch testen.

+0

Ja, ich habe getan, was Sie vorgeschlagen haben, aber es gibt auch Fehler 'Fehler gefunden: Zip nicht erstellen'. Auch mit einigen Dateien versucht. :-) hat nicht funktioniert. –

+0

Es funktioniert nicht mit Google Docs-Typen, da es keinen Sinn macht, sie zu komprimieren (sie sind keine Dateien im herkömmlichen Sinne). Ist das dein Problem? –

+0

@Corey G: Nein nein, das sind nur .png und .pdf Dateien –

7

Als DocsList veraltet ist, können Sie den folgenden Code verwenden, um einen ganzen Ordner mit Dateien und Unterordner und auch zip halten seine Struktur:

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 Funktion macht ein Array aller Dateien im Ordner und ändert sich mit jedem Dateinamen, um es relativen Pfad seiner Struktur zu halten, wenn gezippt wurde.

Um einen Ordner enthält mehrere Elemente mit dem gleichen Namen verwenden diese getBlob Funktion zip:

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; 
} 
+0

Danke verwenden. Für mich erstellt das. Zip aber Fehler mit 'undefined' auf jedem Ordner, den ich versuche, z. http://i.imgur.com/zAkX8d3.png. – ChrisJJ

1

ich den Code zu verwenden, war in der Lage, die gebucht @Hafez aber ich brauchte es zu ändern, da es nicht für die Arbeit wurde mich. Ich fügte die ersten drei Zeilen hinzu, weil ich die Ordner-ID brauchte, die ein Zeichenfolgenwert ist und nicht der Name des Ordners ist.

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

Die einzige seltsame Sache, die ich erlebt habe, ist, dass, wenn ich das Skript ausführen sagt es TypeError: Cannot call method "getFiles" of undefined. (line 10, file "Code"). Als ich zufällig den Ort sah, wo dieses Skript lebt, gab es auch 5 Zip-Dateien, die komplett waren. Es funktioniert, aber ich bekomme immer noch diesen Fehler. Seltsam ... aber dieser Code funktioniert für mich. Danke an alle in diesem Thread. Prost!

Verwandte Themen