joenobody211

sample app

Nov 21st, 2015
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2.  * See the documentation at https://developers.google.com/apps-script/storing_data_spreadsheets
  3.  */
  4.  
  5.  
  6. /*
  7.  * Our main handler
  8.  * The onEdit trigger is one of three built-in triggers
  9.  * This function, if defined, is called automatically
  10.  * @see https://developers.google.com/apps-script/understanding_triggers
  11.  */
  12. function onEdit(event) {
  13.   var ss = event.source.getActiveSheet();
  14.   var r = event.source.getActiveRange();
  15.   r.setComment("Last modified: " + (new Date()));
  16.   copyPhoneList();
  17.   zebraStripe("Read Only");
  18. //   createOfficeSheets(); // don't do this every edit
  19. }
  20.  
  21. // The onOpen function is executed automatically every time a Spreadsheet is opened
  22. function onOpen(e) {
  23.  
  24.   var ss = SpreadsheetApp.getActiveSpreadsheet();
  25.   var menuEntries = [];
  26.   menuEntries.push({name: "Generate Office Sheets", functionName: "createOfficeSheets"});
  27.   ss.addMenu("Internal Tools", menuEntries);
  28.   protectSheet('Read Only');
  29.   createOfficeSheets();  
  30. }  
  31.  
  32.  
  33. /*
  34.  * A function to add protection to a sheet so that it's not
  35.  * inadvertently modified
  36.  */
  37. function protectSheet(sheetName) {
  38.   if (typeof(sheetName) == "undefined") {
  39.     var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
  40.   } else {
  41.     var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
  42.   }
  43.  
  44.   var permissions = sheet.getSheetProtection();
  45.   var isProtected = permissions.isProtected();
  46.   if (isProtected) {
  47.     // Browser.msgBox('The sheet ' + sheetName + ' has been protected');
  48.   } else {
  49.     // Browser.msgBox('The perission check shows ' + permissions );
  50.     permissions.addUser('greg.rundlett@gmail.com');
  51.     permissions.addUser('editors@example.com');
  52.     permissions.addUser('joe.boss@example.com');
  53.     permissions.addUser('mary.manager@example.com');
  54.     permissions.setProtected(true);
  55.     sheet.setSheetProtection(permissions);
  56.   }
  57. }
  58.  
  59. /**
  60.  * Our main function - responsible for copying data from our master data set to another copy that
  61.  * is read-only (due to the sheet protection added to it).
  62.  */
  63. function copyPhoneList() {
  64.   var hasFirstName = false;
  65.   var ss = SpreadsheetApp.getActiveSpreadsheet();
  66.  
  67.   // var sheet = ss.getSheetByName("Master");
  68.   // var data = sheet.getDataRange().getValues(); // the whole sheet
  69.  
  70.   var data = ss.getRangeByName("masterPhoneListData").getValues();  // the named range
  71.   var range = ss.getRangeByName("masterPhoneListData");
  72.   var numColumns = range.getEndColumn() - range.getColumn() + 1;
  73.   //var numColumns = data[10].length; // how many columns are in each row
  74.   var phoneList = new Array();
  75.    
  76.  
  77.   // then we'll iterate through our source data and push recordDatas over to the target for each non-empty row
  78.   for (i=0; i<data.length; i++) {       // we've already used a named data range to skip it's header
  79.     hasFirstName = !isCellEmpty(data[i][4]);    
  80.     if (hasFirstName) {                 // if there is something in firstname, then get the record
  81.       var record = new Array();
  82.       for (j=0; j<numColumns; j++) {
  83.         // we want to explicitly grab only columns a,b,c,d,e,g or 0,1,2,3,4,6
  84.         switch(j) {
  85.           case 0: // DID (Direct Inward Dial)
  86.           case 1: // Ext
  87.           case 2: // Office
  88.           case 3: // First Name
  89.           case 4: // Last Name
  90.           case 6: // Cell Phone
  91.             record.push(data[i][j]);
  92.             break;
  93.            
  94.           default:
  95.             break;
  96.          
  97.         }
  98.       }
  99.  
  100.       // now add each record to the data we're compiling
  101.       phoneList.push(record);
  102.     }
  103.   }
  104.  
  105.   // now push it all over to the target sheet
  106.   var target = ss.getSheetByName("Read Only");
  107.   target.clearContents(); // empty out our target sheet, preserving the formatting
  108.  
  109.   // first we'll create a heading row
  110.   var heading = ['Direct', 'Ext', 'Office', 'First Name', 'Last Name', 'Cell Phone'];
  111.   //target.appendRow(heading); // put the first heading row into our target sheet
  112.  
  113.   var headersRange = target.getRange(1, 1, 1, heading.length);
  114.   headersRange.setValues([heading]);
  115.  
  116.  
  117.   // we'd like to have sorted data, by First Name, and if those are equal, then by Last Name
  118.   // JavaScript arrays can be sorted by using a callback function supplied as the argument to the sort() method call
  119.   // http://www.sitepoint.com/sophisticated-sorting-in-javascript/
  120.   phoneList.sort(function(a, b) {
  121.     if(a[3].toLowerCase() === b[3].toLowerCase()) {
  122.       var x = a[4].toLowerCase(), y = b[4].toLowerCase();
  123.       return x < y ? -1 : x > y ? 1 : 0;
  124.     } else {
  125.       var x = a[3].toLowerCase(), y = b[3].toLowerCase();
  126.       return x < y ? -1 : x > y ? 1 : 0;
  127.     }
  128.   });
  129.  
  130.   // All done, put the data into place
  131.   target.getRange(2, 1, phoneList.length, phoneList[0].length).setValues(phoneList);
  132. }
  133.  
  134.  
  135.  
  136. /**
  137.  * Functionality based on the Google example code to populate a bunch of sheets based on
  138.  * the "office" value in our master data set (The example breaks down a list of employees by department)
  139.  */
  140.  
  141.  
  142. // This is where the data used will be retrieved from:
  143. var DATA_SPREADSHEET_ID = "0AqwQ0jPilu4IdGNqMzNXSy15ZWQ3c0ZFMkZja2RuS2c";
  144.  
  145. function createOfficeSheets() {
  146.   var ss = SpreadsheetApp.getActiveSpreadsheet();
  147.   var sheet = ss.getSheets()[0];
  148.  
  149.   var dataSs = SpreadsheetApp.openById(DATA_SPREADSHEET_ID);
  150.   // var dataSheet = dataSs.getSheets()[0];
  151.   var dataSheet = ss.getSheetByName("Read Only");
  152.  
  153.   // Fetch all the data
  154.   var data = getRowsData(dataSheet);
  155.  
  156.   // This is the data we want to display
  157.   var columnNames = ['Direct', 'Ext', 'Office', 'First Name', 'Last Name', 'Cell Phone'];
  158.  
  159.   // Index data by office name
  160.   var dataByOffice = {};
  161.   var offices = [];
  162.   for (var i = 0; i < data.length; ++i) {
  163.     var rowData = data[i];
  164.     if (!dataByOffice[rowData.office]) {
  165.       dataByOffice[rowData.office] = [];
  166.       offices.push(rowData.office);
  167.     }
  168.     dataByOffice[rowData.office].push(rowData);
  169.   }
  170.  
  171.   offices.sort();
  172.   var headerBackgroundColor = dataSheet.getRange(1, 1).getBackgroundColor();
  173.   for (var i = 0; i < offices.length; ++i) {
  174.     var sheet = ss.getSheetByName(offices[i]) ||
  175.       ss.insertSheet(offices[i], ss.getSheets().length);
  176.     sheet.clear();
  177.     var headersRange = sheet.getRange(1, 1, 1, columnNames.length);
  178.     headersRange.setValues([columnNames]);
  179.     headersRange.setBackgroundColor(headerBackgroundColor);
  180.     setRowsData(sheet, dataByOffice[offices[i]]);
  181.   }
  182. }
  183.  
  184. /*************************************************************************************  
  185.  * Code reused from Reading Spreadsheet Data using JavaScript Objects               **
  186.  * https://developers.google.com/apps-script/storing_data_spreadsheets#reading-code **
  187.  *************************************************************************************/
  188.  
  189.  
  190. // setRowsData fills in one row of data per object defined in the objects Array.
  191. // For every Column, it checks if data objects define a value for it.
  192. // Arguments:
  193. //   - sheet: the Sheet Object where the data will be written
  194. //   - objects: an Array of Objects, each of which contains data for a row
  195. //   - optHeadersRange: a Range of cells where the column headers are defined. This
  196. //     defaults to the entire first row in sheet.
  197. //   - optFirstDataRowIndex: index of the first row where data should be written. This
  198. //     defaults to the row immediately below the headers.
  199. function setRowsData(sheet, objects, optHeadersRange, optFirstDataRowIndex) {
  200.   var headersRange = optHeadersRange || sheet.getRange(1, 1, 1, sheet.getMaxColumns());
  201.   var firstDataRowIndex = optFirstDataRowIndex || headersRange.getRowIndex() + 1;
  202.   var headers = normalizeHeaders(headersRange.getValues()[0]);
  203.  
  204.   var data = [];
  205.   for (var i = 0; i < objects.length; ++i) {
  206.     var values = []
  207.     for (j = 0; j < headers.length; ++j) {
  208.       var header = headers[j];
  209.       values.push(header.length > 0 && objects[i][header] ? objects[i][header] : "");
  210.     }
  211.     data.push(values);
  212.   }
  213.  
  214.   var destinationRange = sheet.getRange(firstDataRowIndex, headersRange.getColumnIndex(),
  215.                                         objects.length, headers.length);
  216.   destinationRange.setValues(data);
  217. }
  218.  
  219.  
  220.  
  221. // getRowsData iterates row by row in the input range and returns an array of objects.
  222. // Each object contains all the data for a given row, indexed by its normalized column name.
  223. // Arguments:
  224. //   - sheet: the sheet object that contains the data to be processed
  225. //   - range: the exact range of cells where the data is stored
  226. //       This argument is optional and it defaults to all the cells except those in the first row
  227. //       or all the cells below columnHeadersRowIndex (if defined).
  228. //   - columnHeadersRowIndex: specifies the row number where the column names are stored.
  229. //       This argument is optional and it defaults to the row immediately above range;
  230. // Returns an Array of objects.
  231. function getRowsData(sheet, range, columnHeadersRowIndex) {
  232.   var headersIndex = columnHeadersRowIndex || range ? range.getRowIndex() - 1 : 1;
  233.   var dataRange = range ||
  234.     sheet.getRange(headersIndex + 1, 1, sheet.getMaxRows() - headersIndex, sheet.getMaxColumns());
  235.   var numColumns = dataRange.getEndColumn() - dataRange.getColumn() + 1;
  236.   var headersRange = sheet.getRange(headersIndex, dataRange.getColumn(), 1, numColumns);
  237.   var headers = headersRange.getValues()[0];
  238.   return getObjects(dataRange.getValues(), normalizeHeaders(headers));
  239. }
  240.  
  241. // For every row of data in data, generates an object that contains the data. Names of
  242. // object fields are defined in keys.
  243. // Arguments:
  244. //   - data: JavaScript 2d array
  245. //   - keys: Array of Strings that define the property names for the objects to create
  246. function getObjects(data, keys) {
  247.   var objects = [];
  248.   for (var i = 0; i < data.length; ++i) {
  249.     var object = {};
  250.     var hasData = false;
  251.     for (var j = 0; j < data[i].length; ++j) {
  252.       var cellData = data[i][j];
  253.       if (isCellEmpty(cellData)) {
  254.         continue;
  255.       }
  256.       object[keys[j]] = cellData;
  257.       hasData = true;
  258.     }
  259.     if (hasData) {
  260.       objects.push(object);
  261.     }
  262.   }
  263.   return objects;
  264. }
  265.  
  266. // Returns an Array of normalized Strings.
  267. // Empty Strings are returned for all Strings that could not be successfully normalized.
  268. // Arguments:
  269. //   - headers: Array of Strings to normalize
  270. function normalizeHeaders(headers) {
  271.   var keys = [];
  272.   for (var i = 0; i < headers.length; ++i) {
  273.     keys.push(normalizeHeader(headers[i]));
  274.   }
  275.   return keys;
  276. }
  277.  
  278. // Normalizes a string, by removing all alphanumeric characters and using mixed case
  279. // to separate words. The output will always start with a lower case letter.
  280. // This function is designed to produce JavaScript object property names.
  281. // Arguments:
  282. //   - header: string to normalize
  283. // Examples:
  284. //   "First Name" -> "firstName"
  285. //   "Market Cap (millions) -> "marketCapMillions
  286. //   "1 number at the beginning is ignored" -> "numberAtTheBeginningIsIgnored"
  287. function normalizeHeader(header) {
  288.   var key = "";
  289.   var upperCase = false;
  290.   for (var i = 0; i < header.length; ++i) {
  291.     var letter = header[i];
  292.     if (letter == " " && key.length > 0) {
  293.       upperCase = true;
  294.       continue;
  295.     }
  296.     if (!isAlnum(letter)) {
  297.       continue;
  298.     }
  299.     if (key.length == 0 && isDigit(letter)) {
  300.       continue; // first character must be a letter
  301.     }
  302.     if (upperCase) {
  303.       upperCase = false;
  304.       key += letter.toUpperCase();
  305.     } else {
  306.       key += letter.toLowerCase();
  307.     }
  308.   }
  309.   return key;
  310. }
  311.  
  312. // Returns true if the cell where cellData was read from is empty.
  313. // Arguments:
  314. //   - cellData: string
  315. function isCellEmpty(cellData) {
  316.   return typeof(cellData) == "string" && cellData == "";
  317. }
  318.  
  319. // Returns true if the character char is alphabetical, false otherwise.
  320. function isAlnum(char) {
  321.   return char >= 'A' && char <= 'Z' ||
  322.     char >= 'a' && char <= 'z' ||
  323.     isDigit(char);
  324. }
  325.  
  326. // Returns true if the character char is a digit, false otherwise.
  327. function isDigit(char) {
  328.   return char >= '0' && char <= '9';
  329. }
  330.  
  331. // The code below will get the number of rows in sheet 0
  332. function getRowsCount() {
  333.   var ss = SpreadsheetApp.getActiveSpreadsheet();
  334.   var sheet = ss.getSheets()[0];
  335.   Browser.msgBox(sheet.getMaxRows());
  336. }
  337.  
  338.  
  339. // A function to alternately stripe a spreadsheet
  340. // for better legibility
  341. function zebraStripe(sheetName) {
  342.   var i, thisRow;
  343.  
  344.   if (typeof(sheetName) == "undefined") {
  345.     var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
  346.   } else {
  347.     var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
  348.   }
  349.  
  350.   var lastRow = sheet.getLastRow();
  351.   var lastCol = sheet.getLastColumn();
  352.   var aOdd = "#e0f1f5";
  353.   var aEven = "white";
  354.  
  355.   for (i = 1; i <= lastRow; i++) {
  356.     thisRow = sheet.getRange(i, 1, 1, lastCol);
  357.     thisRow.setBackgroundColor((i % 2 == 0)?aEven:aOdd);
  358.   }
  359. }
  360.  
  361. /**
  362.  * A utility function to get the column index by Heading
  363.  */
  364. function getColIndexByName(colName) {
  365.   var sheet = SpreadsheetApp.getActiveSheet();
  366.   var numColumns = sheet.getLastColumn();
  367.   var row = sheet.getRange(1, 1, 1, numColumns).getValues();
  368.   for (i in row[0]) {
  369.     var name = row[0][i];
  370.     if (name == colName) {
  371.       return parseInt(i) + 1;
  372.     }
  373.   }
  374.   return -1;
  375. }
  376.  
  377. function pushToSite() {
  378.   var phoneList = new Array();
  379.   // var ss = SpreadsheetApp.getActiveSheet().getSheetByName('Read Only');
  380.   var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Read Only');
  381.  
  382.   var site = SitesApp.getSiteByUrl("https://sites.google.com/site/examplegsr/");
  383.   // Or, if you are a Google Apps user:
  384.   // var site = SitesApp.getSite("YOUR_DOMAIN", "SITE_NAME")
  385.   var page = site.getChildByName("phone-list");
  386.  
  387.   var data = SpreadsheetApp.getActiveSpreadsheet().getRangeByName("masterPhoneListData").getValues();
  388.   var range = SpreadsheetApp.getActiveSpreadsheet().getRangeByName("masterPhoneListData");
  389.   var numColumns = range.getEndColumn() - range.getColumn() + 1;
  390.  
  391.   // then we'll iterate through our source data and push recordDatas over to the target for each non-empty row
  392.   for (i=0; i<data.length; i++) {       // we've already used a named data range to skip it's header
  393.     hasFirstName = !isCellEmpty(data[i][3]);    
  394.     if (hasFirstName) {                 // if there is something in firstname, then get the record
  395.       var record = new Array();
  396.       record.push(data[i][3]); // First Name
  397.       record.push(data[i][4]); // Last Name
  398.       record.push(data[i][6]); // Cell Phone
  399.       record.push(data[i][0]); // Direct
  400.       record.push(data[i][2]); // Office
  401.       // now add each record to the data we're compiling
  402.       // phoneList.push(record);
  403.       page.addListItem(record);
  404.  
  405.     }    
  406.   }
  407. }
Add Comment
Please, Sign In to add comment