Ah well alright. Good thing, I'd have no idea how all the submitted data gets turned into the spreadsheet at the end. XD Cloud_765
Like this: (replace (lt) and (gt) with less than and greater than signs... stupid HTML rules)
var submissionSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var configSheet = submissionSpreadsheet.getSheetByName("Configuration");
var submissionSheet = submissionSpreadsheet.getSheetByName("Ranking Submissions");
var processedRow = 2;
var processedCol = 2;
var rankingSpreadsheet = SpreadsheetApp.openById("0Ajmx6NrUBIJrdGlZVjRrMDdUTHBFeGd0ZE1tTHMzZ1E");
function updateRankings() {
 var lastSubmission = submissionSheet.getLastRow();
 var lastProcessed = configSheet.getRange(processedRow, processedCol).getValue();
 var newSubmissions = lastSubmission - lastProcessed;
Â
 if (newSubmissions == 0) {
   return;
 }
Â
 for (var i = 1; i (lt)= newSubmissions; i++) {
   updateRanking(lastProcessed + i);
 }
Â
 configSheet.getRange(processedRow, processedCol).setValue(lastSubmission);
}
function updateRanking(rowNum) {
 if (rowNum === undefined) {
   rowNum = SpreadsheetApp.getActiveRange().getRow();
 }
Â
 var ranking = getRanking_(rowNum);
 try {
   var gameSheet = rankingSpreadsheet.getSheetByName(ranking.game);
   var stageColumn = findStage_(gameSheet, ranking.stage + (ranking.act ? " " + ranking.act : ""));
   var validation = gameSheet.getRange(3, 1).getValue();
  Â
   if (validation) {
     ranking.valid = new RegExp(validation).test(ranking.value);
   }
  Â
   var sortAsc = gameSheet.getRange(7,1).getValue() == "Ascending";
   var existingCount = eval(gameSheet.getRange(1, stageColumn + 1).getValue());
   var existingUsers = eval(gameSheet.getRange(1, stageColumn + 2).getValue());
   var existingRow = existingUsers.indexOf(ranking.username) + 4;
   var newRow = existingCount + 4;
  Â
   if (existingRow (gt) 3) {
     if (!shouldReplace_(stageColumn, existingRow, gameSheet, ranking, sortAsc)) {
       submissionSheet.getRange(rowNum, 7).setValue("IGNORED");
       return;
     }
    Â
     newRow = existingRow;
   }
   else {
     existingCount++;
   }
  Â
   var newVals = [ranking.valid ? "" : "???", ranking.username, ranking.value];
   gameSheet.getRange(newRow, stageColumn, 1, 3).setValues([newVals]).setFontColor(ranking.valid ? 'black' : 'red');
   gameSheet.getRange(newRow, stageColumn + 2).setComment(ranking.proof);
   gameSheet.getRange(4, stageColumn, existingCount, 3).sort({column: stageColumn + 2, ascending: sortAsc});
  Â
   var rank = 1;
   var rankArray = [];
   for (var i = 0; i (lt) existingCount; i++) {
     var range = gameSheet.getRange(i + 4, stageColumn);
     if (range.getValue() != "???") {
       range.setValue(rank++);
     }
     rankArray.push(range.offset(0, 1).getValue());
   }
  Â
   gameSheet.getRange(1, stageColumn + 1).setValue(existingCount);
  Â
   var rankArrayString = "[";
   for (var i = 0; i (lt) rankArray.length; i++) {
     if (i != 0) {
       rankArrayString += ",";
     }
     rankArrayString += "\"" + rankArray + "\"";
   }
   rankArrayString += "]";
  Â
   gameSheet.getRange(1, stageColumn + 2).setValue(rankArrayString);
 } catch (e) {
   submissionSheet.getRange(rowNum, 7).setValue("REJECTED");
   submissionSheet.getRange(rowNum, 8).setValue(e);
   return;
 }
Â
 submissionSheet.getRange(rowNum, 7).setValue(ranking.valid ? "COMMITTED" : "VALIDATION");
}
function getRanking_(rowNum) {
 var data = submissionSheet.getRange(rowNum, 1, 1, 6).getValues()[0];
 return {
   username: data[0],
   game: data[1],
   stage: data[2],
   act: data[3],
   value: data[4],
   proof: data[5],
   valid: true
 }
}
var stageCache = {};
function findStage_(gameSheet, stageName) {
 if (stageCache[stageName]) {
   return stageCache[stageName];
 }
Â
 var lastColumn = gameSheet.getLastColumn();
 for (var i = 2; i (lt) lastColumn; i += 3) {
   if (gameSheet.getRange(2, i).getValue() === stageName) {
     stageCache[stageName] = i;
     return i;
   }
 }
Â
 throw "Cannot find act " + stageName;
}
function shouldReplace_(stageColumn, existingRowNum, gameSheet, ranking, sortAsc) {
 if (gameSheet.getRange(existingRowNum, stageColumn).getValue() === "???" && ranking.valid) {
   return true;
 }
Â
 if (!(gameSheet.getRange(existingRowNum, stageColumn + 2).getComment()) && ranking.proof) {
   return true;
 }
Â
 var oldValue = gameSheet.getRange(existingRowNum, stageColumn + 2).getValue();
 return ranking.value == oldValue || ((ranking.value (lt) oldValue) == sortAsc);
}
Log in to comment