Save/Restore Script with JSON files
Saving Scripts into JSON files
//Google Script:
function saveScriptBackupsDialog() {
SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutputFromFile('backupscripts1'), 'Script Files Backup Dialog');
}
function scriptFilesBackup(obj) {
console.log(JSON.stringify(obj));
var scriptId = obj.script;
var folderId = obj.folder;
var saveJson = obj.saveJson;
var saveFiles = obj.saveFiles;
var all = true;
var fA = [];
if (obj.selected.length > 0) {
all = false;
fA = String(obj.selected).split(',').map(n => n.trim());
}
if (scriptId && folderId) {
const base = "https://script.googleapis.com/v1/projects/"
const url1 = base + scriptId + "/content";
const url2 = base + scriptId;
const options = { "method": "get", "muteHttpExceptions": true, "headers": { "Authorization": "Bearer " + ScriptApp.getOAuthToken() } };
const res1 = UrlFetchApp.fetch(url1, options);
const data1 = JSON.parse(res1.getContentText());
const files = data1.files;
const folder = DriveApp.getFolderById(folderId);
const res2 = UrlFetchApp.fetch(url2, options);
const data2 = JSON.parse(res2.getContentText());
let dts = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "yyyyMMdd-HH:mm:ss");
let subFolderName = Utilities.formatString('%s-%s', data2.title, dts);
let subFolder = folder.createFolder(subFolderName)
console.log(all);
if (saveFiles) {
files.forEach(file => {
if (file.source && file.name) {
if (!all) {
if (fA.indexOf(file.name) > -1) {
subFolder.createFile(file.name, file.source, MimeType.PLAIN_TEXT)
}
} else {
subFolder.createFile(file.name, file.source, MimeType.PLAIN_TEXT)
}
}
});
}
if (saveJson) {
subFolder.createFile(subFolderName + '_JSON', res1, MimeType.PLAIN_TEXT)
}
}
return { "message": "Process Complete" };
}
//backupscripts1.html
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<style>input{margin:2px 5px 2px 0;}</style>
</head>
<body>
<form>
<input type="text" id="scr" name="script" size="60" placeholder="Enter Apps Script Id" />
<br /><input type="text" id="fldr" name="folder" size="60" placeholder="Enter Backup Folder Id" />
<br /><input type="text" id="sltd" name="selected" size="60" placeholder ="Enter Desired Files separated by commas or nothing if you want all files." />
<br /><input type="checkbox" id="files" name="saveFiles"/><label for="files">Save Files</label>
<br /><input type="checkbox" id="json" name="saveJson" checked /><label for="json">Save JSON</label>
<br /><input type="button" value="Submit" onClick="backupFiles(this.parentNode);" />
</form>
<script>
function backupFiles(obj) {
google.script.run
.withSuccessHandler(function(obj){google.script.host.close();})
.scriptFilesBackup(obj);
console.log(JSON.stringify(obj));
}
</script>
</body>
</html>
Restoring Scripts from JSON file backups
//Google Script
function LoadProjectScriptContentDialog() {
SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutputFromFile('loadScripts1'), 'Load Scripts Content Dialog')
}
function loadProjectScriptContent(obj) {
const desScriptId = obj.desScriptId;
const srcFileId = obj.srcFileId;
const srcFile = DriveApp.getFileById(srcFileId);
const json = srcFile.getBlob().getDataAsString();
const data = JSON.parse(json);
const files = data.files;
const request = { "files": files };
const base = "https://script.googleapis.com/v1/projects/"
const url = base + desScriptId + "/content"
const options = { "method": "put", "request": request, "muteHttpExceptions": true, "headers": { "Authorization": "Bearer " + ScriptApp.getOAuthToken() }, "contentType": "application/json", "payload": JSON.stringify(request) };
const resp = UrlFetchApp.fetch(url, options);
return resp;//this will close the dialog attached to the callback
//console.log(resp);
//SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutput('<textarea rols="12" cols="60">' + resp + '</textarea>'), "Update Script Project");
}
//loadscripts1.html
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<style>input{margin:2px 5px 2px 0;}</style>
</head>
<body>
<form>
<input type="text" id="dst" name="desScriptId" size="60" placeholder="Enter Destination Script Id" />
<br /><input type="text" id="src" name="srcFileId" size="60" placeholder="Enter Source File Id" />
<br /><input type="button" value="Submit" onClick="loadScripts(this.parentNode);" />
</form>
<script>
function loadScripts(obj) {
google.script.run
.withSuccessHandler(function(obj){google.script.host.close();})
.loadProjectScriptContent(obj);
console.log(JSON.stringify(obj));
}
</script>
</body>
</html>