/*Functions.gs*/ /*###################### AUTHENTICATION FUNCTIONS ######################*/ //authenticate authUser(); function authUser() { var output = "authenticated"; return HtmlService .createHtmlOutput("\ \ \ \ \
\

GD Connector:

\
\

Has been successfully
authorised to access
your data

\
\


\
\ \
\
\ ").setTitle('Authenticated'); } /*###################### DRIVE FUNCTIONS ######################*/ //uploadFile(e.parameter.name,e.parameter.data,e.parameter.mime) //Note: the webviewer can only handle file sizes of @ 1.2mb (when in base64String), for larger files, // temporarily change folder permissions to anyone_with_link, step outside the framework and use the web component //to upload, then back into the framework to reset permissions. For root folder you will need to upload to another folder, then move to root. function uploadFile(name,data,mime) { var fileData = Utilities.base64Decode(data, Utilities.Charset.UTF_8); var blob = Utilities.newBlob(fileData,mime,name); var upFile = DriveApp.getRootFolder().createFile(blob); var output = "upFile::" + upFile.getName() + "::" + upFile.getId(); return HtmlService .createHtmlOutput("

File Uploaded to Root

") .setTitle('File Uploaded to Root'); } //uploadFileToFolder(e.parameter.name,e.parameter.data,e.parameter.mime,e.parameter.targetID) //Note: the webviewer can only handle file sizes of @ 1.2mb (when in base64String), for larger files, // temporarily change folder permissions to anyone_with_link, step outside the framework and use the web component //to upload, then back into the framework to reset permissions function uploadFileToFolder(name,data,mime,targetID) { var fileData = Utilities.base64Decode(data, Utilities.Charset.UTF_8); var blob = Utilities.newBlob(fileData,mime,name); var upFile = DriveApp.getFolderById(targetID).createFile(blob); var output = "upFileToFolder::" + upFile.getName() + "::" + upFile.getId(); return HtmlService .createHtmlOutput("

File Uploaded to Folder

") .setTitle('File Uploaded to Folder'); } //download a file to the device //Note: the webviewer can only handle file sizes of @ 1.2mb (when in base64String), for larger files, // temporarily change file permissions to anyone_with_link, step outside the framework and use the web component //to download, then back into the framework to reset permissions function downloadAFile(fileID) { var mimetype = DriveApp.getFileById(fileID).getMimeType(); if ( (mimetype == 'application/vnd.google-apps.spreadsheet') || (mimetype == 'application/vnd.google-apps.document') || (mimetype == 'application/vnd.google-apps.presentation') || (mimetype == 'application/vnd.google-apps.form') || (mimetype == 'application/vnd.google-apps.script') || (mimetype == 'application/vnd.google-apps.site') || (mimetype == 'application/vnd.google-apps.drawing') || (mimetype == 'application/vnd.google-apps.folder') ) { return HtmlService .createHtmlOutput("

Cannot Download this type of File

") .setTitle('Cannot Download this type of File'); } else { var file = DriveApp.getFileById(fileID); var filename = file.getName(); var base64Data = filename + "::" + Utilities.base64Encode(file.getBlob().getBytes()); return HtmlService .createHtmlOutput("

Downloaded A File

") .setTitle('File saved to ASD'); } } /////createFolder(e.parameter.name); function createFolder(name) { var newFolder = DriveApp.createFolder(name); var output = "folderId::" + newFolder.getName() + "::" + newFolder.getId(); return HtmlService .createHtmlOutput("

Folder Created
" + output + "

") .setTitle('New Folder Created'); } /////createFolderInFolder(e.parameter.name,e.parameter.targetID) function createFolderInFolder(name,targetID) { var targetFolder = DriveApp.getFolderById(targetID); var newFolder = targetFolder.createFolder(name); var output = "folderInFolderId::" + newFolder.getName() +"::"+ newFolder.getId(); return HtmlService .createHtmlOutput("

Folder Created
" + output + "

") .setTitle('New Folder Created'); } // Return the name and ID of every folder in the root of the user's Drive. /////getRootFolders() function getRootFolders() { var folders = DriveApp.getRootFolder().getFolders(); rootFolders = []; while (folders.hasNext()) { var folder = folders.next(); rootFolders.push([folder.getName(), folder.getId()]); } var output = "rootFolders::" + JSON.stringify(rootFolders); return HtmlService .createHtmlOutput("

Got Root Folders

" + output + "

") .setTitle('Got List of Root Folders'); } // Return the name and ID of every file in the root of the user's Drive. /////getRootFiles() function getRootFiles() { var files = DriveApp.getRootFolder().getFiles(); rootFiles = []; while (files.hasNext()) { var file = files.next(); rootFiles.push([file.getName(),file.getId()]); } var output = "rootFiles::" + JSON.stringify(rootFiles); return HtmlService .createHtmlOutput("

