将coinmarketcap api v2与google sheet一起使用 - 通过多次调用添加到js对象

时间:2018-05-30 02:37:11

标签: javascript json google-sheets-api

我正在使用coinmarketcap api来填充Google表格中的数据。 https://coinmarketcap.com/api/

他们正在进行一些改变,这将使这很困难。让我搞砸的两个变化是分页和JSON结构的变化。

以前我会在Google工作表中有一列硬币ID。我会从coinmarketcap中获取所有硬币数据然后遍历javascript数组以获取我需要的数据。这是一个例子

function getMarketCap(sheetname) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName(sheetname);

  var assets = [];

  var idRange = sheet.getRange("B1:B");
  var lastRow = getLastRowOfRange(idRange);

  var cellRange = sheet.getRange(1, 2, lastRow).getValues();
  var mcRange = sheet.getRange(1, 3, lastRow);

  var mcValues = [];

   for (var i = 0; i < cellRange.length; i++) {
    assets[i] = cellRange[i];
  }

  var CMCdata = JSON.parse(UrlFetchApp.fetch('https://api.coinmarketcap.com/v1/ticker/?limit=0')); 
  for (var i = 0; i < assets.length; i++) {

    mcValues[i] = [];
    for (var x = 0; x < CMCdata.length; x++) {
      if (assets[i] == CMCdata[x]["id"]) {
        mcValues[i][0] = CMCdata[x]["market_cap_usd"];
      }
      if (!mcValues[i][0]) {
        mcValues[i][0] = 'xxx';
      }      
    }
  }

  mcRange.setValues(mcValues); 
}

现在使用v2,他们正在制作它,因此您一次只能获得100个结果,而不是一次https://api.coinmarketcap.com/v2/ticker/ vs https://api.coinmarketcap.com/v1/ticker/?limit=0

如何在进行这些更改之前做我以前做过的事情?是否可以发出12个请求(一次100个硬币,总共大约1200个),每次附加结果然后遍历数据?我该怎么做?我只有一个非常基本的编码知识,有人帮助我使用上面显示的代码。

1 个答案:

答案 0 :(得分:1)

这次修改怎么样?

修改要点:

  • 从v1到v2,您的脚本中有以下修改。
    • id成为website_slug
    • market_cap_usd成为USD.market_cap
    • ID号成为每个元素的关键。
  • 为了请求12个API调用,使用了fetchAll方法。

修改后的脚本:

function getMarketCap(sheetname) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName(sheetname);
  var assets = [];
  var idRange = sheet.getRange("B1:B");
  var lastRow = getLastRowOfRange(idRange);
  var cellRange = sheet.getRange(1, 2, lastRow).getValues();
  var mcRange = sheet.getRange(1, 3, lastRow);
  var mcValues = [];
  for (var i = 0; i < cellRange.length; i++) {
    assets[i] = cellRange[i];
  }

  // Added script --- begin
  var req = [];
  for (var i = 0; i < 12; i++) {
    req.push({
      muteHttpExceptions: true,
      method: "get",
      url: "https://api.coinmarketcap.com/v2/ticker/?start=" + (i * 100 + 1),
    });
  }
  var responses = UrlFetchApp.fetchAll(req);
  var res = responses.filter(function(e){return e.getResponseCode() == 200}).map(function(e){return JSON.parse(e.getContentText())});
  if (responses.length != res.length) Logger.log("%s errors occurred.", responses.length - res.length);
  var mcValues = [];
  assets.forEach(function(e, h) {
    mcValues[h] = [];
    res.some(function(f) {
      Object.keys(f.data).some(function(g) {
        if (f.data[g].website_slug == e[0]) {
          mcValues[h][0] = f.data[g].quotes.USD.market_cap;
          return true;
        }        
      });
      if (mcValues[h][0]) return true;
    });
    if (!mcValues[h][0]) mcValues[h][0] = 'xxx';
  });
  // Added script --- end

  mcRange.setValues(mcValues); 
}

注意:

  • 当我测试这个脚本时,我注意到由于速率限制导致的错误有时会发生。
    • 在这种情况下,将返回包含<title>Access denied | api.coinmarketcap.com used Cloudflare to restrict access</title>的HTML。
    • 在此脚本中,发生错误时,发生了错误。&#34;使用Logger.log()输出。
    • 发生限制错误时,请等待限制解除。我认为如果每个用户都有访问令牌和令牌,用户可能会调整API调用。但我无法找到这样的代币。对不起。

参考:

在我的环境中,我可以确认此修改后的脚本有效。但如果这不是你想要的,我很抱歉。