// Adapted by Rebecca Stankus on 10/19/18 from AttendeeLookupAndCheckin.gs by Robin Wilson 08-28-2018 var bingoSpreadsheetID = "1RWSOO2yyv78ZSOvMhWOUkQkSJ0Q7_zX0GpB37QbtuRE"; var spreadsheet = SpreadsheetApp.openById(bingoSpreadsheetID); var sheetInProgress = spreadsheet.getSheetByName("InProgress"); var data = sheetInProgress.getDataRange().getValues(); var col_Usernames = sheetInProgress.getRange("Usernames").getColumn(); var col_cardNumbers = sheetInProgress.getRange("Cards").getColumn(); var col_cardColors = sheetInProgress.getRange("CardColors").getColumn(); var userCardNumbers = []; // ************************************* // START UTILITY FUNCTIONS // ************************************* /* DOES ARRAY CONTAIN A NUMBER: Search through an array for a specific number and return the result */ function contains(array, number) { for (var i = 0 ; i < array.length; i++) { if (array[i] === number) { return true; } } return false; } // ************************************* // END UTILITY FUNCTIONS // ************************************* function doGet(e) { var type = e.parameter.type; if (type === "searchOrAdd" || type === "searchOnly") { var username = e.parameter.username; if (username) { var usernameRow = getUsernameRow(username); if (usernameRow === -1 && type === "searchOrAdd") { return addUser(e); } else if (usernameRow === -1 && type === "searchOnly") { return ContentService.createTextOutput(JSON.stringify({ status: "success", newUser: true })).setMimeType(ContentService.MimeType.JSON); } else { var numbersCell = sheetInProgress.getRange(usernameRow + 1, col_cardNumbers); var colorCell = sheetInProgress.getRange(usernameRow + 1, col_cardColors); return ContentService.createTextOutput(JSON.stringify({ status: "success", newUser: false, userCardNumbers: JSON.parse(numbersCell.getValue()), userCardColor: JSON.parse(colorCell.getValue()), })).setMimeType(ContentService.MimeType.JSON); } } else { return ContentService.createTextOutput(JSON.stringify({ status: "error" })).setMimeType(ContentService.MimeType.JSON); } } else if (type === "newRound") { return newRound(e); } } // e.postData.contents will always be JSON. function doPost(e) { var data = JSON.parse(e.postData.contents); if (data.type === "recordPrizes") { if (!data.winners) { return ContentService.createTextOutput(JSON.stringify({ status: "error", text: "No winners array provided." })).setMimeType(ContentService.MimeType.JSON); } sheetInProgress.appendRow(["WINNER USERNAME", "PRIZE WON"]); var winnersArray = data.winners; for (var i = 0; i < winnersArray.length; i++) { sheetInProgress.appendRow([winnersArray[i].username, winnersArray[i].prizeWon]); } return ContentService.createTextOutput(JSON.stringify({ status: "success" })).setMimeType(ContentService.MimeType.JSON); } else { return ContentService.createTextOutput(JSON.stringify({ status: "error", text: "Invalid type provided." })).setMimeType(ContentService.MimeType.JSON); } } /* GET A RANDOM BINGO NUMBER: Selects a random number from the possible combinations for the current column. Each letter column has 15 possible numbers, so possibilities are B 1-15, I 16-30, N 31-45, G 46-60, and O 61-75. After a random number is selected, checks that the number has not already been used and, if not, returns the new number */ var COLUMN_RANGE = 15; var rowMinimum; function getRandomNumber() { var randomNumber = Math.floor(Math.random() * Number(COLUMN_RANGE) + Number(rowMinimum)); if (!contains(userCardNumbers, randomNumber)) { userCardNumbers.push(randomNumber); return randomNumber; } return getRandomNumber(); } /* GET A RANDOM BINGO CARD COLOR */ var CARD_YELLOW = { "blue": 66, "green": 255, "red": 227 }; var CARD_BLUE = { "blue": 247, "green": 196, "red": 0 }; var CARD_GREEN = { "blue": 0, "green": 255, "red": 30 }; var CARD_PINK = { "blue": 119, "green": 0, "red": 255 }; function getRandomColor() { var colorChange = Math.floor(Math.random() * 4); var newColor; switch (colorChange) { case 0: newColor = CARD_YELLOW; break; case 1: newColor = CARD_BLUE; break; case 2: newColor = CARD_GREEN; break; case 3: newColor = CARD_PINK; break; default: newColor = CARD_PINK; } return newColor; } var BINGO_STRING = "BINGO"; function addUser(userData) { if (search(userData.parameter.username, col_Usernames) === -1) { userCardNumbers = []; rowMinimum = 1; for (var i = 0; i < BINGO_STRING.length; i++) { var rows = 5; for (var currentRow = 0; currentRow < rows; currentRow++) { if (!(i === 2 && currentRow === 2)) { getRandomNumber(); } } rowMinimum += COLUMN_RANGE; } var userCardColor = getRandomColor(); sheetInProgress.appendRow([userData.parameter.username, JSON.stringify(userCardNumbers), JSON.stringify(userCardColor)]); return ContentService.createTextOutput(JSON.stringify({ status: "success", newUser: true, userCardNumbers: userCardNumbers, userCardColor: userCardColor })).setMimeType(ContentService.MimeType.JSON); } else { return ContentService.createTextOutput("Not a new user"); } } function getUsernameRow(username) { var searchUsername = username.toString().toLowerCase(); return search(searchUsername, col_Usernames); } function search(searchTerm, searchCol) { for(var row = 0; row < data.length; row++) { var rowData = data[row]; var cur = rowData[searchCol - 1]; if (cur) cur = cur.toLowerCase(); if (cur === searchTerm) return row; } return -1; } function newRound(newRoundData) { var calledLettersAndNumbers = newRoundData.parameter.calledLettersAndNumbers; if (calledLettersAndNumbers !== "[]") { sheetInProgress.appendRow(["Called Letters and Numbers", calledLettersAndNumbers]); var tabName = Utilities.formatDate(new Date(), 'America/Los_Angeles', 'MMMM dd, yyyy HH:mm:ss'); var copy = sheetInProgress.copyTo(spreadsheet); copy.setName(tabName); sheetInProgress.clear(); return ContentService.createTextOutput(JSON.stringify({ status: "success" })).setMimeType(ContentService.MimeType.JSON); } else { sheetInProgress.clear(); } }