Last active
April 27, 2020 14:50
-
-
Save glennhefley/7d97fe28937f531ac253b25960708077 to your computer and use it in GitHub Desktop.
Set of Util functions in Javascript
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
console.log(html5player.url_low); | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(Github Gists can't be empty so Snippets saved this content) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* A special function that runs when the spreadsheet is open, used to add a | |
* custom menu to the spreadsheet. | |
*/ | |
function onOpen() { | |
var spreadsheet = SpreadsheetApp.getActive(); | |
var menuItems = [ | |
{name: 'Generate step-by-step...', functionName: 'generateStepByStep_'} | |
]; | |
spreadsheet.addMenu('Directions', menuItems); | |
} | |
/* Script is for */ | |
/** | |
* A custom function that converts meters to miles. | |
* | |
* @param {Number} meters The distance in meters. | |
* @return {Number} The distance in miles. | |
*/ | |
function metersToMiles(meters) { | |
if (typeof meters != 'number') { | |
return null; | |
} | |
return meters / 1000 * 0.621371; | |
} | |
/** | |
* A custom function that gets the driving distance between two addresses. | |
* | |
* @param {String} origin The starting address. | |
* @param {String} destination The ending address. | |
* @return {Number} The distance in meters. | |
*/ | |
function drivingDistance(origin, destination) { | |
var directions = getDirections_(origin, destination); | |
return directions.routes[0].legs[0].distance.value; | |
} | |
/** | |
* A special function that runs when the spreadsheet is open, used to add a | |
* custom menu to the spreadsheet. | |
*/ | |
function onOpen() { | |
var spreadsheet = SpreadsheetApp.getActive(); | |
var menuItems = [ | |
{name: 'Generate step-by-step...', functionName: 'generateStepByStep_'} | |
]; | |
spreadsheet.addMenu('Directions', menuItems); | |
} | |
/** | |
* Creates a new sheet containing step-by-step directions between the two | |
* addresses on the "Settings" sheet that the user selected. | |
*/ | |
function generateStepByStep_() { | |
var spreadsheet = SpreadsheetApp.getActive(); | |
var settingsSheet = spreadsheet.getSheetByName('Settings'); | |
settingsSheet.activate(); | |
// Prompt the user for a row number. | |
var selectedRow = Browser.inputBox('Generate step-by-step', | |
'Please enter the row number of the addresses to use' + | |
' (for example, "2"):', | |
Browser.Buttons.OK_CANCEL); | |
if (selectedRow == 'cancel') { | |
return; | |
} | |
var rowNumber = Number(selectedRow); | |
if (isNaN(rowNumber) || rowNumber < 2 || | |
rowNumber > settingsSheet.getLastRow()) { | |
Browser.msgBox('Error', | |
Utilities.formatString('Row "%s" is not valid.', selectedRow), | |
Browser.Buttons.OK); | |
return; | |
} | |
// Retrieve the addresses in that row. | |
var row = settingsSheet.getRange(rowNumber, 1, 1, 2); | |
var rowValues = row.getValues(); | |
var origin = rowValues[0][0]; | |
var destination = rowValues[0][1]; | |
if (!origin || !destination) { | |
Browser.msgBox('Error', 'Row does not contain two addresses.', | |
Browser.Buttons.OK); | |
return; | |
} | |
// Get the raw directions information. | |
var directions = getDirections_(origin, destination); | |
// Create a new sheet and append the steps in the directions. | |
var sheetName = 'Driving Directions for Row ' + rowNumber; | |
var directionsSheet = spreadsheet.getSheetByName(sheetName); | |
if (directionsSheet) { | |
directionsSheet.clear(); | |
directionsSheet.activate(); | |
} else { | |
directionsSheet = | |
spreadsheet.insertSheet(sheetName, spreadsheet.getNumSheets()); | |
} | |
var sheetTitle = Utilities.formatString('Driving Directions from %s to %s', | |
origin, destination); | |
var headers = [ | |
[sheetTitle, '', ''], | |
['Step', 'Distance (Meters)', 'Distance (Miles)'] | |
]; | |
var newRows = []; | |
for (var i = 0; i < directions.routes[0].legs[0].steps.length; i++) { | |
var step = directions.routes[0].legs[0].steps[i]; | |
// Remove HTML tags from the instructions. | |
var instructions = step.html_instructions.replace(/<br>|<div.*?>/g, '\n') | |
.replace(/<.*?>/g, ''); | |
newRows.push([ | |
instructions, | |
step.distance.value | |
]); | |
} | |
directionsSheet.getRange(1, 1, headers.length, 3).setValues(headers); | |
directionsSheet.getRange(headers.length + 1, 1, newRows.length, 2) | |
.setValues(newRows); | |
directionsSheet.getRange(headers.length + 1, 3, newRows.length, 1) | |
.setFormulaR1C1('=METERSTOMILES(R[0]C[-1])'); | |
// Format the new sheet. | |
directionsSheet.getRange('A1:C1').merge().setBackground('#ddddee'); | |
directionsSheet.getRange('A1:2').setFontWeight('bold'); | |
directionsSheet.setColumnWidth(1, 500); | |
directionsSheet.getRange('B2:C').setVerticalAlignment('top'); | |
directionsSheet.getRange('C2:C').setNumberFormat('0.00'); | |
var stepsRange = directionsSheet.getDataRange() | |
.offset(2, 0, directionsSheet.getLastRow() - 2); | |
setAlternatingRowBackgroundColors_(stepsRange, '#ffffff', '#eeeeee'); | |
directionsSheet.setFrozenRows(2); | |
SpreadsheetApp.flush(); | |
} | |
/** | |
* Sets the background colors for alternating rows within the range. | |
* @param {Range} range The range to change the background colors of. | |
* @param {string} oddColor The color to apply to odd rows (relative to the start of the range). | |
* @param {string} evenColor The color to apply to even rows (relative to thestart of the range). | |
*/ | |
function setAlternatingRowBackgroundColors_(range, oddColor, evenColor) { | |
var backgrounds = []; | |
for (var row = 1; row <= range.getNumRows(); row++) { | |
var rowBackgrounds = []; | |
for (var column = 1; column <= range.getNumColumns(); column++) { | |
if (row % 2 == 0) { | |
rowBackgrounds.push(evenColor); | |
} else { | |
rowBackgrounds.push(oddColor); | |
} | |
} | |
backgrounds.push(rowBackgrounds); | |
} | |
range.setBackgrounds(backgrounds); | |
} | |
/** | |
* A shared helper function used to obtain the full set of directions | |
* information between two addresses. Uses the Apps Script Maps Service. | |
* | |
* @param {String} origin The starting address. | |
* @param {String} destination The ending address. | |
* @return {Object} The directions response object. | |
*/ | |
function getDirections_(origin, destination) { | |
var directionFinder = Maps.newDirectionFinder(); | |
directionFinder.setOrigin(origin); | |
directionFinder.setDestination(destination); | |
var directions = directionFinder.getDirections(); | |
if (directions.routes.length == 0) { | |
throw 'Unable to calculate directions between these addresses.'; | |
} | |
return directions; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment