196 lines
6.6 KiB
JavaScript
196 lines
6.6 KiB
JavaScript
// 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();
|
|
}
|
|
}
|
|
|