从Google电子表格访问Google Scripts中的存储值

时间:2018-05-31 12:16:09

标签: google-apps-script google-sheets

我正在使用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脚本中“推送”整行的电子表格单元格更新?

1 个答案:

答案 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'])
      }
    }
  }
}