Forum: PC-Programmierung Google Drive Spreadsheet API - Backup von Dateien


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Jason (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen,

ich möchte auf Google Drive mithilfe eines Spreadsheet-Scripts ein 
Datei.Backup erstellen und zwar täglich mit einem Zeitstempel, der Jahr, 
Monat und Tag enthält. Das funktioniert soweit auch. Eine zweite 
Zeitstempelfunktion, bei der 5 Tage vom aktuellen Datum abgezogen 
werden, nutze ich, um das Backup mit dem Zeitstempel von vor 5 Tagen 
stets zu löschen.
1
function CopySpreadSheet() {
2
  var folders=DriveApp.getFoldersByName("CSV");
3
  var SpreadsheetName = formatDate();
4
5
  while (folders.hasNext()) {
6
7
    var folder = folders.next();
8
    var file = SpreadsheetApp.getActiveSpreadsheet().copy(SpreadsheetName);
9
    var copyFile=DriveApp.getFileById(file.getId());
10
11
    folder.addFile(copyFile);
12
    DriveApp.getRootFolder().removeFile(copyFile);  
13
  }
14
15
  var SpreadsheetName2 = formatDate2();
16
17
  var files = DriveApp.getFilesByName(SpreadsheetName2);
18
  while (files.hasNext()) {
19
    files.next().setTrashed(true);
20
   }
21
}
22
23
function formatDate() {
24
  var month, day, hour, minu, sec, d  =  new Date();
25
26
  month = ('0'+(d.getUTCMonth()+1)).slice(-2);
27
  day = ('0'+d.getUTCDate()).slice(-2);
28
  hour = ('0'+d.getUTCHours()).slice(-2);
29
  minu = ('0'+d.getUTCMinutes()).slice(-2);
30
  sec = ('0'+d.getUTCSeconds()).slice(-2);
31
32
  return '_Backup_CVE_' + d.getUTCFullYear() + month +(day);      
33
}
34
35
function formatDate2() {
36
  var month, day, hour, minu, sec, d  =  new Date(new Date().getTime()-5*(24*3600*1000));
37
38
  month = ('0'+(d.getUTCMonth()+1)).slice(-2);
39
  day = ('0'+d.getUTCDate()).slice(-2);
40
  hour = ('0'+d.getUTCHours()).slice(-2);
41
  minu = ('0'+d.getUTCMinutes()).slice(-2);
42
  sec = ('0'+d.getUTCSeconds()).slice(-2);
43
44
  return '_Backup_CVE_' + d.getUTCFullYear() + month +(day);

Das Problem dabei ist, dass wenn ich eine Datei älter als 5 Tage habe, 
diese natürlich nicht entfernt wird. Ich suche nach einer Lösung, um 
Backupdateien mit Namen _Backup_CVE_YYYYMMDD älter als 5 tage zu 
löschen. Meine Lösung löscht nur die Datei, die genau 5 Tage alt ist.

von Jason (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Habe mir zum oben genannten Beispiel eine Alternative überlegt, indem 
ich alle Dateien beginnend mit XYZ nach X tagen im Verzeichnis Y lösche:
1
function deleteXLSX(){
2
  var XDaysBefore = new Date().getTime()-3600*1000*12*1 ;// 1 is the number of days
3
  var folder = DriveApp.getFolderById('Y');
4
  var files = folder.searchFiles('title contains "X"')
5
  //var files = folder.getFiles();
6
  while (files.hasNext()) {
7
    var file = files.next();   
8
    if(file.getName() && file.getDateCreated().getTime()<XDaysBefore){
9
      try{file.setTrashed(true);}
10
      catch(e){Logger.log("Unable to Trash: "+file.getName()) }         
11
      Logger.log(file.getName()+' created on '+Utilities.formatDate(file.getDateCreated(), 'GMT','MMM-dd-yyyy'));
12
     }       
13
   } 
14
}

von imonbln (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Jason schrieb:
> Das Problem dabei ist, dass wenn ich eine Datei älter als 5 Tage habe,
> diese natürlich nicht entfernt wird. Ich suche nach einer Lösung, um
> Backupdateien mit Namen _Backup_CVE_YYYYMMDD älter als 5 tage zu
> löschen. Meine Lösung löscht nur die Datei, die genau 5 Tage alt ist.

Ich würde das mit folgenden Algorithmus losen.

1.) Brechne das Datum von heute minus 5 tage
2.) gehe durch das Verzeichnis mit den Backup_CVE datein.
3.) wenn der Datei Name auf das Pattern beginnt mit '_Backup_CVE_'
    matched splite den Dateinamen an den '_' in eine liste und wandel 
das letzte Element in ein Datum.
4.) wenn das Datum aus 3. kleiner dem aus 1. ist lösche die Datei.

Das sollte es sein, jetzt werden alle Datein welche laut Namen älter als 
5 Tage sind, gelöscht.

von Jason (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hi,
ich habe das so ähnlich gelöst.
1
XDaysBefore = new Date().getTime()-3600 * 1000 * 24 * X

Wobei X für die Anzahl der Tage steht. Dann suche ich nach allen 
Backups, die als Titel das Wort enthalten:
1
  var files = folder.searchFiles('title contains "_Backup_CVE_"')

Der Zeitstempel im Titel spielt dabei keine Rolle, da ich einfach nach 
dem Erstellungsdatum suche und mit oberer Zeile nur ausschließen möchte, 
dass auch andere Dateien, die vor X Tagen erstellt worden sind, gelöscht 
werden:
1
  if(file.getName() && ((new Date() - file.getDateCreated() >  X * 24 * 60 * 60 * 1000)) ){
2
      try{file.setTrashed(true);} // in den Papierkorb

von imonbln (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Jason schrieb:
> Der Zeitstempel im Titel spielt dabei keine Rolle, da ich einfach nach
> dem Erstellungsdatum suche...

Das kann man so machen, sollte im Idealfall auch meisten gut gehen. Du 
solltest nur im Hinterkopf behalten das, dass Erstellungsdatum der Datei 
unter Linux nicht gespeichert wird. Es gibt zwar eine ctime welche 
fälschlicherweise gerne als Creation Time bezeichnet wird, aber das 
ist eine Change time der Inode. d.h. immer wenn sich die Inode ändert 
wird diese Zeit auch angepasst.

Für Details siehe z.b Hier

http://linux-club.de/wiki/opensuse/Zeitstempel_von_Dateien#Change_Time_.28ctime.29

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.