Skip to content

Commit

Permalink
2.1.8 - Use secondary API (key contingent) if first fails for Coins u…
Browse files Browse the repository at this point in the history
…pdate.
  • Loading branch information
transilvlad committed Apr 24, 2021
1 parent 33eec8e commit 0e05028
Show file tree
Hide file tree
Showing 12 changed files with 187 additions and 71 deletions.
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,9 @@ _Please do keep in mind at this point there are a lot of differences between thi
- Made Flux multi-sheet by using active sheet.
- Improved Flux update error messages.

- Version 2.1.8
- Use secondary API (key contingent) if first fails for Coins update.


## Planned updates
- Automatically add coin when adding trade.
Expand Down
23 changes: 20 additions & 3 deletions source/API.gs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,17 @@
* Gets coins market data.
* <p>This is an implementation wrapper for API change capability.
*/
function apiMarkets(fiat, ids) {
return geckoMarkets(fiat, ids);
function apiMarkets(fiat, ids, tickers) {
var market = geckoMarkets(fiat, ids);

if(Object.keys(market).length == 0) {
var key = getCryptoCompareKey();
if(key != "") {
market = cryptoMarkets(key, fiat, tickers);
}
}

return market;
}

/**
Expand All @@ -12,7 +21,7 @@ function apiMarkets(fiat, ids) {
*/
function apiRate(fiat, coin, date) {
var key = getCryptoCompareKey();
if (key != "") {
if(key != "") {
return cryptoRate(key, fiat, coin, date);
}
return geckoRate(fiat, coin, date);
Expand All @@ -24,3 +33,11 @@ function apiRate(fiat, coin, date) {
function apiFlux(fiat, coin, days, interval) {
return geckoFlux(fiat, coin, days, interval);
}

/**
* Debug.
*/
function apiMarketsDebug() {
disableCache();
return apiMarkets("usd", "bitcoin,ethereum,litecoin", "btc,eth,ltc");
}
10 changes: 8 additions & 2 deletions source/APICoinGecko.gs
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@
function geckoMarkets(fiat, ids) {
var market = {};

enableCache();
var json = importJson("https://api.coingecko.com/api/v3/coins/markets?vs_currency=" + fiat + "&ids=" + ids);
if (typeof (json) === "object") {
for (i = 0; i < json.length; i++) {

if(typeof(json) === "object") {
for(i = 0; i < json.length; i++) {
market[json[i][1]["symbol"].toLowerCase()] = json[i][1];
}
}
Expand All @@ -21,6 +23,8 @@ function geckoMarkets(fiat, ids) {
function geckoRate(fiat, coin, date) {
var coins = getCoins();
date = date.getDate().padLeft(2) + "-" + (date.getMonth() + 1).padLeft(2) + "-" + date.getFullYear();

enableCache();
return importJson("https://api.coingecko.com/api/v3/coins/" + coins[coin] + "/history?date=" + date, "market_data.current_price." + fiat);
}

Expand All @@ -30,5 +34,7 @@ function geckoRate(fiat, coin, date) {
function geckoFlux(fiat, coin, days, interval) {
var coins = getCoins();
days = interval == "hourly" ? Math.ceil(days / 24) : days;

enableCache();
return importJson("https://api.coingecko.com/api/v3/coins/" + coins[coin] + "/market_chart?vs_currency=" + fiat + "&days=" + days + "&interval=" + interval);
}
49 changes: 48 additions & 1 deletion source/APICryptoCompare.gs
Original file line number Diff line number Diff line change
@@ -1,8 +1,49 @@
/**
* Gets coins market data from CoinGecko API versus given fiat.
* <p>Documentation: https://www.coingecko.com/api/documentations/v3
*/
function cryptoMarkets(key, fiat, tickers) {
var market = {};

disableCache();
var json = importJson("https://min-api.cryptocompare.com/data/pricemultifull?api_key=" + key + "&tsyms=" + fiat + "&fsyms=" + tickers + "&relaxedValidation=true");

if(typeof(json) === "object" && json.length > 1 && json[0].length > 1) {
var key, data, ticker;
for(key in json[0][1]) {
data = json[0][1][key][fiat.toUpperCase()];
ticker = key.toLowerCase();

market[ticker] = [];
if(data.hasOwnProperty("MKTCAP")) {
market[ticker]["market_cap"] = data["MKTCAP"];
}
if(data.hasOwnProperty("SUPPLY")) {
market[ticker]["circulating_supply"] = data["SUPPLY"];
}
if(data.hasOwnProperty("LOW24HOUR")) {
market[ticker]["low_24h"] = data["LOW24HOUR"];
}
if(data.hasOwnProperty("HIGH24HOUR")) {
market[ticker]["high_24h"] = data["HIGH24HOUR"];
}
if(data.hasOwnProperty("CHANGE24HOUR")) {
market[ticker]["price_change_24h"] = data["CHANGE24HOUR"];
}
if(data.hasOwnProperty("PRICE")) {
market[ticker]["current_price"] = data["PRICE"];
}
}
}

return market;
}

/**
* Gets coin vs fiat exchnage rate from CryptoCompare API for given date.
*/
function cryptoRate(key, fiat, coin, date) {
enableCache();
var rate = importJson("https://min-api.cryptocompare.com/data/v2/histohour?api_key=" + key + "&fsym=" + coin + "&tsym=" + fiat + "&toTs=" + (date.getTime() / 1000) + "&limit=1","Data.Data.0.close");
if(typeof(rate) === "number") {
return rate;
Expand All @@ -14,8 +55,14 @@ function cryptoRate(key, fiat, coin, date) {
/**
* Debug.
*/
function cryptoMarketsDebug() {
disableCache();
var key = getCryptoCompareKey();
Logger.log(cryptoMarkets(key, "usd", "btc,eth,ltc"));
}

function cryptoRateDebug() {
disableCache();
var key = getCryptoCompareKey();
Logger.log(cryptoRate(key, "usd", "btc", new Date("04/10/2021")));
}
}
12 changes: 6 additions & 6 deletions source/Cache.gs
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,9 @@ function enableCache() {
* @param duration Retention duration.
*/
function setCache(key, value, duration) {
if (isCache()) {
if(isCache()) {
duration = parseInt(duration);
if (duration == 0 || isNaN(duration)) {
if(duration == 0 || isNaN(duration)) {
duration = 600;
}
var cacheService = CacheService.getUserCache();
Expand All @@ -53,13 +53,13 @@ function setCache(key, value, duration) {
* @param key Cache key.
*/
function getCache(key) {
if (isCache()) {
if(isCache()) {
var cacheService = CacheService.getUserCache();

key = key.length > 250 ? key.substring(0, 250) : key;
var items = cacheService.get(key);

if (!items) {
if(!items) {
return null;
}

Expand All @@ -71,7 +71,7 @@ function getCache(key) {
* Delete cache entry.
*/
function deleteCache(key) {
if (isCache()) {
if(isCache()) {
var cacheService = CacheService.getUserCache();

key = key.length > 250 ? key.substring(0, 250) : key;
Expand All @@ -83,7 +83,7 @@ function deleteCache(key) {
* Is cache enabled.
*/
function isCache() {
if (cacheDisabled == true) {
if(cacheDisabled == true) {
Logger.log("isCache:: Is disabled");
return false;
}
Expand Down
72 changes: 50 additions & 22 deletions source/CoinsUpdate.gs
Original file line number Diff line number Diff line change
Expand Up @@ -3,36 +3,64 @@
* <p>Fetch coins data from CoinGecko API.
*/
function updateCoins() {
var ids = getCoinNames();
var fiat = getFiat();
var stable = getStableCoins();
Logger.log("updateCoins:: Coins list: " + ids);
var market = apiMarkets(getFiat(), getCoinNames(), getTickers());
if(Object.keys(market).length > 0) {
var coins = getCoins();
var stable = getStableCoins();

var coins = apiMarkets(fiat, ids);
if (Object.keys(coins).length > 0) {
var active = SpreadsheetApp.getActive();
var sheet = active.getSheetByName("Coins");
var rows = sheet.getRange("A3:A").getValues();

for (i = 0; i < rows.length; i++) {
if (rows[i] != undefined && rows[i][0].length > 0) {
for(i = 0; i < rows.length; i++) {
if(rows[i] != undefined && rows[i][0].length > 0) {
var ticker = rows[i][0].toLowerCase();
if (coins.hasOwnProperty(ticker)) {
if (stable.indexOf(ticker) != -1) {
coins[ticker]["current_price"] = 1;
}
var payload = [[
coins[ticker]["market_cap_rank"], coins[ticker]["total_volume"],
coins[ticker]["market_cap"], coins[ticker]["fully_diluted_valuation"],
coins[ticker]["circulating_supply"], coins[ticker]["total_supply"],
coins[ticker]["low_24h"], coins[ticker]["high_24h"], coins[ticker]["ath"],
coins[ticker]["price_change_24h"], coins[ticker]["current_price"]
]];
Logger.log("updateCoins:: Row data: " + JSON.stringify([i, ticker, payload[0]]));
if(market.hasOwnProperty(ticker)) {
// Skip fiat
if(coins[ticker] == "fiat") {
continue;
}
// Set stablecoins to 1
if(stable.indexOf(ticker) != -1) {
market[ticker]["current_price"] = 1;
}

var r = i + 3;
var range = sheet.getRange("C" + r + ":M" + r);
range.setValues(payload);
if(market[ticker].hasOwnProperty("market_cap_rank")) {
sheet.getRange("C" + r).setValue(market[ticker]["market_cap_rank"]);
}
if(market[ticker].hasOwnProperty("total_volume")) {
sheet.getRange("D" + r).setValue(market[ticker]["total_volume"]);
}
if(market[ticker].hasOwnProperty("market_cap")) {
sheet.getRange("E" + r).setValue(market[ticker]["market_cap"]);
}
if(market[ticker].hasOwnProperty("fully_diluted_valuation")) {
sheet.getRange("F" + r).setValue(market[ticker]["fully_diluted_valuation"]);
}
if(market[ticker].hasOwnProperty("circulating_supply")) {
sheet.getRange("G" + r).setValue(market[ticker]["circulating_supply"]);
}
if(market[ticker].hasOwnProperty("total_supply")) {
sheet.getRange("H" + r).setValue(market[ticker]["total_supply"]);
}
if(market[ticker].hasOwnProperty("low_24h")) {
sheet.getRange("I" + r).setValue(market[ticker]["low_24h"]);
}
if(market[ticker].hasOwnProperty("high_24h")) {
sheet.getRange("J" + r).setValue(market[ticker]["high_24h"]);
}
if(market[ticker].hasOwnProperty("ath")) {
sheet.getRange("K" + r).setValue(market[ticker]["ath"]);
}
if(market[ticker].hasOwnProperty("price_change_24h")) {
sheet.getRange("L" + r).setValue(market[ticker]["price_change_24h"]);
}
if(market[ticker].hasOwnProperty("current_price")) {
sheet.getRange("M" + r).setValue(market[ticker]["current_price"]);
}

Logger.log("updateCoins:: Row data: " + JSON.stringify([i, r, ticker, market[ticker]]));
}
}
}
Expand Down
32 changes: 16 additions & 16 deletions source/FiatValues.gs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ function addFiatValues() {
var fiat = getFiat();
var coins = getCoins();
var stable = getStableCoins();
for (var i = 1; i < trades.length; i++) {
for(var i = 1; i < trades.length; i++) {
var date = new Date(trades[i][0]);

var buy_count = trades[i][2];
Expand All @@ -26,17 +26,17 @@ function addFiatValues() {
var isSell = sell_count > 0 && sell_coin != "" && sell_fiat === "" && coins.hasOwnProperty(sell_coin);
var isFee = fee_count > 0 && fee_coin != "" && fee_fiat === "" && coins.hasOwnProperty(fee_coin);

if (isBuy && isSell) {
if(isBuy && isSell) {
setEqualFiat(sheet, coins, fiat, stable, date, buy_count, buy_coin, sell_count, sell_coin, i + 1);

} else if (isBuy) {
} else if(isBuy) {
setFiat(sheet, coins, fiat, stable, date, buy_count, buy_coin, "C", "D", "E", i + 1);

} else if (isSell) {
} else if(isSell) {
setFiat(sheet, coins, fiat, stable, date, sell_count, sell_coin, "F", "G", "H", i + 1);
}

if (isFee) {
if(isFee) {
setFiat(sheet, coins, fiat, stable, date, fee_count, fee_coin, "I", "J", "K", i + 1);
}
}
Expand All @@ -52,41 +52,41 @@ function setEqualFiat(sheet, coins, fiat, stable, date, buy_count, buy_coin, sel

var coin = sell_coin;
var coinName = sellCoinName;
if ((buyCoinName == "fiat" && sellCoinName != "fiat") || stable.indexOf(buy_coin) != -1) {
if((buyCoinName == "fiat" && sellCoinName != "fiat") || stable.indexOf(buy_coin) != -1) {
coin = buy_coin;
coinName = buyCoinName;
}

if (coinName == "fiat" && stable.indexOf(coin) == -1) {
if (coinName == buyCoinName) {
if(coinName == "fiat" && stable.indexOf(coin) == -1) {
if(coinName == buyCoinName) {
sheet.getRange("E" + row).setValue("=INDEX(GOOGLEFINANCE(CONCAT(\"CURRENCY:\", CONCAT(D" + row + ", \"" + fiat.toUpperCase() + "\")), \"price\", TO_DATE(A" + row + ")), 2, 2) * C" + row);
sheet.getRange("H" + row).setValue("=E" + row);
} else {
sheet.getRange("E" + row).setValue("=H" + row);
sheet.getRange("H" + row).setValue("=INDEX(GOOGLEFINANCE(CONCAT(\"CURRENCY:\", CONCAT(G" + row + ", \"" + fiat.toUpperCase() + "\")), \"price\", TO_DATE(A" + row + ")), 2, 2) * F" + row);
}
} else if (stable.indexOf(coin) != -1) {
if (coinName == buyCoinName) {
} else if(stable.indexOf(coin) != -1) {
if(coinName == buyCoinName) {
sheet.getRange("E" + row).setValue("=C" + row);
sheet.getRange("H" + row).setValue("=E" + row);
} else {
sheet.getRange("E" + row).setValue("=H" + row);
sheet.getRange("H" + row).setValue("=F" + row);
}
} else {
if (coinName == buyCoinName) {
if(coinName == buyCoinName) {
var rate = apiRate(fiat, buy_coin, date);
Logger.log("setEqualFiat:: " + [date, buy_coin, rate * buy_count]);

if (rate != undefined) {
if(rate != undefined) {
sheet.getRange("E" + row).setValue(rate * buy_count);
sheet.getRange("H" + row).setValue("=E" + row);
}
} else {
var rate = apiRate(fiat, sell_coin, date);
Logger.log("setEqualFiat:: " + [date, sell_coin, rate * sell_count]);

if (rate != undefined) {
if(rate != undefined) {
sheet.getRange("E" + row).setValue("=H" + row);
sheet.getRange("H" + row).setValue(rate * sell_count);
}
Expand All @@ -99,8 +99,8 @@ function setEqualFiat(sheet, coins, fiat, stable, date, buy_count, buy_coin, sel
*/
function setFiat(sheet, coins, fiat, stable, date, count, coin, columnValue, columnTicker, columnFiat, row) {
var coinName = coins[coin];
if (coinName.toLowerCase() == "fiat" || stable.indexOf(coin) != -1) {
if (coin == fiat || stable.indexOf(coin) != -1) {
if(coinName.toLowerCase() == "fiat" || stable.indexOf(coin) != -1) {
if(coin == fiat || stable.indexOf(coin) != -1) {
sheet.getRange(columnFiat + row).setValue("=" + columnValue + row);
} else {
sheet.getRange(columnFiat + row).setValue("=INDEX(GOOGLEFINANCE(CONCAT(\"CURRENCY:\", CONCAT(" + columnTicker + row + ", \"" + fiat.toUpperCase() + "\")), \"price\", TO_DATE(A" + row + ")), 2, 2) * " + columnValue + row);
Expand All @@ -109,7 +109,7 @@ function setFiat(sheet, coins, fiat, stable, date, count, coin, columnValue, col
var rate = apiRate(fiat, coin, date);
Logger.log("setFiat:: " + [date, coin, rate * count]);

if (rate != undefined) {
if(rate != undefined) {
sheet.getRange(columnFiat + row).setValue(rate * count);
}
}
Expand Down
Loading

0 comments on commit 0e05028

Please sign in to comment.