在谷歌表格单元格上,我只想使用以下公式获取当前的加密货币价格:
=ValueCrypto(A1)
我为coinmarketcap尝试了这个功能:
function ValueCrypto(crypto) {
var url = "https://api.coinmarketcap.com/v1/ticker/" + crypto + "/?convert=EUR";
var response = UrlFetchApp.fetch(url);
var data = JSON.parse(response.getContentText());
return data[0].price_eur;
}
该函数给我错误"我们不再在此处提供此端点">
我还尝试更改端点,并将我的 apy 密钥添加到函数中:
function ValueCrypto(crypto) {
var url = "pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest?symbol=" + crypto
var requestOptions = {
method: 'GET',
uri: 'https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest',
qs: {
start: 1,
limit: 5000,
convert: 'EUR'
},
headers: {
'X-CMC_PRO_API_KEY': 'myapikey'
},
json: true,
gzip: true
};
var response = UrlFetchApp.fetch(url);
var data = JSON.parse(response.getContentText());
return data[0].price_eur;
}
现在的错误是: 异常:http://pro-api.coinmarketcap.com 返回代码 401 的请求失败。截断的服务器响应:{ "状态":{ "时间戳":"2021-01-02T11:31:39.880Z", "error_code":1002, "error_message": "缺少 API 密钥。 ...(使用muteHttpExceptions选项检查完整响应)
我发现根据最新的 API 文档,接受的答案格式不正确。这是我的解决方案,它似乎对我有用(请务必放置 API 密钥和报价货币):
function ValueCrypto(crypto = "BTC") {
var url = "https://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest?symbol=" + crypto;
var requestOptions = {
method: 'GET',
uri: 'https://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest?symbol=',
qs: {
start: 1,
limit: 5000,
convert: 'USD'
},
headers: {
'X-CMC_PRO_API_KEY': 'INSERT_KEY_HERE'
},
json: true,
gzip: true
};
var response = UrlFetchApp.fetch(url, requestOptions);
var data = JSON.parse(response.getContentText());
//console.log(data.data[crypto].quote.USD.price);
return data.data[crypto].quote.USD.price;
}
您的代码似乎没有使用定义 API 密钥requestOptions
。尝试将其传递给UrlFetchApp
,如下所示:
var response = UrlFetchApp.fetch(url, requestOptions);
请参阅 UriFetchApp 的文档。
修改点:
-
当我看到CoinMarketCap API快速入门指南的官方文档时,作为示例curl命令,我发现了以下示例curl命令。
curl -H "X-CMC_PRO_API_KEY: b54bcf4d-1bca-4e8e-9a24-22ff2c3d462c" -H "Accept: application/json" -d "start=1&limit=5000&convert=USD" -G https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest
-
在这种情况下,需要将
start=1&limit=5000&convert=USD
的数据用作查询参数。 -
当我看到您的脚本时,似乎使用了
symbol, start, limit, convert
的值。在这种情况下,请使用类似symbol=${crypto}&start=1&limit=5000&convert=EUR
的值。而且,headers: {'X-CMC_PRO_API_KEY': 'myapikey'}
可以在fetch(url, params)
params
使用。 -
似乎网址
https://###
.
当上述几点反映到您的脚本中时,它将变为如下。
修改后的脚本:
在使用它之前,请使用您的 API 密钥设置'X-CMC_PRO_API_KEY': 'myapikey'
。
function ValueCrypto(crypto) {
// This is from https://gist.github.com/tanaikech/70503e0ea6998083fcb05c6d2a857107
String.prototype.addQuery = function(obj) {
return this + Object.keys(obj).reduce(function(p, e, i) {
return p + (i == 0 ? "?" : "&") +
(Array.isArray(obj[e]) ? obj[e].reduce(function(str, f, j) {
return str + e + "=" + encodeURIComponent(f) + (j != obj[e].length - 1 ? "&" : "")
},"") : e + "=" + encodeURIComponent(obj[e]));
},"");
}
var url = "https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest"; // or var url = "https://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest";
var query = {
symbol: crypto,
start: 1,
limit: 5000,
convert: 'EUR'
};
var endpoint = url.addQuery(query); // <--- https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest?symbol=###&start=1&limit=5000&convert=EUR
var response = UrlFetchApp.fetch(endpoint, {headers: {'X-CMC_PRO_API_KEY': 'myapikey', 'Accept': 'application/json'}});
return response.getContentText();
}
- 在此修改后的脚本中,使用最新列表。当您想使用最新报价时,请将URL修改为
var url = "https://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest";
。
注意:
从官方文件中,我认为
data[0].price_eur
可能是undefined
.因为data[0].price_eur
用于api.coinmarketcap.com/v1/ticker
.所以在此示例脚本中,我返回了response.getContentText()
.将=ValueCrypto(A1)
放入单元格时,可以看到返回值。从这个值,你能显示样本结果值和你想要的输出值吗?通过这个,我想修改它。当您的 API 密钥无效时,会发生错误。请小心这一点。
引用:
- 快速入门指南
- 房源最新
- 最新行情
- UrlFetchApp.fetch(url, params)
这些对我有用
function fetchAll() {
const apiKey = 'xxxxxxx-xxxxxxx-xxxxxxx-xxxxxxx-xxx'
fetchCoin({ crypto: "SAFEMOON", fiat: "CAD", firstCell: "B9", apiKey })
fetchCoin({ crypto: "SAFEMOON", fiat: "USD", firstCell: "B8", apiKey })
}
function fetchCoin({ crypto, fiat, firstCell, apiKey }) {
const ascii = firstCell[0].toLowerCase().charCodeAt(0)
try {
var options = {
headers: { 'X-CMC_PRO_API_KEY': apiKey }
}
var url = `https://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest?symbol=${crypto}&convert=${fiat}`
var response = UrlFetchApp.fetch(url, options);
var res = JSON.parse(response);
SpreadsheetApp.getActiveSpreadsheet().getRange(`${String.fromCharCode(ascii - 1)}${firstCell[1]}`).setValue(fiat)
SpreadsheetApp.getActiveSpreadsheet().getRange(`${String.fromCharCode(ascii + 0)}${firstCell[1]}`).setValue(res.data[crypto].quote[fiat].price)
SpreadsheetApp.getActiveSpreadsheet().getRange(`${String.fromCharCode(ascii + 1)}${firstCell[1]}`).setValue(res.data[crypto].quote[fiat].percent_change_1h)
SpreadsheetApp.getActiveSpreadsheet().getRange(`${String.fromCharCode(ascii + 2)}${firstCell[1]}`).setValue(res.data[crypto].quote[fiat].percent_change_24h)
SpreadsheetApp.getActiveSpreadsheet().getRange(`${String.fromCharCode(ascii + 3)}${firstCell[1]}`).setValue(res.data[crypto].quote[fiat].percent_change_7d)
SpreadsheetApp.getActiveSpreadsheet().getRange(`${String.fromCharCode(ascii + 4)}${firstCell[1]}`).setValue(res.data[crypto].quote[fiat].percent_change_30d)
SpreadsheetApp.getActiveSpreadsheet().getRange(`${String.fromCharCode(ascii + 5)}${firstCell[1]}`).setValue(Utilities.formatDate(new Date(res.data[crypto].quote[fiat].last_updated), 'America/New_York', 'MMMM dd, yyyy HH:mm:ss Z'))
Logger.log({ url, ascii,res })
} catch (e) {
SpreadsheetApp.getActiveSpreadsheet().getRange(`${String.fromCharCode(ascii - 1)}${firstCell[1]}`).setValue("")
SpreadsheetApp.getActiveSpreadsheet().getRange(`${String.fromCharCode(ascii + 0)}${firstCell[1]}`).setValue(`Something is broke... ${e.message}`)
SpreadsheetApp.getActiveSpreadsheet().getRange(`${String.fromCharCode(ascii + 1)}${firstCell[1]}`).setValue("")
SpreadsheetApp.getActiveSpreadsheet().getRange(`${String.fromCharCode(ascii + 2)}${firstCell[1]}`).setValue("")
SpreadsheetApp.getActiveSpreadsheet().getRange(`${String.fromCharCode(ascii + 3)}${firstCell[1]}`).setValue("")
SpreadsheetApp.getActiveSpreadsheet().getRange(`${String.fromCharCode(ascii + 4)}${firstCell[1]}`).setValue("")
SpreadsheetApp.getActiveSpreadsheet().getRange(`${String.fromCharCode(ascii + 5)}${firstCell[1]}`).setValue("")
}
}
您可以跳过 API,并在需要价格的单元格中使用此公式:
=IFERROR(INDEX(IMPORTXML(CONCATENATE("https://coinmarketcap.com/currencies/",CELL("contents",A2),"?update="),"//div[contains(@class, 'priceTitle')]"), 1, 1), INDEX(IMPORTXML(CONCATENATE("https://www.coingecko.com/en/coins/",CELL("contents",A2),"?update="),"//span[@data-coin-symbol]//text()"), 1, 1))
单元格 A2 将包含"比特币"或其他一些加密蛞蝓。该公式使用coinmarketcap作为其主要来源,coingecko作为备用来源。如果您希望它自动刷新,可以查看此处:https://stackoverflow.com/a/44170267/10642485