【问题标题】:Parsing Error trying to import Coinbase Pro API into Google Sheets尝试将 Coinbase Pro API 导入 Google 表格时出现解析错误
【发布时间】:2020-12-01 21:47:39
【问题描述】:

刚接触 Google 表格中的 API,但我觉得自己已经完成了 95% 的目标。

我正在尝试将加密数据提取到我的电子表格中,以进行简单的 24 小时价格比较并衡量价格是上涨还是下跌,也许使用一些条件代码将背景更改为绿色或红色。很简单。不过,大多数提供 API 的网站都给了我各种错误,所以 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,以及该部分中的第一个值,“开盘价”为开盘价(这确保我准确地提前 24 小时获得价格)。但是我在使用请求时遇到了一个奇怪的解析错误,这里是:

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

我已经找到了问题,但没有找到解决方案。谷歌表格说我正在输入文字。因为“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:",""), """", ""))

这会返回一个错误,指出“volume_30day: #}”无法解析,所以现在它是 JSON 代码的右括号。所以我不能使用“打开”API 24hr stats 部分中的第一项或 Volume_30day,这是该列表中的第六项,但项目 2-5 工作得很好。对我来说似乎超级奇怪,但我已经对其进行了测试,这似乎是正在发生的事情。

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

【问题讨论】:

    标签: google-sheets google-sheets-api


    【解决方案1】:

    答案 1:

    关于=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:

    关于=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|""|{|}|:","")),""))))
    

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

    其他模式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";
    

    当您使用此脚本时,请将上述脚本复制并粘贴到电子表格的脚本编辑器中并保存。并且请将=SAMPLE("https://api.pro.coinbase.com/products/ETH-USD/stats","open")=SAMPLE("https://api.gdax.com/products/ETH-USD/ticker","price") 之类的自定义函数放到一个单元格中。这样就可以取回值了。

    参考资料:

    【讨论】:

    • 太棒了,谢谢!这里有用的东西,不能要求更彻底的答案。在你所有的答案之间,我有一些东西可以解决未来的问题。非常感谢!
    • @Morgan Kinney 感谢您的回复。我很高兴你的问题得到了解决。也谢谢你。
    猜你喜欢
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    相关资源
    最近更新 更多