Got Root Files

" + output + "

") .setTitle('Got List of Root Files'); } ///// return list of folders in a folder function getListOfFoldersInFolder(targetID) { folderList = []; var parentFolder = DriveApp.getFolderById(targetID); var folders = parentFolder.getFolders(); while (folders.hasNext()) { var folder = folders.next(); folderList.push([folder.getName(),folder.getId()]); } var output = "listFoldersInFolder::" + JSON.stringify(folderList); return HtmlService .createHtmlOutput("

Got List of Folders in Folder

" + output + "

") .setTitle('Got List of Folders in Folder'); } ///// return list of files in a folder function getListOfFilesInFolder(targetID) { filesList = []; var parentFolder = DriveApp.getFolderById(targetID); var files = parentFolder.getFiles(); while (files.hasNext()) { var file = files.next(); filesList.push([file.getName(),file.getId()]); } var output = "listFilesInFolder::" + JSON.stringify(filesList); return HtmlService .createHtmlOutput("

Got List of Files in Folder

" + output + "

") .setTitle('Got List of Files in Folder'); } ///// return list of files in a folder by type of file function getFilesInFolderByType(targetID,mtype) { filesList= []; var parentFolder = DriveApp.getFolderById(targetID); var files = parentFolder.getFilesByType(mtype); while (files.hasNext()) { var file = files.next(); filesList.push([file.getName(), file.getId()]); } var output = "listFilesInFolderByType::" + JSON.stringify(filesList); return HtmlService .createHtmlOutput("

Got Files in Folder by Type

" + output + "

") .setTitle('Got List of Files By Type'); } /////delete a file by its ID function deleteFile(targetID) { DriveApp.getFileById(targetID).setTrashed(true); return HtmlService .createHtmlOutput("

File Deleted

") .setTitle('File Deleted'); } /////delete a folder by its ID, but only if the folder is empty function deleteFolder(targetID) { filesList=""; var parentFolder = DriveApp.getFolderById(targetID); var files = parentFolder.getFiles(); while (files.hasNext()) { var file = files.next(); filesList += file.getName(); } if (filesList == "") { DriveApp.getFolderById(targetID).setTrashed(true); return HtmlService .createHtmlOutput("

Folder Deleted

") .setTitle('Folder Deleted'); } else { return HtmlService .createHtmlOutput("

Folder has Files, NOT Deleted

") .setTitle('Folder has Files, NOT Deleted'); } } ///// function shareFile(fileId,email,call) { var message = "File Shared"; eval(`DriveApp.getFileById(fileId).${call}(email)`); if (call.includes("remove")) { message = "File unShared"; } return HtmlService .createHtmlOutput("

File Shared

") .setTitle(message); } ///// function shareFolder(folderId,email,call) { var message = "Folder Shared"; eval(`DriveApp.getFolderById(folderId).${call}(email)`); if (call.includes("remove")) { message = "Folder unShared"; } return HtmlService .createHtmlOutput("

Folder Shared

") .setTitle(message); } ///// function setSharingFile(fileId,access,permission) { var message = "File Shared"; eval(`DriveApp.getFileById(fileId).setSharing(DriveApp.Access.${access}, DriveApp.Permission.${permission})`); return HtmlService .createHtmlOutput("

File Shared

") .setTitle(message); } ///// function setSharingFolder(folderId,access,permission) { var message = "Folder Shared"; eval(`DriveApp.getFolderById(folderId).setSharing(DriveApp.Access.${access}, DriveApp.Permission.${permission})`); return HtmlService .createHtmlOutput("

Folder Shared

") .setTitle(message); } ///// function moveFolderToFolder(folderID, targetID) { var output = DriveApp.getFolderById(folderID).moveTo(DriveApp.getFolderById(targetID)); return HtmlService .createHtmlOutput("

Folder Moved

") .setTitle('Folder Moved'); } ///// function moveFolderToRoot(folderID) { var output = DriveApp.getFolderById(folderID).moveTo(DriveApp.getRootFolder()); return HtmlService .createHtmlOutput("

Folder Moved To Root

") .setTitle('Folder Moved To Root'); } ///// function moveFileToFolder(fileID, targetID) { var output = DriveApp.getFileById(fileID).moveTo(DriveApp.getFolderById(targetID)); return HtmlService .createHtmlOutput("

File Moved

") .setTitle('File Moved'); } ///// function moveFileToRoot(fileID) { var output = DriveApp.getFileById(fileID).moveTo(DriveApp.getRootFolder()); return HtmlService .createHtmlOutput("

