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
Antwort
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'));
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. –
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. –
@Corey Danke für die "alles, was hat' GetBlob "Erklärung. Sehr wenige. –
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.
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. –
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? –
@Corey G: Nein nein, das sind nur .png und .pdf Dateien –
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;
}
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
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!
- 1. Intent.ACTION_GET_CONTENT mit Google Drive
- 2. Integration mit Google Drive
- 3. Öffnen einer Datei auf Google Drive direkt in einer Google Drive App
- 4. Ordner auf Google Drive erstellen (Android)
- 5. Google Drive Implementierung in Android
- 6. Google Drive API-Authentifizierung
- 7. HTML2PDF mit Google Drive-API
- 8. C# mit eingebettetem Google Drive
- 9. Wie erstellt man Unterverzeichnis (Ordner) in Google Drive mit Google Drive API v3 & PHP?
- 10. Datei mit Ausgabestream in Google Drive hochladen
- 11. Herunterladen einer Datei mit Google Drive API mit PHP
- 12. Google Drive + ACTION_GET_CONTENT
- 13. Google Drive-Upload abbrechen?
- 14. Google Drive und Google Sites: Erstellen Sie eine Unterseite, wenn ein neuer Google Drive-Ordner hinzugefügt wird
- 15. Google Drive API: Datei mit Dienstkonto kopieren
- 16. Google Drive API-Dateien Suche
- 17. Google Drive Erlaubnis
- 18. Google Drive Viewer-URLs geben jetzt Google Drive Error
- 19. Google Drive API Javascript
- 20. Google Drive Direct Link
- 21. Erstellen von Tabellen mit Google Tabellen-API in Google Drive + Java
- 22. Google Drive - 401 Fehler
- 23. OutOfMemoryException beim Hochladen von Dateien in Google Drive mit der Google Drive-API
- 24. IOS: Wie man eine Datei in bestimmte Google Drive-Ordner mit Google Drive sdk-Bibliothek hochladen
- 25. Google Drive Picker Fehler
- 26. Löschen einer Google Drive-Datei mit JS-Client
- 27. Dateihierarchie von Google Drive in Java extrahieren
- 28. google drive api export
- 29. Google Drive API mit C# - Hochladen
- 30. Append-Modus bei Google Drive
Ich sehe, es gibt jetzt eine API-Referenz dafür. https://developers.google.com/apps-script/reference/utilities/utilities#zip(BlobSource) – ChrisJJ
Irgendwelche Fortschritte dabei? Irgendeine Arbeitsmethode? –