- Folders
- Files
- Files and Folders
- Sheets and Docs
/** * Returns true if the value is in the array. * * @param {Array} arr * @param {*} val * @returns {boolean} */ function checkValIn(arr, val) { return arr.indexOf(val) > -1; } var arr_cvi = [1, 2, 3, 4]; Logger.log(checkValIn(arr_cvi, 5)); // false/** * Returns an array with no duplicate values. * * @param {Array} arr * @returns {Array} */ function rmDuplicatesFrom(arr) { var check = {}; var result = []; var j = 0; for(var i = 0; i < arr.length; i++) { var item = arr[i]; if(check[item] !== 1) { check[item] = 1; result[j++] = item; } } return result; } var arr_rdf = [1, 2, 3, 1, 2, 3, 4,]; Logger.log(rmDuplicatesFrom(arr_rdf)); // [1, 2, 3, 4]/** * Returns an array with no empty elements. * * @param {*} x * @returns {Array} */ function rmEmptyEl(x) { return (x !== (undefined || '')); } var arr_rev = ["a",,"b",,,"c"]; Logger.log(arr_rev.filter(rmEmptyEl)); // ["a", "b", "c"]/** * Returns an array of objects. Objects have two properties, count and value. * * @param {Array} arr * @property {value} a value found in the array * @property {count} count of the value in the array * @returns {Object[]} */ function countOfValIn(arr) { var result = []; var copy = arr.slice(0); for (var i = 0; i < arr.length; i++) { var myCount = 0; for (var w = 0; w < copy.length; w++) { if (arr[i] == copy[w]) { myCount++; delete copy[w]; } } if (myCount > 0) { var obj = {}; obj.value = arr[i]; obj.count = myCount; result.push(obj); } } return result; } var arr_covi = ["a", "b", "c", "a", "b", "c", "a"]; Logger.log(countOfValIn(arr_covi)); // [{count=3.0, value=a}, {count=2.0, value=b}, {count=2.0, value=c}]/** * Returns an array of the elements in both arrays. * * @param {Array} arrA * @param {Array} arrB * @returns {Array} */ function intersectOf(arrA, arrB) { var a = 0; var b = 0; var result = []; while( a < arrA.length && b < arrB.length ) { if (arrA[a] < arrB[b] ) { a++; } else if (arrA[a] > arrB[b] ) { b++; } else { result.push(arrA[a]); a++; b++; } } return result; } var arrA_io = [1, 2, 3]; var arrB_io = [3, 4, 5]; Logger.log(intersectOf(arrA_io, arrB_io)); // [3]/** * Returns true if both arrays have the same elements in the same order. * * @param {Array} arrA * @param {Array} arrB * @returns {boolean} */ function compareArr(arrA, arrB) { if(arrA.length !== arrB.length) return false; for(var i = arrA.length; i--;) { if(arrA[i] !== arrB[i]) return false; } return true; } var arrA_ca = [1, 2, 3, 4, 5]; var arrB_ca = [1, 2, 3, 4, 5]; var arrC_ca = ["a", "b", "c", "d", "e"]; Logger.log(compareArr(arrA_ca, arrB_ca)); // true Logger.log(compareArr(arrA_ca, arrC_ca)); // false/** * Returns a string of array values. * Elements are separated by a delimiter and a space. * * @param {Array} arr * @param {string} delim * @returns {string} */ function delimStrFromArr(arr, delim) { var _arr = rmDuplicatesFrom(arr).sort(); var result = ""; for (var i = 0; i < _arr.length; i++) { result += _arr[i] + delim + " "; } result = result.slice(0, -2); return result; } var arr_da = ["c@example.com", "b@example.com", "a@example.com"]; Logger.log(delimStrFromArr(arr_da, ",")); // "a@example.com, b@example.com, c@example.com"/** * Returns a string of array values. * Elements are separated by a delimiter and a space, each followed by a modification. * * @param {Array} arr * @param {string} delim * @param {string} mod Modification to append to each item in the array. * @returns {string} */ function delimStrFromArrMod(arr, delim, mod) { var _arr = rmDuplicatesFrom(arr).sort(); var result = ""; for (var i = 0; i < _arr.length; i++) { result += _arr[i] + mod + delim + " "; } result = result.slice(0, -2); return result; } var arr_clfd = ["x", "z", "y"]; Logger.log(delimStrFromArrMod(arr_clfd, ",", "@example.com")); // "x@example.com, y@example.com, z@example.com"/** * Returns an array containing all values in a two-dimensional array. * * @param {Array[]} twoDArr * @returns {Array} */ function flattenTwoDArr(twoDArr) { var result = twoDArr.reduce(function(a, b) { return a.concat(b); }); return result; } var sheet_fma = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1"); var val_fma = sheet_fma.getRange("G2:H5").getValues(); Logger.log(flattenTwoDArr(val_fma).sort()); // [1, 2, 3, 4, 5, 6, 7, 8]var ex_arrObj = [ {a: 1000, b: 1, c: 5}, {a: 10000, b: 2, c: 5000}, {a: 10, b: 2, c: 500}, {a: 1, b: 1, c: 50} ]/** * Returns an array of objects sorted by a single property value. * * @param {string} prop * @returns {Object[]} */ function dynSort(prop) { var sortOrder = 1; if(prop[0] === "-") { sortOrder = -1; prop = prop.substr(1); } return function (a,b) { var result = (a[prop] < b[prop]) ? -1 : (a[prop] > b[prop]) ? 1 : 0; return result * sortOrder; }; } Logger.log(ex_arrObj.sort(dynSort("a"))); // [{a=1.0, b=1.0, c=50.0}, {a=10.0, b=2.0, c=500.0}, {a=1000.0, b=1.0, c=5.0}, {a=10000.0, b=2.0, c=5000.0}] /** * Returns an array of objects sorted by multiple property values. * @param {...string} * @returns {Object[]} */ function dynSortM() { var props = arguments; return function (obj1, obj2) { var i = 0, result = 0, numberOfProperties = props.length; while(result === 0 && i < numberOfProperties) { result = dynSort(props[i])(obj1, obj2); i++; } return result; }; } Logger.log(ex_/rrObj.sort(dynSortM("b", "c"))); // [{a=1000.0, b=1.0, c=5.0}, {a=1.0, b=1.0, c=50.0}, {a=10.0, b=2.0, c=500.0}, {a=10000.0, b=2.0, c=5000.0}]/** * Returns the first object in an array of objects with the key value pair. * * @param {Object[]} arrObj * @param {string} pQuery * @param {string} val * @returns {Object} */ function findObjIn(arrObj, pQuery, val) { for (var i = 0; i < arrObj.length; i++) { var obj = arrObj[i]; for (var prop in obj) { if (obj.hasOwnProperty(pQuery) && prop == pQuery && obj[prop] == val) { return obj; } } } } Logger.log(findObjIn(ex_arrObj,"a",1000)); // {a=1000.0, b=1.0, c=5.0} /** * Returns a value from the first matching object in the array. * * @param {Object[]} arrObj * @param {string} pQuery * @param {string} val * @param {string} pReturn * @returns {*} */ function findObjValIn(arrObj, pQuery, val, pReturn) { for (var i = 0; i < arrObj.length; i++) { var obj = arrObj[i]; for (var prop in obj) { if (obj.hasOwnProperty(pQuery) && prop == pQuery && obj[prop] == val) { return obj[pReturn]; } } } } Logger.log(findObjValIn(ex_arrObj, "c", 500, "a")); // 10/** * Returns the object with the oldest Timestamp value. * * @param {Object[]} arrObj * @returns {Object} */ function earliestTS(arrObj){ if (arrObj.length >= 2) { var sorted = arrObj.sort(function(a,b){ return new Date(a.Timestamp) - new Date(b.Timestamp); }); return sorted[0]; } else { return arrObj[0]; } } var sheet_fe = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1"); var arrObj_fe = arrObjFromRange(sheet_fe, "J1:K4"); Logger.log(earliestTS(arrObj_fe)); // {Timestamp=Sun Feb 19 19:43:40 GMT-06:00 2017, Multiple Choice=A} /** * Returns the object with the latest Timestamp value. * * @param {Object[]} arrObj * @returns {Object} */ function latestTS(arrObj) { if (arrObj.length >= 2) { var sorted = arrObj.sort(function(a,b){ return new Date(b.Timestamp) - new Date(a.Timestamp); }); return sorted[0]; } else { return arrObj[0]; } } var sheet_le = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1"); var arrObj_le = arrObjFromRange(sheet_le, "J1:K4"); Logger.log(latestTS(arrObj_le)); // {Timestamp=Wed Feb 22 19:45:07 GMT-06:00 2017, Multiple Choice=C}/** * Returns an array of objects containing matching objects. * * @param {Object} arrObj * @param {string} pQuery * @param {string[]} arrVal * @returns {Object[]} */ function filterObjIn(arrObj, pQuery, arrVal) { var result = []; for (var i = 0; i < arrVal.length; i++) { var val = arrVal[i]; for (var j = 0; j < arrObj.length; j++) { if (arrObj[j][pQuery] == val) result.push(arrObj[j]); } } return result; } Logger.log(filterObjIn(ex_arrObj, "a", [10])); // [{a=10.0, b=2.0, c=500.0}] Logger.log(filterObjIn(ex_arrObj, "c", [5, 500])); // [{a=1000.0, b=1.0, c=5.0}, {a=10.0, b=2.0, c=500.0}]/** * Returns an array of objects, with an additional property value added to each matching object. * * @param {Object[]} arrObj * @param {string[]} arrProp * @param {string} newProp * @returns {Object[]} */ function unifyPropForArrObj(arrObj, arrProp, newProp){ for (var i = 0; i < arrObj.length; i++){ var obj = arrObj[i]; for (var h = 0; h < arrProp.length; h++) { for (var prop in obj) { if (obj.hasOwnProperty(prop) && prop == arrProp[h] && obj[prop] !== ""){ obj[newProp] = obj[prop]; } } } } return arrObj; } var arrObj_upfao = [ {x: 123}, {y: 234}, {z: 345}, ]; Logger.log(unifyPropForArrObj(arrObj_upfao, ["x","y","z"], "new")); // [{new=123.0, x=123.0}, {new=234.0, y=234.0}, {new=345.0, z=345.0}]/** * Returns an array of matching properties. * * @requires intersectOf() * @param {Object} obj * @param {string[]} props * @returns {Array} */ function filterValIn(obj, props) { var result = []; var keys = intersectOf(Object.keys(obj), props); for (var i = 0; i < keys.length; i++) { var key = keys[i]; for (var prop in obj) { if (obj.hasOwnProperty(key)) { result.push(obj[key]); break; } } } return result; } var obj_fvi = { a: 1, b: 2, c: 3 }; var arr_fvi = ["a", "b", "d"]; Logger.log(filterValIn(obj_fvi, arr_fvi)); // [1, 2]/** * Returns an object with the values of the argument objects. * If multiple objects have the same property value, the last value set is retained. * @param {...Object} * @returns {Object} */ function mergeObjs() { var obj = arguments[0]; for (i = 1; i < arguments.length; i++) { var src = arguments[i]; for (var key in src) { if (src.hasOwnProperty(key)) obj[key] = src[key]; } } return obj; } var objA_mo = { a: 1, b: 2, c: 3 }; var objB_mo = { c: 4, d: 5, e: 6, f: 7 }; Logger.log(mergeObjs(objA_mo, objB_mo)); // {a=1.0, b=2.0, c=4.0, d=5.0, e=6.0, f=7.0}/** * Returns a string of today's date formatted "month-day-year". * * @returns {string} */ function fmatD() { var n = new Date(); var d = [ n.getMonth() + 1, n.getDate(), n.getYear() ]; return d.join("-"); } Logger.log(fmatD()); // "4-24-2017" /** * Returns a string of the current time formatted "hour:minute:second". * * @returns {string} */ function fmat24T(){ var n = new Date(); var t = [ n.getHours(), n.getMinutes(), n.getSeconds() ]; for ( var i = 1; i < 3; i++ ) { if ( t[i] < 10 ) { t[i] = "0" + t[i]; } return t.join(":"); } } Logger.log(fmat24T()); // "20:43:40" /** * Returns a string of today's date and the current time formatted "month-day-year hour:minute:second AM/PM" * * @returns {string} */ function fmat12DT() { var n = new Date(); var d = [ n.getMonth() + 1, n.getDate(), n.getYear() ]; var t = [ n.getHours(), n.getMinutes(), n.getSeconds() ]; var s = ( t[0] < 12 ) ? "AM" : "PM"; t[0] = ( t[0] <= 12 ) ? t[0] : t[0] - 12; for ( var i = 1; i < 3; i++ ) { if ( t[i] < 10 ) { t[i] = "0" + t[i]; } } return d.join("/") + " " + t.join(":") + " " + s; } Logger.log(fmat12DT()); // "4-24-2017 8:43:40 PM"/** * Returns a new date object from a string formatted year-month-date. * * @param {string} str * @returns {Date} */ function dateObjectFromString(str) { var split = str.split("-"); var months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]; return new Date (months[(split[1] - 1)] + " " + split[2] + ", " + split[0]); } Logger.log(dateObjectFromString("2017-04-24")); // Mon Apr 24 00:00:00 GMT-05:00 2017/** * Returns a value associated with a date range. * * @param {Object[]} arrObj * @param {string=new Date()} optDate - Date to match. * @namespace * @property {string} start - Starting date. * @property {string} end - Ending date. * @property {*} value - The value to return for a matching date. * @returns {*} */ function matchDateRange(arrObj, optDate) { var date = new Date(); if (optDate !== undefined) { date = new Date(optDate); } for (i = 0; i < arrObj.length; i++) { var start = new Date(arrObj[i].start); var end = new Date(arrObj[i].end); if (date >= start && date <= end ) { return arrObj[i].value; } } } var quarterDates = [ {start: "08/01/2016", end: "10/28/2016", value: 1}, {start: "11/02/2016", end: "01/09/2017", value: 2}, {start: "01/15/2017", end: "03/19/2017", value: 3}, {start: "03/21/2017", end: "06/15/2017", value: 4}, {start: "06/16/2017", end: "07/30/2017", value: "summer vacation"} ]; Logger.log(matchDateRange(quarterDates)); // "summer vacation" (06/25/2017) Logger.log(matchDateRange(quarterDates, "08/02/2016")); // 1 // -- Create or Verify Folder Path /** * Returns a folder at the end of a folder path. * The folder is created if it does not exist already. * * @param {string} path * @returns {Folder} */ function createVerifyPath(path) { var split = path.split('/'); var fldr; for (i = 0; i < split.length; i++) { var fi = DriveApp.getRootFolder().getFoldersByName(split[i]); if (i === 0) { if(!(fi.hasNext())) { DriveApp.createFolder(split[i]); fi = DriveApp.getFoldersByName(split[i]); } fldr = fi.next(); } else if (i >= 1) { fi = fldr.getFoldersByName(split[i]); if(!(fi.hasNext())) { fldr.createFolder(split[i]); fi = DriveApp.getFoldersByName(split[i]); } fldr = fi.next(); } } return fldr; } Logger.log(createVerifyPath("google-apps-script-cheat-sheet-demo/folders/A/B/C")); // C/** * Returns the last folder in a folder path. * * @param path * @returns {Folder} */ function lastFolderIn(path) { var fi; var split = path.split('/'); var fldr; for (i = 0; i < split.length; i++) { if (i === 0) { fi = DriveApp.getRootFolder().getFoldersByName(split[i]); if (fi.hasNext()) { fldr = fi.next(); } } else if (i >= 1) { fi = fldr.getFoldersByName(split[i]); if (fi.hasNext()) { fldr = fi.next(); } } } return fldr; } // Logger.log(lastFolderIn("google-apps-script-cheat-sheet-demo/folders/A/B")); // B // Logger.log(lastFolderIn("google-apps-script-cheat-sheet-demo/folders/A/B/C/D/E/F/G")); // C/** * Returns an array of all folders in a folder. * * @param {Folder} fldr * @returns {Folder[]} */ function foldersIn(fldr) { var fi = fldr.getFolders(); var arr = []; while (fi.hasNext()) { var _fldr = fi.next(); arr.push(_fldr); } return arr; } Logger.log(foldersIn(lastFolderIn("google-apps-script-cheat-sheet-demo/folders/"))); // [A]/** * Returns an array of all folders in the root of the user's Drive. * * @returns {Folder[]} */ function rootFolders() { var rf = DriveApp.getRootFolder(); var fi = rf.getFolders(); var arr = []; while (fi.hasNext()) { var fldr = fi.next(); arr.push(fldr); } return arr; } Logger.log(rootFolders());/** * Returns an array of all folders in the user's Drive. * * @returns {Folder[]} */ function allFolders() { var fi = DriveApp.getFolders(); var arr = []; while (fi.hasNext()) { var fldr = fi.next(); arr.push(fldr); } return arr; } Logger.log(allFolders());/** * Returns an array of folder names. * * @param {Folders[]} * @returns {string[]} */ function folderNames(fldrs) { var arr = []; for (var i = 0; i < fldrs.length; i++) { var name = fldrs[i].getName(); arr.push(name); } return arr; } var arr_fn = foldersIn(lastFolderIn("google-apps-script-cheat-sheet-demo/folders/A/B")); Logger.log(folderNames(arr_fn)); // [C]/** * Returns a folder. * * @requires foldersIn() * @requires folderNames() * @requires checkValIn() * @param {Folder} fldr * @param {string} name * @returns {Folder} */ function findFolderIn(fldr, name) { var fldrs = foldersIn(fldr); var names = folderNames(fldrs); if (checkValIn(names, name)) { var _fldr = fldr.getFoldersByName(name).next(); return _fldr; } } var fldr_ffi = lastFolderIn("google-apps-script-cheat-sheet-demo/folders"); Logger.log(findFolderIn(fldr_ffi, "A")); // A/** * Returns a folder at the root of the user's Drive. * * @requires rootFolders() * @requires folderNames() * @requires checkValIn() * @param {string} name * @returns {Folder} */ function findFolderAtRoot(name) { var rf = DriveApp.getRootFolder(); var fldrs = rootFolders(); var names = folderNames(fldrs); if (checkValIn(names, name)) { var fldr = rf.getFoldersByName(name).next(); return fldr; } } Logger.log(findFolderAtRoot("google-apps-script-cheat-sheet-demo")); // google-apps-script-cheat-sheet-demo/** * Returns the first matching folder in Drive. * * @param {string} name * @returns {Folder} */ function findFolderInDrive(name) { var fi = DriveApp.getFoldersByName(name); while (fi.hasNext()){ var fldr = fi.next(); return fldr; } } Logger.log(findFolderInDrive("folders")); // folders/** * Returns a folder. * Creates folders within a folder if they don't already exist. * * @requires foldersIn() * @requires folderNames() * @requires checkValIn() * @param {Folder} fldr * @param {string[]} names * @returns {Folder} */ function createVerifyFoldersIn(fldr, names) { var fldrs = foldersIn(fldr); var _names = folderNames(fldrs); for (i = 0; i < names.length; i++) { if (!(checkValIn(_names, names[i]))) { fldr.createFolder(names[i]); } } return fldr; } var fldr_cvfi = lastFolderIn("google-apps-script-cheat-sheet-demo/folders"); Logger.log(createVerifyFoldersIn(fldr_cvfi, ["X", "Y", "Z"])); // folders Logger.log(foldersIn(fldr_cvfi)); // [A,X,Y,Z]/** * Returns the root folder. * Creates folders at root if they don't exist already. * * @param {string[]} names * @returns {Folder} */ function createVerifyFoldersAtRoot(names) { var rfs = rootFolders(); var _names = folderNames(rfs); for (i=0; i < names.length; i++) { if (!(checkValIn(_names, names[i]))) { DriveApp.createFolder(names[i]); } } return DriveApp.getRootFolder(); } /** * Returns an array of files found at the top level of a folder. * * @param {Folder} fldr * @returns {File[]} */ function filesIn(fldr) { var fi = fldr.getFiles(); var arr = []; while (fi.hasNext()) { var file = fi.next(); arr.push(file); } return arr; } var fldr_fin = lastFolderIn("google-apps-script-cheat-sheet-demo/files"); Logger.log(filesIn(fldr_fin)); // [example-file]/** * Returns an array of all files at the root of a user's Drive. * * @returns {File[]} */ function rootFiles() { var rf = DriveApp.getRootFolder(); var fi = rf.getFiles(); var arr = []; while (fi.hasNext()) { var file = fi.next(); arr.push(file); } return arr; } Logger.log(rootFiles());/** * Returns an array of all files in the user's Drive. * * @returns {File[]} */ function allFiles() { var fi = DriveApp.getFiles(); var arr = []; while (fi.hasNext()) { var file = fi.next(); arr.push(file); } return arr; } Logger.log(allFiles());/** * Returns an array of file names. * * @param {File[]} files * @returns {string[]} */ function fileNames(files) { var arr = []; for (var i = 0; i < files.length; i++) { var name = files[i].getName(); arr.push(name); } return arr; } var fldr_fnam = lastFolderIn("google-apps-script-cheat-sheet-demo/files"); var arr_fnam = filesIn(fldr_fnam); Logger.log(fileNames(arr_fnam)); // [example-file]/** * Returns a file found at the top level of a folder. * * @requires filesIn() * @requires fileNames() * @requires checkValIn() * @param {Folder} fldr * @param {string} name * @returns {File} */ function findFileIn(fldr, name) { var files = filesIn(fldr); var names = fileNames(files); if (checkValIn(names, name)) { var file = fldr.getFilesByName(name).next(); return file; } } var fldr_ffi = lastFolderIn("google-apps-script-cheat-sheet-demo/files"); Logger.log(findFileIn(fldr_ffi, "example-file")); // example-file/** * Returns a file found at the root of a user's Drive. * * @requires rootFiles() * @requires fileNames() * @requires checkValIn() * @param {string} name * @returns {File} */ function findFileAtRoot(name) { var rf = DriveApp.getRootFolder(); var files = rootFiles(); var names = fileNames(files); if (checkValIn(names, name)) { var file = rf.getFilesByName(name).next(); return file; } }/** * Returns the first matching file found in the user's Drive. * * @param {string} name * @returns {File} */ function findFileInDrive(name) { var fi = DriveApp.getFilesByName(name); while (fi.hasNext()){ var file = fi.next(); return file; } } Logger.log(findFileInDrive("example-file")); // example-file/** * Returns the file found at the end of a path. * * @param {string} path * @returns {File} */ function findFileAtPath(path) { var fi; var split = path.split('/'); var file = split[split.length -1]; var fldr; for (i = 0; i < split.length - 1; i++) { if (i === 0) { fi = DriveApp.getRootFolder().getFoldersByName(split[i]); if (fi.hasNext()) { fldr = fi.next(); } else { return null; } } else if (i >= 1) { fi = fldr.getFoldersByName(split[i]); if (fi.hasNext()) { fldr = fi.next(); } else { return null; } } } return findFileIn(fldr, file); } Logger.log(findFileAtPath("google-apps-script-cheat-sheet-demo/files/example-file"));/** * Returns the copied file. * * @requires findFileIn() * @param {File} file * @param {Folder} fldr * @returns {File} */ function copyFile(file, fldr) { var name = file.getName(); var dest = findFileIn(fldr, name); if (dest === undefined) file.makeCopy(name, fldr); return findFileIn(fldr, name); } var fldr_cf = createVerifyPath("google-apps-script-cheat-sheet-demo/files/copied"); var file_cf = findFileInDrive("example-file"); Logger.log(copyFile(file_cf, fldr_cf)); // example-file/** * Returns the copied file from its new destination. * * @requires findFileIn() * @param {File} file * @param {Folder} fldr * @returns {File} */ function moveFile(file, fldr) { var name = file.getName(); var dest = findFileIn(fldr, name); if (dest === undefined) file.makeCopy(name, fldr); var _file = findFileIn(fldr, name); if (_file !== undefined) file.setTrashed(true); return _file; } var fldr_mf1 = lastFolderIn("google-apps-script-cheat-sheet-demo/files/copied"); var file_mf = findFileIn(fldr_mf1, "example-file"); var fldr_mf2 = createVerifyPath("google-apps-script-cheat-sheet-demo/files/moved"); Logger.log(moveFile(file_mf, fldr_mf2)); // example-file/** * Returns a renamed file or a folder. * * @param {File || Folder} file_fldr * @param {string} name * @returns {File || Folder} */ function renameFileFldr(file_fldr, name) { file_fldr.setName(name); return file_fldr; } var fldr_rf = lastFolderIn("google-apps-script-cheat-sheet-demo/files/moved"); var file_rf = findFileIn(fldr_rf, "example-file"); Logger.log(renameFileFldr(file_rf, "modified-example-file")); // modified-example-file/** * Returns the parent folder or a file or a folder. * * @param {File || Folder} file_fldr * @returns {Folder} */ function parentFolderOf(file_fldr) { var fi = file_fldr.getParents(); return fi.next(); } var file_pfo = findFileInDrive("example-file"); Logger.log(parentFolderOf(file_pfo)); // filesfunction jsonExFile() { var fldr = createVerifyPath("google-apps-script-cheat-sheet-demo/json"); var file = findFileIn(fldr, "example-json"); var json = jsonFromUrl("https://raw.githubusercontent.com/jcodesmn/google-apps-script-cheat-sheet/dev/example.json"); var text = JSON.stringify(json); if (!(file)){fldr.createFile("example-json");} file.setContent(text); return findFileIn(fldr, "example-json"); } jsonExFile();/** * Returns an object from a URL. * * @param {string} url * @returns {Object} */ function objFromUrl(url) { var rsp = UrlFetchApp.fetch(url); var data = rsp.getContentText(); return JSON.parse(data); } var obj_ofu = objFromUrl("https://raw.githubusercontent.com/jcodesmn/google-apps-script-cheat-sheet/dev/example.json"); Logger.log(JSON.stringify(obj_ofu));/** * Returns an object from a file in Drive. * * @param {File} file * @returns {Object} */ function objFromFile(file) { var data = file.getBlob().getDataAsString(); return JSON.parse(data); } var file_off = findFileAtPath("google-apps-script-cheat-sheet-demo/json/example-json"); var obj_off = objFromFile(file_off); Logger.log(JSON.stringify(obj_off));/** * Returns an object from a URL or from a file in Drive. * * @param {string || File} input * @returns {Object} */ function objFromUrlOrFile(input) { var regExp = new RegExp("^(http|https)://"); var test = regExp.test(input); if (test) { return objFromUrl(input); } else { var file = findFileAtPath(input); return objFromFile(file); } } Logger.log(JSON.stringify(objFromUrlOrFile("https://raw.githubusercontent.com/jcodesmn/google-apps-script-cheat-sheet/dev/example.json"))); Logger.log(JSON.stringify(objFromUrlOrFile("google-apps-script-cheat-sheet-demo/json/example-json")));/** * Returns a spreadsheet. * This creates the spreadsheet if it does not already exist. * * @requires filesIn() * @requires fileNames() * @requires checkValIn * @requires moveFile() * @requires findFileIn() * @requires openFileAsSpreadsheet() * @param {Folder} fldr * @param {string} name * @returns {Spreadsheet} */ function createVerifySSIn(fldr, name) { var files = filesIn(fldr); var names = fileNames(files); if (!(checkValIn(names, name))) { var ss = SpreadsheetApp.create(name).getId(); var file = DriveApp.getFileById(ss); moveFile(file, fldr); } return openFileAsSpreadsheet(findFileIn(fldr, name)); } var fldr_cvssi = createVerifyPath("google-apps-script-cheat-sheet-demo/sheets"); Logger.log(createVerifySSIn(fldr_cvssi, "example-sheet")); // example-sheet/** * Returns a spreadsheet. * This creates the spreadsheet if it does not already exist. * * @requires rootFiles() * @requires fileNames() * @requires checkValIn() * @requires findFileAtRoot() * @requires openFileAsSpreadsheet() * @param {string} name * @returns {Spreadsheet} */ function createVerifySSAtRoot(name) { var files = rootFiles(); var names = fileNames(files); if (!(checkValIn(names, name))) { var ss = SpreadsheetApp.create(name); } return openFileAsSpreadsheet(findFileAtRoot(name)); }/** * Returns the Id of the active spreadsheet. * * @returns {string} */ function ssId() { var _id = SpreadsheetApp.getActiveSpreadsheet().getId(); return _id; } Logger.log(ssId());/** * Returns a spreadsheet. * * @param {string} * @returns {Spreadsheet} */ function openFileAsSpreadsheet(file) { var _id = file.getId(); var _ss = SpreadsheetApp.openById(_id); return _ss; } var fldr_ofas = lastFolderIn("google-apps-script-cheat-sheet-demo/sheets") var file_ofas = findFileIn(fldr_ofas, "example-sheet"); Logger.log(openFileAsSpreadsheet(file_ofas)); /** * Returns the column number as a alphabetical column value. * Columns are indexed from 1, not from 0. * "CZ" (104) is the highest supported value. * * @param {number} number * @returns {string} */ function numCol(number) { var num = number - 1, chr; if (num <= 25) { chr = String.fromCharCode(97 + num).toUpperCase(); return chr; } else if (num >= 26 && num <= 51) { num -= 26; chr = String.fromCharCode(97 + num).toUpperCase(); return "A" + chr; } else if (num >= 52 && num <= 77) { num -= 52; chr = String.fromCharCode(97 + num).toUpperCase(); return "B" + chr; } else if (num >= 78 && num <= 103) { num -= 78; chr = String.fromCharCode(97 + num).toUpperCase(); return "C" + chr; } } function ex_nc() { for (var i = 1; i <= 104; i++) { var j = numCol(i); Logger.log(i + " - " + j); } } ex_nc(); // 1 - A ... CZ - 104/** * Returns an alphabetical column value as a number. * * @param {string} column * @returns {number} */ function colNum(column) { var col = column.toUpperCase(), chr0, chr1; if (col.length === 1) { chr0 = col.charCodeAt(0) - 64; return chr0; } else if (col.length === 2) { chr0 = (col.charCodeAt(0) - 64) * 26; chr1 = col.charCodeAt(1) - 64; return chr0 + chr1; } } function ex_cn() { for (var i = 0; i <= 25; i++) { var abc = String.fromCharCode(97 + i).toUpperCase(); Logger.log(abc + " - " + colNum(abc)); } for (var i = 26; i <= 51; i++) { var abc = "A" + String.fromCharCode(97 - 26 + i).toUpperCase(); Logger.log(abc + " - " + colNum(abc)); } } ex_cn(); // A - 1 ... AZ - 52/** * Replicating import range in Google Apps Script. * Requires a trigger to function. * importRange : From spreadsheet : On edit * */ function importRange(){ var get = sheet_gs.getRange("A2:A5").getValues(); var set = sheet_gs.getRange("B2:B5").setValues(get); }/** * Returns true or false given truthy or falsy values. * true: 1, t*, T*, y*, Y* * false: 0, !t, || !y * * @param {string} input * @returns {boolean} */ function checkTF(input) { if (isNaN(input)) { var first_letter = input.charAt(0).toLowerCase(); if (first_letter === 't' || first_letter === 'y') { return true; } else { return false; } } else { if (input === 1) { return true; } else { return false; } } } Logger.log(checkTF("No")); // false Logger.log(checkTF("Yes")); // true/** * Returns an array of the sheet names for a spreadsheet. * * @param {Spreadsheet} ss * @returns {string[]} */ function arrSheetNames(ss) { var sheets = ss.getSheets(); var arr = []; for (var i = 0; i < sheets.length; i++) { arr.push(sheets[i].getName()); } return arr; } var ss_asn = SpreadsheetApp.getActiveSpreadsheet(); Logger.log(arrSheetNames(ss_asn)); // ["Sheet1", "Sheet2", "Sheet3"]/** * Returns an object from a range. * The top row of the range is assumed to be the header row. * Values in the header row become the object properties. * * @param {Sheet} sheet * @param {string} a1Notation * @returns {Object} */ function objFromRange(sheet, a1Notation) { var range = sheet.getRange(a1Notation); var height = range.getHeight(); var width = range.getWidth(); var values = range.getValues(); var obj = {}; for (var i = 0; i < values.length; i++) { obj[values[i][0]] = values[i][1]; } return obj; } var sheet_ofr = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1"); Logger.log(objFromRange(sheet_ofr, "D2:E5")); // {A=Alpha, B=Bravo, C=Charlie, D=Delta}/** * Returns an array of values for the top row of a range object. * * @param {Range} rangeObj * @returns {Array} */ function headerVal(rangeObj){ var vals = rangeObj.getValues(); var arr = []; for (var i = 0; i < vals[0].length; i++) { var val = vals[0][i]; arr.push(val); } return arr; } var sheet_hv = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2"); var range_hv = sheet_hv.getRange("A2:E19"); Logger.log(headerVal(range_hv)); // ["First", "Last", "Grade", "Homeroom", "Email"]/** * Returns an array of objects representing a range. * * @param {Range} rangeObj * @param {Array} headers * @returns {Object[]} */ function valByRow(rangeObj, headers){ var height = rangeObj.getHeight(); var width = rangeObj.getWidth(); var vals = rangeObj.getValues(); var arr = []; for (var i = 0; i < height; i++) { var row = {}; for (var j = 0; j < width; j++) { var prop = headers[j]; var val = vals[i][j]; if (val !== "") { row[prop] = val; } } arr.push(row); } return arr; } var sheet_vbr = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2"); var range_vbr = sheet_hv.getRange("A2:E19"); var headers_vbr = headerVal(range_vbr); Logger.log(valByRow(range_vbr, headers_vbr)); // [{Last=Last, Email=Email, Homeroom=Homeroom, Grade=Grade, First=First}, {Last=Garret, Email=agarret@example.com, Homeroom=Muhsina, Grade=6.0, First=Arienne}...]/** * Returns the header range for a targeted range. * * @param {Sheet} sheet * @param {string} a1Notation * @returns {Range} */ function headerRange(sheet, a1Notation) { var split = a1Notation.split(":"); var col0 = split[0].match(/\D/g,''); var col1 = split[1].match(/\D/g,''); var row = split[0].match(/\d+/g); var a1 = col0 + row + ":" + col1 + row; return sheet.getRange(a1); } var sheet_hr = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2"); Logger.log(headerRange(sheet_hr, "A2:E19").getA1Notation()); // "A2:E2" Logger.log(headerRange(sheet_hr, "A2:E19").getValues()); // [[First, Last, Grade, Homeroom, Email]]/** * Returns the value range for a targeted range. * * @param {Sheet} sheet * @param {string} a1Notation * @returns {Range} */ function valueRange(sheet, a1Notation) { var split = a1Notation.split(":"); var col0 = split[0].match(/\D/g,''); var row0 = split[0].match(/\d+/g); var col1 = split[1].match(/\D/g,''); var row1 = split[1].match(/\d+/g); var a1 = col0 + (Number(row0) + 1) + ":" + col1 + row1; return sheet.getRange(a1); } var sheet_vr = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2"); Logger.log(valueRange(sheet_vr, "A2:E19").getA1Notation()); // "A3:E19" Logger.log(valueRange(sheet_vr, "A2:E19").getValues()); // [[Arienne, Garret, 6.0, Muhsina, agarret@example.com], [Elissa, Jules, 6.0, Lale, ejules@example.com]...]/** * Returns an array of objects representing the values in a sheet. * * @requires numCol() * @requires headerVal() * @requires valByRow() * @param sheet * @param hRow * @returns {undefined} */ function arrObjFromSheet(sheet, hRow){ var lColNum = sheet.getLastColumn(); var lColABC = numCol(lColNum); var lRow = sheet.getLastRow(); var hRange = sheet.getRange("A" + hRow + ":" + lColABC + hRow); var headers = headerVal(hRange); var vRange = sheet.getRange("A" + (hRow +1) + ":" + lColABC + lRow); return valByRow(vRange, headers); } var sheet_aofs = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2"); Logger.log(arrObjFromSheet(sheet_aofs, 2)); // [{Last=Garret, Email=agarret@example.com, Homeroom=Muhsina, Grade=6.0, First=Arienne}, {Last=Jules, Email=ejules@example.com, Homeroom=Lale, Grade=6.0, First=Elissa}...]/** * Returns an array of values representing the values in a range. * * @requires headerRange() * @requires valueRange() * @requires headerVal() * @requires valByRow() * @param sheet * @param a1Notation * @returns {undefined} */ function arrObjFromRange(sheet, a1Notation) { var hRange = headerRange(sheet, a1Notation); var vRange = valueRange(sheet, a1Notation); var headers = headerVal(hRange); return valByRow(vRange, headers); } var sheet_aofr = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2"); Logger.log(arrObjFromRange(sheet_aofr, "A2:E7")); // [{Last=Garret, Email=agarret@example.com, Homeroom=Muhsina, Grade=6.0, First=Arienne}, {Last=Jules, Email=ejules@example.com, Homeroom=Lale, Grade=6.0, First=Elissa}...]/** * Returns an array containing all values in a column. * * @param {Sheet} sheet * @param {number} hRow * @param {string} name * @returns {Array} */ function arrForColName(sheet, hRow, name){ var lColNum = sheet.getLastColumn(); var lColABC = numCol(lColNum); var lRow = sheet.getLastRow(); var hRange = sheet.getRange("A" + hRow + ":" + lColABC + hRow); var headers = headerVal(hRange); var tColABC = numCol(headers.indexOf(name) + 1); var rangeObj = sheet.getRange(tColABC + (hRow +1) + ":" + tColABC + lRow); var height = rangeObj.getHeight(); var vals = rangeObj.getValues(); var arr = []; for (var i = 0; i < height; i++) { var val = vals[i][0]; arr.push(String(val)); } return arr; } var sheet_afcna = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2"); Logger.log(arrForColName(sheet_afcna, 2, "First")); // [Arienne, Elissa, Nerses, GΓΌlistan, Syed, Isaiah, Stanley, SΓ‘ra, Kaja, JΓ³zef, Radoslava, Sarah, Oluwasegun, Ekundayo, Gina, Sylvia, Cemil]/** * Returns an array containing all values in a column. * * @param {Sheet} sheet * @param {number} hRow * @param {number} colIndex * @returns {Array} */ function arrForColNo(sheet, hRow, colIndex){ var lColNum = sheet.getLastColumn(); var lColABC = numCol(lColNum); var lRow = sheet.getLastRow(); var hRange = sheet.getRange("A" + hRow + ":" + lColABC + hRow); var tColABC = numCol(colIndex); var rangeObj = sheet.getRange(tColABC + (hRow +1) + ":" + tColABC + lRow); var height = rangeObj.getHeight(); var vals = rangeObj.getValues(); var arr = []; for (var i = 0; i < height; i++) { var val = vals[i][0]; arr.push(String(val)); } return arr; } var sheet_afcno = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2"); Logger.log(arrForColNo(sheet_afcno, 2, 2)); // [Garret, Jules, Juda, Armen, Yeong-Suk, Coy, Stevie, Emin, Tiriaq, Dilay, Kirabo, Ariadna, Devrim, Adjoa, Suk, Lyle, Edita]/** * Returns an array containing all values in the first column of a range. * * @param {Range} rangeObj * @returns {Array} */ function arrForColRange(rangeObj){ var height = rangeObj.getHeight(); var vals = rangeObj.getValues(); var arr = []; for (var i = 0; i < height; i++) { arr.push(vals[i][0]); } return arr; } var sheet_vafro = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1"); var range_vafro = sheet_vafro.getRange("A2:F5"); Logger.log(arrForColRange(range_vafro)); // ["A", "B", "C", "D"]// --- Create or Verify Document in a Folder /** * Returns a document. * This creates the document if it does not already exist. * * @param {Folder} fldr * @param {string} name * @returns {Document} */ function createVerifyDocIn(fldr, name) { var files = filesIn(fldr); var names = fileNames(files); if (!(checkValIn(names, name))) { var doc = DocumentApp.create(name).getId(); var file = DriveApp.getFileById(doc); moveFile(file, fldr); } return openFileAsDocument(findFileIn(fldr, name)); } var fldr_cvdi = createVerifyPath("google-apps-script-cheat-sheet-demo/docs"); Logger.log(createVerifyDocIn(fldr_cvdi, "example-doc")); // example-doc/** * Returns a document. * This creates the document if it does not already exist. * * @param {string} name * @returns {Document} */ function createVerifyDocAtRoot(name) { var files = rootFiles(); var names = fileNames(files); if (!(checkValIn(names, name))) { var ss = DocumentApp.create(name); } return findFileAtRoot(name); }/** * Returns the Id of the active document. * * @returns {string} */ function docId() { var _id = DocumentApp.getActiveDocument().getId(); return _id; }/** * Returns a file as a document. * * @param {File} file * @returns {Document} */ function openFileAsDocument(file) { var _id = file.getId(); var _doc = DocumentApp.openById(_id); return _doc; } var fldr_ofad = lastFolderIn("google-apps-script-cheat-sheet-demo/docs"); var file_ofad = findFileIn(fldr_ofad, "example-doc"); Logger.log(openFileAsDocument(file_ofad));var fldr_adb = lastFolderIn("google-apps-script-cheat-sheet-demo/docs"); var file_adb = findFileIn(fldr_adb, "example-doc"); var doc_adb = openFileAsDocument(file_adb); doc_adb.appendParagraph("Hello, world!");var fldr_cdb = lastFolderIn("google-apps-script-cheat-sheet-demo/docs"); var file_cdb = findFileIn(fldr_cdb, "example-doc"); var doc_cdb = openFileAsDocument(file_cdb); var body_cdb = doc_cdb.getBody(); body_cdb.clear();var ex_obj = { name: "Jon", state: "MN", job: "IT Administrator" };/** * Returns a string. * Words wrapped by the delimiter are replaced with the matching property value. * * @param {Object} obj * @param {string} str * @param {string} delim * @returns {string} */ function strFromProp(obj, str, delim) { var split = str.split(" "); var result = []; for (var i = 0; i < split.length; i++) { var _str = split[i]; for (var prop in obj){ var first = _str.slice().charAt(0); var last = _str.slice().substr(-1); var mod = _str.substr(0, _str.length-1).substr(1); if ((obj.hasOwnProperty(mod)) && (first === delim) && (last === delim)) { result.push(obj[mod]); } else { result.push(_str); } break; } } return result.join(" "); } Logger.log(strFromProp(ex_obj, "name: %name% - state: %state% - job: %job%", "%")); // "name: Jon - state: MN - job: IT Administrator"/** * Words wrapped by the delimiter are replaced with the matching property value. * * @param {Object} obj * @param {Document} doc * @param {string} delim */ function findReplaceInDoc(obj, doc, delim) { var body = doc.getBody(); for (var prop in obj) { var query = delim + prop + delim; var val = obj[prop]; body.replaceText(query, val); } } var fldr_frid = createVerifyPath("google-apps-script-cheat-sheet-demo/merges"); var doc_frid = createVerifyDocIn(fldr_frid, "find-replace-doc"); var body_frid = doc_frid.getBody(); body_frid.clear(); doc_frid.appendParagraph("name: %name%"); doc_frid.appendParagraph("state: %state%"); doc_frid.appendParagraph("job: %job%"); findReplaceInDoc(ex_obj, doc_frid, "%");/** * Words wrapped by the delimiter are replaced with the matching property value. * * @param {Object} obj * @param {Spreadsheet} ss * @param {string} delim */ function findReplaceInSpreadsheet(obj, ss, delim) { var numSheets = ss.getNumSheets(); var sheets = ss.getSheets(); for (var i = 0; i < numSheets; i++) { var sheet = sheets[i]; var values = sheet.getDataRange().getValues(); for (var row in values){ var update = values[row].map(function(original) { var text = original.toString(); for (var prop in obj) { var query = delim + prop+ delim; if (text.indexOf(query) !== -1) { text = text.replace(query, obj[prop]); } } return text; }); values[row] = update; } sheet.getDataRange().setValues(values); } } var fldr_fris = createVerifyPath("google-apps-script-cheat-sheet-demo/merges"); var ss_frid = createVerifySSIn(fldr_fris, "find-replace-sheet"); var sheet_frid = ss_frid.getSheets()[0]; sheet_frid.clear(); var val_frid = [ [ "name", "state", "job" ], [ "%name%", "%state%", "%job%"] ]; var range_frid = sheet_frid.getRange("A1:C2"); range_frid.setValues(val_frid); findReplaceInSpreadsheet(ex_obj, ss_frid, "%");/** * Words wrapped by the delimiter are replaced with the matching property value. * * @param {Object} obj * @param {Sheet} sheet * @param {string} delim */ function findReplaceinSheet(obj, sheet, delim) { var values = sheet.getDataRange().getValues(); for(var row in values){ var update = values[row].map(function(original) { var text = original.toString(); for (var prop in obj) { var query = delim + prop + delim; if (text.indexOf(query) !== -1) { text = text.replace(query, obj[prop]); } } return text; }); values[row] = update; } sheet.getDataRange().setValues(values); } var fldr_fris = createVerifyPath("google-apps-script-cheat-sheet-demo/merges"); var ss_fris = createVerifySSIn(fldr_fris, "find-replace-sheet"); var sheet_fris = ss_fris.getSheets()[0]; sheet_fris.clear(); var val_fris = [ [ "name", "state", "job" ], [ "<<name>>", "<<state>>", "<<job>>"] ]; var range_fris = sheet_fris.getRange("A1:C2"); range_fris.setValues(val_fris); findReplaceinSheet(ex_obj, sheet_fris, "%");/** * For each object, create a new template document and merge in object values. * * @requires strFromProp() * @requires copyFile() * @requires findReplaceInDoc() * @param {Object[]} arrObj * @param {Document} templateDoc * @param {string} naming * @param {Folder} fldr * @param {boolean} ts * @param {string} delim */ function createDocsFromTemplateArrObj(arrObj, templateDoc, naming, fldr, ts, delim) { for (var i = 0; i < arrObj.length; i++) { var obj = arrObj[i]; var name = strFromProp(obj, naming, delim); if (ts === true) name += " - " + fmat12DT(); var file = DriveApp.getFileById(templateDoc.getId()); var docId = copyFile(file, fldr).setName(name).getId(); var doc = DocumentApp.openById(docId); findReplaceInDoc(obj, doc, delim); } } var sheet_cdftao = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2"); var arrObj_cdftao = arrObjFromSheet(sheet_cdftao, 2); var fldr1_cdftao = createVerifyPath("google-apps-script-cheat-sheet-demo/merges"); var fldr2_cdftao = createVerifyPath("google-apps-script-cheat-sheet-demo/merges/arrObj-docs"); var doc_cdftao = createVerifyDocIn(fldr1_cdftao, "template-doc"); var body_cdftao = doc_cdftao.getBody(); body_cdftao.clear(); doc_cdftao.appendParagraph("First: %First%"); doc_cdftao.appendParagraph("Last: %Last%"); doc_cdftao.appendParagraph("Grade: %Grade%"); doc_cdftao.appendParagraph("Homeroom: %Homeroom%"); doc_cdftao.appendParagraph("Email: %Email%"); createDocsFromTemplateArrObj(arrObj_cdftao, doc_cdftao, "Name: %Last% %First%", fldr2_cdftao, true, "%");/** * For each object, create a new template spreadsheet and merge in object values. * * @requires strFromProp() * @requires copyFile() * @requires findReplaceInSpreadsheet() * @param {Object[]} arrObj * @param {Spreadsheet} templateDoc * @param {string} naming * @param {Folder} fldr * @param {boolean} ts * @param {string} delim */ function createSpreadsheetsFromTemplateArrObj(arrObj, templateSS, naming, fldr, ts, delim) { for (var i = 0; i < arrObj.length; i++) { var obj = arrObj[i]; var name = strFromProp(obj, naming, delim); if (ts === true) name += " - " + fmat12DT(); var file = DriveApp.getFileById(templateSS.getId()); var ssId = copyFile(file, fldr).setName(name).getId(); var ss = SpreadsheetApp.openById(ssId); findReplaceInSpreadsheet(obj, ss, delim); } } var ss1_csftao = SpreadsheetApp.getActiveSpreadsheet(); var sheet1_csftao = ss1_csftao.getSheetByName("Sheet2"); var arrObj_csftao = arrObjFromSheet(sheet1_csftao, 2); var fldr1_csftao = createVerifyPath("google-apps-script-cheat-sheet-demo/merges"); var fldr2_csftao = createVerifyPath("google-apps-script-cheat-sheet-demo/merges/arrObj-sheets"); var file_csftao = createVerifySSIn(fldr1_csftao, "template-sheet"); var ss2_csftao = openFileAsSpreadsheet(file_csftao); var sheet2_csftao = ss2_csftao.getSheets()[0]; var val_csftao = [ [ "First", "Last", "Grade", "Homeroom", "Email" ], [ "%First%", "%Last%", "%Grade%", "%Homeroom%", "%Email%"] ]; var range_csftao = sheet2_csftao.getRange("A1:E2"); range_csftao.setValues(val_csftao); createSpreadsheetsFromTemplateArrObj(arrObj_csftao, file_csftao, "Name: %Last% %First%", fldr2_csftao, true, "%");var sheet_sdl = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2"); var arrObj_sdl = arrObjFromSheet(sheet_sdl, 2); var fldr_sdl = createVerifyPath("google-apps-script-cheat-sheet-demo/docs"); var file_sdl = createVerifyDocIn(fldr_sdl, "example-doc"); var doc_sdl = openFileAsDocument(file_sdl); var body_sdl = doc_sdl.getBody(); (function(){ arrObj_sdl.sort(dynSortM("Last", "First")); var sectionHeader = body_sdl.appendParagraph("Students"); sectionHeader.setHeading(DocumentApp.ParagraphHeading.HEADING1); for (var i in arrObj_sdl) { body_sdl.appendListItem(arrObj_sdl[i]["Last"] + ", " + arrObj_sdl[i]["First"]); } })();var sheet_mdl = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2"); var arrObj_mdl = arrObjFromSheet(sheet_mdl, 2); var fldr_mdl = createVerifyPath("google-apps-script-cheat-sheet-demo/docs"); var file_mdl = createVerifyDocIn(fldr_mdl, "example-doc"); var doc_mdl = openFileAsDocument(file_mdl); var body_mdl = doc_mdl.getBody(); (function(){ arrObj_mdl.sort(dynSortM("Homeroom", "Last", "First")); var sectionHeader = body_mdl.appendParagraph("Homerooms and Students"); sectionHeader.setHeading(DocumentApp.ParagraphHeading.HEADING1); var homeroom = arrObj_mdl[0]["Homeroom"]; body_mdl.appendListItem(homeroom); for (var i in arrObj_mdl) { if (arrObj_mdl[i]["Homeroom"] === homeroom) { body_mdl.appendListItem(arrObj_mdl[i]["First"] + " " + arrObj_mdl[i]["Last"]) .setNestingLevel(1).setIndentStart(10) .setGlyphType(DocumentApp.GlyphType.HOLLOW_BULLET); } else { homeroom = arrObj_mdl[i]["Homeroom"]; body_mdl.appendListItem(homeroom); body_mdl.appendListItem(arrObj_mdl[i]["First"] + " " + arrObj_mdl[i]["Last"]) .setNestingLevel(1).setIndentStart(10) .setGlyphType(DocumentApp.GlyphType.HOLLOW_BULLET); } } })();/** * Returns an array of objects. Subject and Body properties are appended to each object. * * @param {Object[]} arrObj * @param {string} subj * @param {string} body * @param {string} delim * @returns {Object[]} */ function appendSubjBodyForArrObj(arrObj, subj, body, delim) { for (var i = 0; i < arrObj.length; i++) { var obj = arrObj[i]; for (var prop in obj) { var search = delim + prop + delim; if (body.indexOf(search) !== -1) { body = body.replace(search, obj[prop]); } if (subj.indexOf(search) !== -1) { subj = subj.replace(search, obj[prop]); } } obj.Subject = subj; obj.Body = body; } return arrObj; } var sheet_aasbfao = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2"); var arrObj_asbfao = arrObjFromSheet(sheet_aasbfao, 2); var subj_asbfao = "Classroom update for %First% %Last%"; var body_asbfao = "<p>%First% %Last% is in %Homeroom%'s this fall!</p>"; Logger.log(appendSubjBodyForArrObj(arrObj_asbfao, subj_asbfao, body_asbfao, "%")); // [{Last=Garret, Email=agarret@example.com, Homeroom=Muhsina, Grade=6.0, First=Arienne, Body=<p>Arienne Garret is in Muhsina's this fall!</p>, Subject=Classroom update for Arienne Garret}...]/** * Sends and email for each object in an array of objects. * Properties Email, Subject and Body are used. * * @requires appendSubjBodyForArrObj() * @param {Object[]} arrObj */ function runMailMergeForArrObj(arrObj) { for (var i = 0; i < arrObj.length; i++) { var obj = arrObj[i]; MailApp.sendEmail({ to: obj.Email, subject: obj.Subject, htmlBody: obj.Body }); } } var sheet_rmmfao = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2"); var arrObj_rmmfao = arrObjFromSheet(sheet_rmmfao, 2); var subj_rmmfao = "Classroom update for %First% %Last%"; var body_rmmfao = "<p>%First% %Last% is in %Homeroom%'s this fall!</p>"; arrObj_rmmfao = appendSubjBodyForArrObj(arrObj_rmmfao, subj_rmmfao, body_rmmfao); runMailMergeForArrObj(arrObj_rmmfao);