我正在使用Google脚本通过Google电子表格查询CoinMarketCap的api,以获取许多加密硬币的最新价格,市值,供应等。
我的电子表格看起来像这样......
Ticker | Coin | Price | MarketCap | Supply etc
BTC | Bitcoin | 9,000 | 130,000,000,000 | 20,000,000
ETH | Ethereum | 700 | 60,000,000,000 | 80,000,000,000
etc
然后我点击一个刷新按钮,每个需要更新的单元格(同时)调用重复函数(其ticker / coinID作为标识行的参数),如下所示...
function getMarketCap(coinID) {
var url1 = 'https://api.coinmarketcap.com/v1/ticker/';
var full_url = url1 + coinID;
var response = UrlFetchApp.fetch(full_url);
var data = JSON.parse(response.getContentText());
return Number(data[0]['market_cap_usd']);
}
function getTotalSupply(coinID) {
//repetitive code for api call
return Number(data[0]['total_supply']);
}
//about 6 more similar functions making same call but returning different data
除了不优雅之外,问题在于CoinMarketCap api的限制大约是每分钟30个请求,虽然我查询的硬币少于30个,但是按每个列乘以我超出限制。
我知道这是一个超级基本的问题,但我是新手通过电子表格调用Google脚本,并且我很难理解我在理论上如何只能调用每个硬币的API,并存储各个列/属性(即价格,marketCap,Supply等)由其他单元格访问。或者也许可以在第一次调用该行后从Google脚本中“推送”整行的电子表格单元格更新?
答案 0 :(得分:1)
Ypu可以通过一个调用获取所有内容,然后从A列中的符号中选择所需的数据。从以下自定义菜单运行:
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('Current Prices')
.addItem('Run', 'getMarketCap')
.addToUi();
}
function getMarketCap() {
var ss=SpreadsheetApp.getActiveSpreadsheet()
var s=ss.getSheetByName("Sheet1")//get Sheet1
var lr=s.getLastRow()
var url1 = 'https://api.coinmarketcap.com/v1/ticker/';// get all data
var response = UrlFetchApp.fetch(url1);
var data = JSON.parse(response.getContentText());
var sym=s.getRange(2,1,lr,1).getValues()//get list of symbols in col A
for(var i=0;i<sym.length;i++){//for eacch symbol in col A
for(var j=0;j<data.length;j++){
if(sym[i][0]==data[j]['symbol']){//find matching symbol in data
s.getRange(i+2,2,1,1).setValue(data[j]['name'])
s.getRange(i+2,3,1,1).setValue(data[j]['price_usd'])
s.getRange(i+2,4,1,1).setValue(data[j][['market_cap_usd']])
s.getRange(i+2,5,1,1).setValue(data[j]['total_supply'])
}
}
}
}