如何从 coinmarketcap 获取谷歌表格上加密货币的当前价格?
Posted
技术标签:
【中文标题】如何从 coinmarketcap 获取谷歌表格上加密货币的当前价格?【英文标题】:How to get the current price of a cryptocurrency on google sheets from coinmarketcap? 【发布时间】:2021-04-08 19:07:36 【问题描述】:在谷歌表格单元格上,我只想使用以下公式获取当前的加密货币价格:
=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”, “错误代码”:1002, "error_message": "API 密钥丢失。", ...(使用 muteHttpExceptions 选项检查完整响应)
【问题讨论】:
你想使用pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest
或https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest
哪个?从你的问题我无法理解你的目标。对此我深表歉意。
【参考方案1】:
您的代码似乎没有使用定义 API 密钥的requestOptions
。尝试像这样将其传递给UrlFetchApp
:
var response = UrlFetchApp.fetch(url, requestOptions);
请参阅UriFetchApp 的文档。
【讨论】:
感谢您的回复,现在错误是 Exception: Request failed for pro-api.coinmarketcap.com returned code 400。截断的服务器响应:"status":"timestamp":"2021-01-02T11: 51:40.775Z","error_code":400,"error_message":"\"symbol\" 的值无效:\"UNDEFINED\"","elapsed":0,"credi... (使用 muteHttpExceptions 选项检查完整回复) 您是否将url
中引用的crypto
设置为有效符号?还是应该将符号作为参数添加到qs:
中? uri
应该设置为什么?
我想通过单元格传递密码:=ValueCrypto(A1)
函数 ValueCrypto(crypto) var url = "pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/…" + crypto; var requestOptions = method: 'GET', uri: 'pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/…', qs: start: 1, limit: 5000, convert: 'EUR' , headers: 'X-CMC_PRO_API_KEY': '' , json :真,gzip:真; var response = UrlFetchApp.fetch(url, requestOptions); var 数据 = JSON.parse(response.getContentText());返回数据[0].price_eur;
设置url='https://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest'
。同时删除start
和limit
。将symbol: 'BTC'
添加到qs
选项字典。【参考方案2】:
修改点:
当我看到CoinMarketCap API的Quick Start Guide的官方文档时,作为示例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'
可以在params
的fetch(url, 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();
在这个修改后的脚本中,使用了最新列表。当您想使用最新报价时,请将网址修改为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 密钥无效时,会发生错误。请注意这一点。
参考资料:
Quick Start Guide Listings Latest Quotes Latest UrlFetchApp.fetch(url, params)【讨论】:
对不起,但仍然错误:异常:请求失败 pro-api.coinmarketcap.com 返回代码 400。截断的服务器响应:"status":"timestamp":"2021-01-03T19:50:46.417Z ","error_code":400,"error_message":"\"symbol\" is not allowed","elapsed":0,"credit_count":0(使用 muteHttpExceptions 选项检查完整响应) @romoleta 感谢您的回复。我带来的不便表示歉意。从你\"symbol\" is not allowed
的报错信息中,发现授权错误被移除了。但是,您的 crypto
的符号:crypto 似乎是无效的。在这种情况下,此修改后的脚本可能与此错误无关。不幸的是,从您的回复中,我无法理解crypto
的价值。我为此道歉。那么你能再次确认你给的crypto
的值吗?顺便说一句,我仍然无法理解您要使用“最新列表”或“最新报价”。这个怎么样?
我尝试了“最新列表”和“最新报价”,我希望加密是一个变量,所以例如我可以在谷歌表格 A 列上写符号,并在列上获取当前价格B 通过公式 =ValueCrypto(A1)
@romoleta 感谢您的回复。关于I would like that crypto is a variable
,我修改后的脚本使用crypto
作为变量。所以当=ValueCrypto(A1)
被放入一个单元格时,“A1”的值被用作crypto
的值。但是从您的回复中,我无法理解单元格“A1”的值?我为此道歉。那么,我能问一下单元格“A1”的值吗?因为您当前的错误消息是\"symbol\" is not allowed
。而且,你能提供你当前的脚本来复制你的问题吗?通过这个,我想尝试了解它。
A1 是空的,因为我在 appscript 编辑器上单击运行时出现错误,所以 A1 未满,我认为变量 crypto 需要立即一个临时符号作为值【参考方案3】:
这些对我有用
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("")
【讨论】:
请解释您的代码是做什么的以及它是如何做到的。以上是关于如何从 coinmarketcap 获取谷歌表格上加密货币的当前价格?的主要内容,如果未能解决你的问题,请参考以下文章