Last active
September 14, 2018 08:36
-
-
Save EVEKatsu/9242e577e17a2eac6a7a0f29557887ae to your computer and use it in GitHub Desktop.
Google Apps Script(GAS) to find affiliations from Eve Who.
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
function onOpen() { | |
SpreadsheetApp.getActiveSpreadsheet().addMenu( | |
"Eve Who", | |
[ | |
{ | |
name: "Ticker on", | |
functionName: "tickerOn" | |
}, | |
{ | |
name: "Ticker off", | |
functionName: "tickerOff" | |
} | |
] | |
); | |
} | |
var API_URL = "https://evewho.com/api.php"; | |
var CHARACTERS_SHEET = 0; | |
var CORPORATIONS_SHEET = 1; | |
var ALLIANCES_SHEET = 2; | |
var PROPERTIES_SHEET = 3; | |
var SHEETS = [ | |
{ | |
"name": "Characters", | |
"sheet": undefined, | |
"dict": {}, | |
"idName": "character_id", | |
"query": "?type=character&", | |
"columns": [ | |
"character_id", | |
"name", | |
"corporation_id", | |
"alliance_id" | |
] | |
}, | |
{ | |
"name": "Corporations", | |
"sheet": undefined, | |
"dict": {}, | |
"idName": "corporation_id", | |
"query": "?type=corporation&", | |
"columns": [ | |
"corporation_id", | |
"name", | |
"ticker", | |
"alliance_id" | |
] | |
}, | |
{ | |
"name": "Alliances", | |
"sheet": undefined, | |
"dict": {}, | |
"idName": "alliance_id", | |
"query": "?type=alliance&", | |
"columns": [ | |
"alliance_id", | |
"name", | |
"ticker" | |
] | |
}, | |
{ | |
"name": "Properties", | |
"sheet": undefined, | |
"properties": {} | |
} | |
]; | |
var spreadsheet = undefined; | |
function tickerOn() { | |
eveWho(true); | |
} | |
function tickerOff() { | |
eveWho(false); | |
} | |
function eveWho(ticker) { | |
deleteTriggers(); | |
spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); | |
var activeSheet = spreadsheet.getActiveSheet(); | |
for (var i = 0; i < SHEETS.length; i++) { | |
deleteSheet(SHEETS[i]); | |
updateSheet(SHEETS[i]); | |
} | |
setProperty("activeSheet", activeSheet.getName()); | |
setProperty("ticker", ticker); | |
setProperty("startRow", 1); | |
activeSheet.activate(); | |
ScriptApp.newTrigger("run").timeBased().everyMinutes(1).create(); | |
} | |
function run() { | |
var lock = LockService.getDocumentLock(); | |
if (!lock.tryLock(100)) { | |
Browser.msgBox("The script is already running."); | |
return; | |
} | |
deleteTriggers(); | |
spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); | |
for (var i = 0; i < SHEETS.length; i++) { | |
updateSheet(SHEETS[i]); | |
updateDict(SHEETS[i]); | |
} | |
var activeSheet = spreadsheet.getActiveSheet(); | |
var sheets = spreadsheet.getSheets(); | |
for (var i in sheets) { | |
if (sheets[i].getName() == getProperty("activeSheet")) { | |
activeSheet = sheets[i]; | |
activeSheet.activate(); | |
break; | |
} | |
} | |
var startTime = new Date(); | |
for (var row = parseInt(getProperty("startRow")); row <= activeSheet.getLastRow(); row++) { | |
var character = getPlayer( | |
activeSheet.getRange(row, 1).getValue().replace(" ", "+"), | |
SHEETS[CHARACTERS_SHEET] | |
); | |
var column = 2; | |
[CORPORATIONS_SHEET, ALLIANCES_SHEET].forEach(function(i) { | |
var playerId = character[SHEETS[i]["idName"]]; | |
var value = ""; | |
if (parseInt(playerId) != 0) { | |
var player = getPlayer(playerId, SHEETS[i]); | |
var value = player["name"]; | |
if (getProperty("ticker")) { | |
var ticker = player["ticker"]; | |
if (i == CORPORATIONS_SHEET) { | |
ticker = "[" + ticker + "]"; | |
} else { | |
ticker = "<" + ticker + ">"; | |
} | |
value = ticker + " " + value; | |
} | |
} | |
activeSheet.getRange(row, column).setValue(value); | |
column++; | |
}); | |
setProperty("startRow", row + 1); | |
var diff = parseInt((new Date() - startTime) / (1000 * 60)); | |
if (diff >= 5) { | |
ScriptApp.newTrigger("run").timeBased().everyMinutes(1).create(); | |
lock.releaseLock(); | |
return; | |
} | |
} | |
lock.releaseLock(); | |
deleteTriggers(); | |
deleteSheet(SHEETS[PROPERTIES_SHEET]); | |
} | |
function parseJson(url) { | |
var response = UrlFetchApp.fetch(url); | |
return JSON.parse(response.getContentText()); | |
} | |
function deleteTriggers() { | |
var triggerKeys = ScriptApp.getProjectTriggers(); | |
for (var i = 0; i < triggerKeys.length; i++) { | |
ScriptApp.deleteTrigger(triggerKeys[i]); | |
} | |
} | |
function updateSheet(sheet) { | |
var sheets = spreadsheet.getSheets(); | |
for (var i in sheets) { | |
if (sheets[i].getName() == sheet["name"]) { | |
sheet["sheet"] = sheets[i]; | |
return; | |
} | |
} | |
sheet["sheet"] = spreadsheet.insertSheet(sheet["name"]); | |
if (sheet["columns"]) { | |
for (var i = 0; i < sheet["columns"].length; i++) { | |
sheet["sheet"].getRange(1, i + 1).setValue(sheet["columns"][i]); | |
} | |
} | |
} | |
function deleteSheet(sheet) { | |
var sheets = spreadsheet.getSheets(); | |
for (var i in sheets) { | |
if (sheets[i].getName() == sheet["name"]) { | |
spreadsheet.deleteSheet(sheets[i]); | |
break; | |
} | |
} | |
} | |
function getProperty(key) { | |
var properties = SHEETS[PROPERTIES_SHEET]["properties"]; | |
if (key in properties) { | |
return properties[key]; | |
} | |
var propertiesSheet = SHEETS[PROPERTIES_SHEET]["sheet"]; | |
var lastRow = propertiesSheet.getLastRow(); | |
for (var row = 1; row <= lastRow; row++) { | |
if (propertiesSheet.getRange(row, 1).getValue() == key) { | |
var value = propertiesSheet.getRange(row, 2).getValue();; | |
properties[key] = value; | |
return value; | |
} | |
} | |
return undefined; | |
} | |
function setProperty(key, value) { | |
var properties = SHEETS[PROPERTIES_SHEET]["properties"]; | |
var propertiesSheet = SHEETS[PROPERTIES_SHEET]["sheet"]; | |
var lastRow = propertiesSheet.getLastRow(); | |
properties[key] = value; | |
for (var row = 1; row <= lastRow; row++) { | |
if (propertiesSheet.getRange(row, 1).getValue() == key) { | |
propertiesSheet.getRange(row, 2).setValue(value); | |
return; | |
} | |
} | |
propertiesSheet.getRange(lastRow + 1, 1).setValue(key); | |
propertiesSheet.getRange(lastRow + 1, 2).setValue(value); | |
} | |
function updateDict(sheet) { | |
var targetDict = {}; | |
var targetSheet = sheet["sheet"]; | |
if (!sheet["dict"]) { | |
return; | |
} | |
for (var row = 2; row <= targetSheet.getLastRow(); row++) { | |
var targetId = targetSheet.getRange(row, 1).getValue(); | |
targetDict[targetId] = {}; | |
for (var i = 0; i < sheet["columns"].length; i++) { | |
var key = sheet["columns"][i]; | |
var value = targetSheet.getRange(row, column).getValue(); | |
targetDict[targetId][key] = value; | |
} | |
} | |
sheet["dict"] = targetDict; | |
} | |
function getPlayer(playerIdOrName, sheet) { | |
if (playerIdOrName in sheet["dict"]) { | |
return sheet["dict"][playerIdOrName]; | |
} | |
var url = API_URL + sheet["query"] + (isFinite(playerIdOrName) ? "id=" : "name=") + playerIdOrName; | |
var player = {}; | |
var playerJson = parseJson(url); | |
var playerId = playerJson["info"][sheet["idName"]]; | |
var lastRow = sheet["sheet"].getLastRow() + 1; | |
for (var i = 0; i < sheet["columns"].length; i++) { | |
var key = sheet["columns"][i]; | |
var value = playerJson["info"][key]; | |
sheet["sheet"].getRange(lastRow, i + 1).setValue(value); | |
player[key] = value; | |
} | |
sheet["dict"][playerId] = player; | |
return player; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment