Last active
December 29, 2015 08:53
-
-
Save KoMinkyu/a8baadc326bc2c3100e6 to your computer and use it in GitHub Desktop.
이화앱센터 새 이름 공모전 Google sheet apps script
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
var PASSPHRASE = ""; | |
function onRegisterNewNameIdeaClicked() { | |
var sheet = SpreadsheetApp.getActiveSheet(); | |
var newName = getNewNameIdeaFromInputBox(); | |
if (newName == null || newName == "") { | |
alertInputCorrectNameIdea(); | |
return; | |
} | |
if (newName == "cancel") { | |
return; | |
} | |
if (isNameIdeaAlreadyRegisteredInSheet(newName, sheet)) { | |
alertNameAlreadyExists(); | |
return; | |
} | |
if (isNameIdeaExistsInDB(newName)) { | |
alertNameAlreadyExists(); | |
return; | |
} | |
registerNewNameIdea(sheet, newName); | |
} | |
function onLikeButtonClicked() { | |
var nameIdea = getNameIdeaToLikeFromInputBox(); | |
if (nameIdea == null || nameIdea == "") { | |
alertInputCorrectNameIdea(); | |
return; | |
} | |
if (nameIdea == "cancel") { | |
return; | |
} | |
if (isLikedAlready(nameIdea)) { | |
alertAlreadyLiked(); | |
return; | |
} | |
var isLikeSuccess = parse_likeNameIdea(nameIdea); | |
if (isLikeSuccess) { | |
alertLikeSuccess(nameIdea); | |
increaseLikeCountInDB(nameIdea); | |
} else { | |
alertLikeFailed(); | |
} | |
} | |
function onShowRankButttonClicked() { | |
var nameIdeas = parse_getNameIdeaOrderByLikeCount(5); | |
var message = ""; | |
for (var i = 0; i < nameIdeas.length; i++) { | |
var idea = nameIdeas[i]; | |
var nameIdea = idea['nameIdea'] | |
var likeCount = idea['likeCount'] | |
message += "" + (i + 1) + "등:" + nameIdea + "(좋아요 수:" + likeCount + ")\\n"; | |
} | |
Browser.msgBox(message); | |
} | |
function isNameIdeaAlreadyRegisteredInSheet(name, sheet) { | |
if (sheet == null || sheet.isSheetHidden()) return true; | |
var rowCount = sheet.getLastRow(); | |
var registeredNames = sheet.getRange('B11:B' + rowCount).getValues(); | |
for (var i = 0; i < registeredNames.length; i++) { | |
if (name == registeredNames[i][0]) return true; | |
} | |
return false; | |
} | |
function isNameIdeaExistsInDB(nameIdea) { | |
var result = parse_getNameIdeaFilterByNameIdea(nameIdea); | |
return result.length != 0; | |
} | |
function increaseLikeCountInDB(nameIdea) { | |
var result = parse_getNameIdeaFilterByNameIdea(nameIdea); | |
if (result.length == 0) return; | |
var idea = result[0]; | |
var ideaId = idea['objectId']; | |
var likeCount = idea['likeCount'] += 1; | |
parse_updateLikeCountByObjectId(likeCount, ideaId); | |
} | |
function isLikedAlready(nameIdea) { | |
var likedList = parse_getLikeListFilterByNameAndEmail(nameIdea, Session.getEffectiveUser().getEmail()); | |
return likedList.length != 0; | |
} | |
function registerNewNameIdea(sheet, newName) { | |
if (sheet == null || sheet.isSheetHidden()) { | |
allertUnknownError(); | |
return; | |
} | |
var encryptedEmailValue = encrypt(Session.getActiveUser().getEmail(), PASSPHRASE); | |
var currentTime = Utilities.formatDate(new Date(), "KST", "yyyy.MM.dd HH시 mm분"); | |
var isRegisterSuccess = parse_registerNewNameIdea(newName); | |
if (!isRegisterSuccess) { | |
alertUnknownError(); | |
return; | |
} | |
sheet.appendRow([encryptedEmailValue, newName, currentTime]); | |
lockAppendedRange(sheet, sheet.getLastRow()); | |
} | |
function lockAppendedRange(sheet, targetRow) { | |
var lockTargetRange = sheet.getRange("A" + targetRow + ":" + "E" + targetRow); | |
var protection = lockTargetRange.protect() | |
protection.setDescription("Name registered protection."); | |
protection.removeEditors(protection.getEditors()); | |
} | |
function getNewNameIdeaFromInputBox() { | |
return Browser.inputBox("이름 등록", "공모 할 새로운 이름을 등록합니다.", Browser.Buttons.OK); | |
} | |
function getNameIdeaToLikeFromInputBox() { | |
return Browser.inputBox("좋아요", "좋아할 이름을 입력하세요.", Browser.Buttons.OK); | |
} | |
function alertInputCorrectNameIdea() { | |
Browser.msgBox("올바른 이름을 입력해주세요!"); | |
} | |
function alertNameAlreadyExists() { | |
Browser.msgBox("이미 등록 된 이름입니다."); | |
} | |
function alertUnknownError() { | |
Browser.msgBox("알 수 없는 이유로 실패했습니다. 관리자에게 문의하세요."); | |
} | |
function alertLikeSuccess(nameIdea) { | |
Browser.msgBox(nameIdea + "를 좋아하셨습니다."); | |
} | |
function alertLikeFailed() { | |
Browser.msgBox("알 수 없는 이유로 좋아 할 수 없습니다."); | |
} | |
function alertAlreadyLiked() { | |
Browser.msgBox("이미 좋아요를 하셨습니다."); | |
} | |
function encrypt(value, passphrase) { | |
return crypto.CryptoJS.AES.encrypt(value, passphrase).toString(); | |
}; | |
function decrypt(encryptedValue, passphrase) { | |
return crypto.CryptoJS.AES.encrypt(value, passphrase).toString(); | |
}; |
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
var PARSE_URL = "https://api.parse.com/1/"; | |
var AUTH_HEADERS = { | |
"X-Parse-Application-Id": "", | |
"X-Parse-REST-API-Key": "" | |
}; | |
function parse_registerNewNameIdea(newNameIdea) { | |
var myEmail = Session.getEffectiveUser().getEmail(); | |
var url = PARSE_URL + "classes/NameIdea"; | |
var payload = { | |
"nameIdea": newNameIdea, | |
"createdBy": myEmail, | |
"likeCount": 0 | |
}; | |
var params = parse_getPostMethodParamter(); | |
params['payload'] = JSON.stringify(payload); | |
var response = UrlFetchApp.fetch(url, params); | |
return response.getResponseCode() == 201; | |
} | |
function parse_likeNameIdea(nameIdea) { | |
var myEmail = Session.getEffectiveUser().getEmail(); | |
var url = PARSE_URL + "classes/Like"; | |
var payload = { | |
"nameIdea": nameIdea, | |
"likedBy": myEmail | |
}; | |
var params = parse_getPostMethodParamter(); | |
params['payload'] = JSON.stringify(payload); | |
var response = UrlFetchApp.fetch(url, params); | |
return response.getResponseCode() == 201; | |
} | |
function parse_updateLikeCountByObjectId(likeCount, objectId) { | |
var url = PARSE_URL + "classes/NameIdea/" + objectId; | |
var payload = { | |
"likeCount": likeCount | |
}; | |
var params = parse_getPutMethodParameter(); | |
params['payload'] = JSON.stringify(payload); | |
var response = UrlFetchApp.fetch(url, params); | |
} | |
function parse_getNameIdeaFilterByNameIdea(nameIdea) { | |
var query = { | |
'nameIdea': nameIdea | |
}; | |
var url = PARSE_URL + "classes/NameIdea?where=" + encodeURIComponent(JSON.stringify(query)); | |
var response = UrlFetchApp.fetch(url, parse_getGetMethodParameter()); | |
return JSON.parse(response.getContentText()).results; | |
} | |
function parse_getLikeListFilterByNameAndEmail(nameIdea, email) { | |
var query = { | |
'nameIdea': nameIdea, | |
'likedBy': email | |
}; | |
var url = PARSE_URL + "classes/Like?where=" + encodeURIComponent(JSON.stringify(query)); | |
var response = UrlFetchApp.fetch(url, parse_getGetMethodParameter()); | |
return JSON.parse(response.getContentText()).results; | |
} | |
function parse_getNameIdeaOrderByLikeCount(limit) { | |
var url = PARSE_URL + "classes/NameIdea?order=-likeCount&limit=" + limit; | |
var response = UrlFetchApp.fetch(url, parse_getGetMethodParameter()); | |
return JSON.parse(response.getContentText()).results; | |
} | |
function parse_getPostMethodParamter() { | |
return { | |
"method": "post", | |
"headers": AUTH_HEADERS, | |
"contentType": "application/json; charset=utf-8", | |
}; | |
} | |
function parse_getPutMethodParameter() { | |
return { | |
"method": "put", | |
"headers": AUTH_HEADERS, | |
"contentType": "application/json; charset=utf-8", | |
}; | |
} | |
function parse_getGetMethodParameter() { | |
return { | |
"method": "get", | |
"headers": AUTH_HEADERS | |
}; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment