Skip to content

Instantly share code, notes, and snippets.

@KoMinkyu
Last active December 29, 2015 08:53
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save KoMinkyu/a8baadc326bc2c3100e6 to your computer and use it in GitHub Desktop.
Save KoMinkyu/a8baadc326bc2c3100e6 to your computer and use it in GitHub Desktop.
이화앱센터 새 이름 공모전 Google sheet apps script
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();
};
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