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>