File moved To Root

") .setTitle('File Moved To Root'); } /*###################### SPREADSHEET FUNCTIONS ######################*/ /////createSheet(e.parameter.name) function createSheet(name) { var newSpreadsheet = SpreadsheetApp.create(name,20,10); var output = "sheetId::" + newSpreadsheet.getName() + "::" + newSpreadsheet.getId(); return HtmlService .createHtmlOutput("

Sheet Created
" + output + "

") .setTitle('New Sheet Created'); } /////createSheetInFolder(e.parameter.name,e.parameter.targetID) function createSheetInFolder(name,targetID) { var newSpreadsheet = SpreadsheetApp.create(name,20,10); folder=DriveApp.getFolderById(targetID); var file = DriveApp.getFileById(newSpreadsheet.getId()); folder.addFile(file); DriveApp.removeFile(file); var output = "sheetInFolderId::" + newSpreadsheet.getName() + "::" + newSpreadsheet.getId(); return HtmlService .createHtmlOutput("

Sheet Created
" + output + "

") .setTitle('New Sheet Created'); } /////get a specified range of data back from a sheet/grid function getSheetRangeData(sheetID,gridName,data) { var ss = SpreadsheetApp.openById(sheetID); var rng = JSON.stringify(ss.getRange(gridName +"!"+ data).getValues()); rng = "sheetRangeData::" + rng.replace(/"([^"]*)'([^"]*)"/g, "$1\\'$2"); return HtmlService .createHtmlOutput("

Got Range Data from Sheet

") .setTitle('Got Range Data from Sheet'); } /////get all contigious data from a specified sheet/grid function getSheetData (sheetID,gridName) { var ss = SpreadsheetApp.openById(sheetID); var sh = ss.getSheetByName(gridName); var values = JSON.stringify(sh.getDataRange().getValues()); values = "sheetData::" + values.replace(/"([^"]*)'([^"]*)"/g, "$1\\'$2"); return HtmlService .createHtmlOutput("

Got Data from Sheet

") .setTitle('Got Data from Sheet'); } /////get all the grid names from a specified sheet function getGridNames(sheetID) { var grids = []; var ss = SpreadsheetApp.openById(sheetID); var shs = ss.getSheets(); for (var i=0 ; i

Sheet Gridnames returned

") .setTitle('Sheet Gridnames returned'); } /////insert a new grid, with name, to a specified sheet function insertGridToSheet(name,sheetID) { SpreadsheetApp.openById(sheetID).insertSheet(name); return HtmlService .createHtmlOutput("

New Grid added

") .setTitle('New Grid added'); } /////append row of data to specified sheet/grid function appendRowToSheet(data,sheetID,gridName) { var ss = SpreadsheetApp.openById(sheetID); var sh = ss.getSheetByName(gridName); row = data.split(","); sh.appendRow(row); return HtmlService .createHtmlOutput("

Data Row Appended to Sheet

") .setTitle('Data Row Appended to Sheet'); } ///// run query on sheet/grid function queryData(sheetID,gridName,query) { var ss = SpreadsheetApp.openById(sheetID); var sh = ss.getSheetByName(gridName); var rg = sh.getName() + "!" + sh.getDataRange().getA1Notation(); var sql = query; var qry = '=query(' + rg + ',\"' + sql + '\",1)'; var ts = ss.insertSheet(); var setQuery = ts.getRange(1,1).setFormula(qry); var getResult = ts.getDataRange().getValues(); ss.deleteSheet(ts); var outString = JSON.stringify(getResult); outString = "queryData::" + outString.replace(/"([^"]*)'([^"]*)"/g, "$1\\'$2"); return HtmlService .createHtmlOutput("

Query completed
" + outString + "

") .setTitle('Query completed'); } ///// sets new data to sheet function setDataToSheet(sheetID,gridName,data) { var ss = SpreadsheetApp.openById(sheetID); var sh = ss.getSheetByName(gridName); sh.clearContents(); var arr = JSON.parse(data); if ( /^\[{2}/.test(data) === true ) { sh.getRange(1,1,arr.length,arr[0].length).setValues(arr); } else { sh.appendRow(arr); } return HtmlService .createHtmlOutput("

Data Set to Sheet

") .setTitle('Data Set to Sheet'); } ///// function setDataToCell(sheetID,gridName,data,cellRef) { var ss = SpreadsheetApp.openById(sheetID); var sh = ss.getSheetByName(gridName); var cell = sh.getRange(cellRef); cell.setValue(data); return HtmlService .createHtmlOutput("

Data Set to Cell

