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


von Jason (Gast)


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)


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)


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)


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)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.