将 coinmarketcap api v2 与 google 表一起使用 - 通过多次调用添加到 js 对象
Using coinmarketcap api v2 with google sheets - adding to js object with multiple calls
我正在使用 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 个),每次都附加结果,然后遍历数据?我该怎么做?我只有非常基本的编码知识,有人帮助我完成了上面显示的代码。
这个修改怎么样?
修改点:
- 从v1到v2,您的脚本有以下修改。
id
变成了 website_slug
.
market_cap_usd
变成了 USD.market_cap
.
- ID号成为每个元素的key
- 为了请求 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);
}
注:
- 当我测试这个脚本时,我注意到有时会出现由于速率限制导致的错误。
- 在这种情况下,返回 HTML,包括
<title>Access denied | api.coinmarketcap.com used Cloudflare to restrict access</title>
。
- 在这个脚本中,当错误发生时,使用
Logger.log()
输出"errors occurred."。
- 出现限制错误时,请等待解除限制。我认为如果每个用户都有访问令牌和令牌,用户可能可以调整 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 个),每次都附加结果,然后遍历数据?我该怎么做?我只有非常基本的编码知识,有人帮助我完成了上面显示的代码。
这个修改怎么样?
修改点:
- 从v1到v2,您的脚本有以下修改。
id
变成了website_slug
.market_cap_usd
变成了USD.market_cap
.- ID号成为每个元素的key
- 为了请求 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);
}
注:
- 当我测试这个脚本时,我注意到有时会出现由于速率限制导致的错误。
- 在这种情况下,返回 HTML,包括
<title>Access denied | api.coinmarketcap.com used Cloudflare to restrict access</title>
。 - 在这个脚本中,当错误发生时,使用
Logger.log()
输出"errors occurred."。 - 出现限制错误时,请等待解除限制。我认为如果每个用户都有访问令牌和令牌,用户可能可以调整 API 调用。但是我找不到这样的令牌。对不起。
- 在这种情况下,返回 HTML,包括
参考:
在我的环境中,我可以确认这个修改后的脚本有效。但如果这不是你想要的,我很抱歉。