mirror of
https://github.com/bellingcat/google-apps-script.git
synced 2026-06-08 11:28:37 +03:00
99 lines
3.5 KiB
JavaScript
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;
|
|
}
|