尝试将 Coinbase Pro API 导入 Google 表格时出现解析错误

Parsing Error trying to import Coinbase Pro API into Google Sheets

Google 表格中 API 的新手,但我觉得我已经完成了我想去的地方的 95%。

我正在尝试将加密数据提取到我的电子表格中以进行简单的 24 小时价格比较并衡量价格是上涨还是下跌,也许使用一些条件代码将背景更改为绿色或红色。很简单。不过,大多数提供 APIs 的网站都给了我各种错误,所以 coinbase pro(奇怪的是,已弃用的 gdax)是最可靠的(尽管我没有排除它开始崩溃的可能性,因为我现在提出太多呼叫请求)。

发现这是获取 ETH 当前价格的一种方式,例如:

=VALUE(SUBSTITUTE(SUBSTITUTE(INDEX(IMPORTDATA("https://api.gdax.com/products/ETH-USD/ticker"),0,2), "price:",""), """", ""))

很有魅力。因此,我更改了针对不同信息的请求,特别是 24hr stats listed on the API doc,以及该部分中的第一个值,“open”表示开盘价(这确保我准确地提前 24 小时获得价格)。但是我在使用请求时遇到了一个奇怪的解析错误,它在这里:

=VALUE(SUBSTITUTE(SUBSTITUTE(INDEX(IMPORTDATA("https://api.pro.coinbase.com/products/ETH-USD/stats"),0,1), "open:",""), """", ""))

我找到了问题,但还没有找到解决方案。 Google 表格说我正在提取文本。因为“open”(开盘价)值是第一个在 JSON 代码中列出的,所以它从嵌套的 HTML/JSON 代码中拉入代码括号。例如,它说我无法将“{open”解析为数字。当我提取统计部分中列出的最后一个值时,我遇到了同样的问题,即“volume_30day:”

=VALUE(SUBSTITUTE(SUBSTITUTE(INDEX(IMPORTDATA("https://api.pro.coinbase.com/products/ETH-USD/stats"),0,6), "volume_30day:",""), """", ""))

这个returns一个错误说“volume_30day:#}”无法解析,所以现在它是JSON代码的右括号。所以我不能使用“打开”API 24 小时统计部分中的第一项,或 Volume_30day,这是该列表中的第六项,但项目 2-5 工作正常。对我来说似乎超级奇怪,但我已经测试过了,这似乎是正在发生的事情。

这里一定有一些愚蠢的东西我需要调整,但我不知道它是什么。

答案 1:

About =VALUE(SUBSTITUTE(SUBSTITUTE(INDEX(IMPORTDATA("https://api.pro.coinbase.com/products/ETH-USD/stats"),0,1), "open:",""), """", ""))

  • 我勾选=SUBSTITUTE(SUBSTITUTE(INDEX(IMPORTDATA("https://api.pro.coinbase.com/products/ETH-USD/stats"),0,1), "open:",""), """", "")时,值为{open:617。我认为当通过这个,当 VALUE 用于值时,会发生错误。

为了取回你期望的值,我建议使用REGEXREPLACE而不是SUBSTITUTE。修改后的公式如下

=VALUE(REGEXREPLACE(INDEX(IMPORTDATA("https://api.pro.coinbase.com/products/ETH-USD/stats"),0,1), "open|""|{|}|:",""))
  • 在此修改后的公式中,open|""|{|}|: 用作正则表达式。这些被替换为 "".
  • 这种情况下,我觉得=VALUE(REGEXEXTRACT(INDEX(IMPORTDATA("https://api.pro.coinbase.com/products/ETH-USD/stats"),0,1), "\d+"))也可以。但是当我想到你的第二个问题时,我认为上面的公式可能会有用。

结果:

答案 2:

About =VALUE(SUBSTITUTE(SUBSTITUTE(INDEX(IMPORTDATA("https://api.pro.coinbase.com/products/ETH-USD/stats"),0,6), "volume_30day:",""), """", ""))

  • 我勾选=SUBSTITUTE(SUBSTITUTE(INDEX(IMPORTDATA("https://api.pro.coinbase.com/products/ETH-USD/stats"),0,6), "volume_30day:",""), """", "")时,值为7101445.64098932}。我认为当通过这个,当 VALUE 用于值时,会发生错误。

为了取回你期望的值,我建议使用REGEXREPLACE而不是SUBSTITUTE。修改后的公式如下

=VALUE(REGEXREPLACE(INDEX(IMPORTDATA("https://api.pro.coinbase.com/products/ETH-USD/stats"),0,6), "volume_30day|""|{|}|:",""))
  • 在此修改后的公式中,volume_30day|""|{|}|: 用作正则表达式。这些被替换为 "".
  • 在此正则表达式中,可以通过将上面正则表达式中的 open|""|{|}|:open 替换为 volume_30day 来使用。

结果:

其他模式1:

作为其他使用内置公式的模式,以下修改公式如何?

=VALUE(TEXTJOIN("",TRUE,ARRAYFORMULA(IFERROR(VALUE(REGEXREPLACE(IMPORTDATA("https://api.pro.coinbase.com/products/ETH-USD/stats"), "open|""|{|}|:","")),""))))

=VALUE(TEXTJOIN("",TRUE,ARRAYFORMULA(IFERROR(VALUE(REGEXREPLACE(IMPORTDATA("https://api.pro.coinbase.com/products/ETH-USD/stats"), "volume_30day|""|{|}|:","")),""))))

在这些公式中,可以通过替换正则表达式的 KEY|""|{|}|:KEY 来检索值。

其他模式2:

https://api.pro.coinbase.com/products/ETH-USD/stats 的返回值是 JSON 值。所以在这种情况下,当 Google Apps Script 创建的自定义函数也可以使用时。

Google Apps脚本如下。

const SAMPLE = (url, key) => JSON.parse(UrlFetchApp.fetch(url).getContentText())[key] || "no value";

当您使用该脚本时,请将上述脚本复制粘贴到Spreadsheet的脚本编辑器中并保存。请将 =SAMPLE("https://api.pro.coinbase.com/products/ETH-USD/stats","open")=SAMPLE("https://api.gdax.com/products/ETH-USD/ticker","price") 等自定义函数放入单元格。通过这个,可以检索该值。

参考文献: