function doGet(e) {
var candidateName = e.parameter.candidate;
if (!candidateName) return ContentService.createTextOutput("Error: No name.");
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var lock = LockService.getScriptLock();
if (lock.tryLock(10000)) {
try {
var lastRow = sheet.getLastRow();
// Initialize totals strictly as 0
var t1 = 0; // CSE
var t2 = 0; // EEE
var t3 = 0; // CE
// Only check previous row if data exists (Row > 1)
if (lastRow > 1) {
// Get last values from Columns C, D, E
var lastValues = sheet.getRange(lastRow, 3, 1, 3).getValues()[0];
// Force them to be numbers. If empty/error, make it 0.
t1 = Number(lastValues[0]) || 0;
t2 = Number(lastValues[1]) || 0;
t3 = Number(lastValues[2]) || 0;
}
// Add vote to the correct bucket
if (candidateName == "CSE") t1++;
else if (candidateName == "EEE") t2++;
else if (candidateName == "CE") t3++;
// Save: [Time, Name, Total CSE, Total EEE, Total CE]
var newRow = [new Date(), candidateName, t1, t2, t3];
sheet.appendRow(newRow);
return ContentService.createTextOutput("Success: " + candidateName + " | Totals: " + t1 + "," + t2 + "," + t3);
} catch (error) {
return ContentService.createTextOutput("Error: " + error.message);
} finally {
lock.releaseLock();
}
}
}
ZnVuY3Rpb24gZG9HZXQoZSkgewogIHZhciBjYW5kaWRhdGVOYW1lID0gZS5wYXJhbWV0ZXIuY2FuZGlkYXRlOwogIGlmICghY2FuZGlkYXRlTmFtZSkgcmV0dXJuIENvbnRlbnRTZXJ2aWNlLmNyZWF0ZVRleHRPdXRwdXQoIkVycm9yOiBObyBuYW1lLiIpOwoKICB2YXIgc3MgPSBTcHJlYWRzaGVldEFwcC5nZXRBY3RpdmVTcHJlYWRzaGVldCgpOwogIHZhciBzaGVldCA9IHNzLmdldFNoZWV0cygpWzBdOyAKICB2YXIgbG9jayA9IExvY2tTZXJ2aWNlLmdldFNjcmlwdExvY2soKTsKICAKICBpZiAobG9jay50cnlMb2NrKDEwMDAwKSkgeyAKICAgIHRyeSB7CiAgICAgIHZhciBsYXN0Um93ID0gc2hlZXQuZ2V0TGFzdFJvdygpOwogICAgICAKICAgICAgLy8gSW5pdGlhbGl6ZSB0b3RhbHMgc3RyaWN0bHkgYXMgMAogICAgICB2YXIgdDEgPSAwOyAvLyBDU0UKICAgICAgdmFyIHQyID0gMDsgLy8gRUVFCiAgICAgIHZhciB0MyA9IDA7IC8vIENFCgogICAgICAvLyBPbmx5IGNoZWNrIHByZXZpb3VzIHJvdyBpZiBkYXRhIGV4aXN0cyAoUm93ID4gMSkKICAgICAgaWYgKGxhc3RSb3cgPiAxKSB7CiAgICAgICAgLy8gR2V0IGxhc3QgdmFsdWVzIGZyb20gQ29sdW1ucyBDLCBELCBFCiAgICAgICAgdmFyIGxhc3RWYWx1ZXMgPSBzaGVldC5nZXRSYW5nZShsYXN0Um93LCAzLCAxLCAzKS5nZXRWYWx1ZXMoKVswXTsKICAgICAgICAKICAgICAgICAvLyBGb3JjZSB0aGVtIHRvIGJlIG51bWJlcnMuIElmIGVtcHR5L2Vycm9yLCBtYWtlIGl0IDAuCiAgICAgICAgdDEgPSBOdW1iZXIobGFzdFZhbHVlc1swXSkgfHwgMDsKICAgICAgICB0MiA9IE51bWJlcihsYXN0VmFsdWVzWzFdKSB8fCAwOwogICAgICAgIHQzID0gTnVtYmVyKGxhc3RWYWx1ZXNbMl0pIHx8IDA7CiAgICAgIH0KCiAgICAgIC8vIEFkZCB2b3RlIHRvIHRoZSBjb3JyZWN0IGJ1Y2tldAogICAgICBpZiAoY2FuZGlkYXRlTmFtZSA9PSAiQ1NFIikgdDErKzsKICAgICAgZWxzZSBpZiAoY2FuZGlkYXRlTmFtZSA9PSAiRUVFIikgdDIrKzsKICAgICAgZWxzZSBpZiAoY2FuZGlkYXRlTmFtZSA9PSAiQ0UiKSAgdDMrKzsKCiAgICAgIC8vIFNhdmU6IFtUaW1lLCBOYW1lLCBUb3RhbCBDU0UsIFRvdGFsIEVFRSwgVG90YWwgQ0VdCiAgICAgIHZhciBuZXdSb3cgPSBbbmV3IERhdGUoKSwgY2FuZGlkYXRlTmFtZSwgdDEsIHQyLCB0M107CiAgICAgIHNoZWV0LmFwcGVuZFJvdyhuZXdSb3cpOwogICAgICAKICAgICAgcmV0dXJuIENvbnRlbnRTZXJ2aWNlLmNyZWF0ZVRleHRPdXRwdXQoIlN1Y2Nlc3M6ICIgKyBjYW5kaWRhdGVOYW1lICsgIiB8IFRvdGFsczogIiArIHQxICsgIiwiICsgdDIgKyAiLCIgKyB0Myk7CgogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgcmV0dXJuIENvbnRlbnRTZXJ2aWNlLmNyZWF0ZVRleHRPdXRwdXQoIkVycm9yOiAiICsgZXJyb3IubWVzc2FnZSk7CiAgICB9IGZpbmFsbHkgewogICAgICBsb2NrLnJlbGVhc2VMb2NrKCk7CiAgICB9CiAgfQp9