") .setTitle('Data Set to Cell'); } ///// function setDataToRange(sheetID,gridName,data,a1Range) { var ss = SpreadsheetApp.openById(sheetID); var sh = ss.getSheetByName(gridName); var rngData = JSON.parse(data); sh.getRange(a1Range).setValues(rngData); return HtmlService .createHtmlOutput("

Data Set to Range

") .setTitle('Data Set to Range'); } ///// utility function for sh get* functions, e.g. "getLastColumn" function gdcutil(sheetID,gridName,call) { var ss = SpreadsheetApp.openById(sheetID); var sh = ss.getSheetByName(gridName); var output = ""; if ( call == 'getLastRow') { output = sh.getLastRow(); } else if ( call == 'getLastColumn') { output = sh.getLastColumn(); } else if ( call == 'getMaxColumns') { output = sh.getMaxColumns(); } else if ( call == 'getMaxRows') { output = sh.getMaxRows(); } else if ( call == 'getName') { output = sh.getName(); } else if ( call == 'getParent') { output = sh.getParent(); } else if ( call == 'getIndex') { output = sh.getIndex(); } else if ( call == 'getSheetId') { output = sh.getSheetId(); } else if ( call == 'getSheetName') { output = sh.getSheetName(); } output = "utility::" + call + "::" + output; return HtmlService .createHtmlOutput("

Utility

") .setTitle('Utility'); } ///// function returnColumnData(sheetID,gridName,column) { var ss = SpreadsheetApp.openById(sheetID); var sh = ss.getSheetByName(gridName); var lr = sh.getLastRow(); var colData = "columnData::" + JSON.stringify(sh.getRange(1,parseInt(column),lr,1).getValues().flat()); return HtmlService .createHtmlOutput("

Column Data

") .setTitle('Column Data'); } ///// function insertColumnData(sheetID,gridName,column,data) { var ss = SpreadsheetApp.openById(sheetID); var sh = ss.getSheetByName(gridName); var lr = sh.getLastRow(); var lc = sh.getLastColumn(); var colNum = parseInt(column); if ( colNum < lc ) { sh.insertColumnBefore(colNum); } else { sh.insertColumnAfter(lc); colNum = lc + 1; } var colObj = JSON.parse(data); var colIns = []; for (var i=0; i

Inserted Column Data

") .setTitle('Inserted Column Data'); } ///// function deleteColumn(sheetID,gridName,column) { var ss = SpreadsheetApp.openById(sheetID); var sh = ss.getSheetByName(gridName); sh.deleteColumn(parseInt(column)); return HtmlService .createHtmlOutput("

Column Deleted

") .setTitle('Column Deleted'); } ///// function returnRowData(sheetID,gridName,row) { var ss = SpreadsheetApp.openById(sheetID); var sh = ss.getSheetByName(gridName); var lc = sh.getLastColumn(); var rowData = "rowData::" + JSON.stringify(sh.getRange(parseInt(row), 1, 1, lc).getValues().flat()); return HtmlService .createHtmlOutput("

Row Data

") .setTitle('Row Data'); } ///// function insertRowData(sheetID,gridName,row,data) { var ss = SpreadsheetApp.openById(sheetID); var sh = ss.getSheetByName(gridName); var lr = sh.getLastRow(); var lc = sh.getLastColumn(); var rowNum = parseInt(row); if ( rowNum < lr ) { sh.insertRowBefore(rowNum); } else { sh.insertRowAfter(lr); rowNum = lr + 1; } var rowObj = JSON.parse(data); var lgth = rowObj[0].length; if (lgth !== lc) { lc = lgth; } var rng = sh.getRange(rowNum, 1, 1, lc); rng.setValues(rowObj); return HtmlService .createHtmlOutput("

Inserted Row Data

") .setTitle('Inserted Row Data'); } ///// function deleteRow(sheetID,gridName,row) { var ss = SpreadsheetApp.openById(sheetID); var sh = ss.getSheetByName(gridName); sh.deleteRow(parseInt(row)); return HtmlService .createHtmlOutput("

Row Deleted

") .setTitle('Row Deleted'); } ///// function getDataNamedRange(sheetID,name) { var ss = SpreadsheetApp.openById(sheetID); var rng = ss.getRangeByName(name); var data = JSON.stringify(rng.getValues()); return HtmlService .createHtmlOutput("

Got Named Range Data

") .setTitle('Got Named Range Data'); } ///// function setNamedRange(sheetID,gridName,a1Range,name) { var ss = SpreadsheetApp.openById(sheetID); var sh = ss.getSheetByName(gridName); var rng = sh.getRange(a1Range); ss.setNamedRange(name, rng); return HtmlService .createHtmlOutput("

Set Named Range

") .setTitle('Named Range Set'); }