Files
google-apps-script/auto-backup/code.gs
2022-04-28 10:02:42 +01:00

99 lines
3.5 KiB
JavaScript

// Google Apps Script to back up specified google docs
// additionally deletes backups older than X days
BACKUP_FOLDER_ID = "BACKUP_FOLDER_ID_GOES_HERE"
function main() {
to_backup = [
{ docFolderName: "MY_SHEET", docId: "MY_SHEET_ID_GOES_HERE", deleteOlderThanDays: 5 },
{ docFolderName: "PRESENTATION_DOC", docId: "PRESENTATION_DOC_ID_GOES_HERE", deleteOlderThanDays: 5 },
{ docFolderName: "WORD_DOC", docId: "WORD_DOC_ID_GOES_HERE", deleteOlderThanDays: 5 },
]
to_backup.forEach(doc => {
console.time(`maintaining backup for ${doc.docFolderName}`);
// backup doc by docId into the docFolderName folder
if(backup(doc.docId, doc.docFolderName)) {
// optionally remove backups older than `deleteOlderThanDays`
// makes sense to run it after backup. in case there's an exception during backup, older files will not get deleted
deleteFolderOlderThanDays(doc.docFolderName, doc.deleteOlderThanDays);
}
console.timeEnd(`maintaining backup for ${doc.docFolderName}`);
})
}
function backup(docId, docFolderName) {
if (docId === undefined || docFolderName === undefined) {
console.error(`backup: got undefined value(s) (docId=${docId},docFolderName=${docFolderName})`);
return false;
}
let docToBackup = DriveApp.getFileById(docId);
let timeNow = Utilities.formatDate(new Date(), "GMT", "yyyy-MM-dd_HH-mm-ss");
let dateFolderName = Utilities.formatDate(new Date(), "GMT", "yyyy-MM-dd");
let docMainFolder = getDocMainFolder(docFolderName);
let todayFolder = mkdir(docMainFolder, dateFolderName);
console.log(`backing up sheet: ${docToBackup.getName()}`);
let backupName = `${docToBackup.getName()}_backup_${timeNow}`;
docToBackup.makeCopy(backupName, todayFolder);
console.log(`success for sheet: ${docToBackup.getName()}`);
return true;
}
function deleteFolderOlderThanDays(docFolderName, daysOld) {
if (docFolderName === undefined || daysOld === undefined) {
console.error(`deleteOlderThan: got undefined value(s) (docFolderName=${docFolderName},daysOld=${daysOld})`);
return;
} else if (daysOld < 2) { //failsafe not to delete most recent-backups
console.error(`days old must be bigger than 2 (${daysOld})`);
return;
}
let docMainFolder = getDocMainFolder(docFolderName);
console.log(`Deleting folders older than ${daysOld} days, inside folder ${docMainFolder.getName()}`);
let cutOffTime = new Date(new Date().getTime() - (3600 * 1000 * 24 * daysOld));
let deletableFiles = docMainFolder.getFolders();
let total = 0, deleted = 0;
while (deletableFiles.hasNext()) {
let folder = deletableFiles.next();
if (folder.getDateCreated() <= cutOffTime) {
folder.setTrashed(true);
console.log(`moved folder ${folder.getName()} to trash.`);
deleted++;
} else {
console.log(`folder ${folder.getName()} is not deletable yet.`);
}
total++;
}
console.log(`Finished deleting folders older than ${daysOld} days, deleted ${deleted}/${total}`);
}
function getDocMainFolder(docFolderName) {
let mainBackupFolder = DriveApp.getFolderById(BACKUP_FOLDER_ID);
return mkdir(mainBackupFolder, docFolderName);
}
function mkdir(parent, folderName) {
//create folder inside if not exists
let foundFolders = parent.getFoldersByName(folderName);
let folder = undefined;
if (foundFolders.hasNext()) {
folder = foundFolders.next();
console.log(`Folder ${folderName} already exists`);
} else {
folder = parent.createFolder(folderName);
console.log(`Folder ${folderName} created`);
}
return folder;
}