示例:获取当前比特币现货价格

示例:获取当前比特币现货价格

我找到了一个想要从 LibreOffice Calc 访问的 Web API 资源。

它返回一个简单的 JSON/JavaScript 对象,该对象基本上只是少数几个名称值对,我想要将其中一个取出并放入单元格中。

我懂编程,但几乎没用过电子表格。通过谷歌搜索,我仍然不知道应该使用哪种编程语言,以及我是否需要任何外部插件或只是 LibreOffice 内置的功能。

(如果决定这个问题确实属于 StackOverflow,我很乐意将其迁移到该问题。)

答案1

我发现最简单的方法是使用 LibreOffice 的 GetRest 插件。

您可以使用单独的单元格,一个用于提取数据,一个用于格式化数据,等等。但是,通过组合函数(或创建宏),您可以在单个单元格中实现相当多的格式化。

示例:获取当前比特币现货价格

为此,我将使用 Coinbase API,他们的许多调用不需要身份验证。

https://developers.coinbase.com/api/v2#get-spot-price

  1. 下载并安装插件。您将获得两个新功能:
  • GET()接受 API 端点作为参数
  • PARSEJSON()它接受两个参数:
    1. JSON 源。这可以是任何本地或在线文件,只要它是正确的 JSON。我们将使用输出GET()
    2. 指向您想要的特定值的 JSON 文件的结构/层次结构。

HTTP 请求

GET https://api.coinbase.com/v2/prices/:currency_pair/spot

对于 currency_pair,我想要以美元表示的 BTC 值,因此它将被替换为BTC-USD

JSON 响应

{
  "data": {
    "amount": "1015.00",
    "currency": "USD"
  }
}

使用两个单元格

在 A1 中:

=GET("https://api.coinbase.com/v2/prices/BTC-USD/spot")

在 A2 中,解析 JSON 响应。解析在对象名称级别进行,以句点分隔。这将作为参数以两种方式之一传递给函数,如果 JSON 包含数组,我们将数组的名称和对象索引指定为arrayName.get(i).objectName。我们的示例只是一个有两"key":"value"对的对象,因此格式为objectName.keyName

=PARSEJSON(A1, "data.amount")

内容如下:

23966.93

使用一个单元格

方法本质上是相同的,但是我们不是将单元格作为第一个参数传递,而是传递整个GET()函数:

=PARSEJSON(GET("https://api.coinbase.com/v2/prices/BTC-USD/spot"), "data.amount")

格式化

JSON 响应传递一个字符串值,该值包装在一个函数中,因此您无法使用任何选项在那个细胞内将其格式化为货币或数字。

但是我仍然希望我的电子表格前面有“$”,所以我们可以连接字符串来添加这个前缀,我们的结果函数如下所示:

=CONCAT("$",PARSEJSON(GET("https://api.coinbase.com/v2/prices/BTC-USD/spot"), "data.amount"))

这适合一个单元格,可以通过按 F9 进行更新(请注意,每次刷新开放 API 端点都会占用部分服务器带宽,因此请尝试限制刷新次数。如果您可以重复使用单元格而不必创建另一个调用,那就更加体贴了。)

答案2

四年过去了,他们仍然没有实施该建议FILTERJSON()

这显然不是一个真正的解决方案,但对于非常简单的情况来说,它是目前可行的:

  1. 使用以下方式向您的 API 发送请求:=WEBSERVICE("http://example.com/v1/stuff")例如单元格 A1
  2. 例如,在单元格 A2 中添加=MID(A1;SEARCH("rootProperty";A1)+2;10)(记得更改分隔符(在我的情况下是分号)以匹配 LibreOffice 中的语言环境)

解释:

  • MID()将从完整回复中截取部分文本
  • SEARCH()将查找给定文本的起始索引,例如“rootProperty”
  • +2是开始读取值的偏移量(基本上是子字符串)
  • 10是从找到的文本开头读取的字符数SEARCH()+2偏移量之后)

例如,如果您在单元格 A1 中收到以下响应:

{
  "id": 12345678,
  "something": "Example",
  "myThing": "Hello",
  "another": "Not needed"
}

单元格 A2 有以下公式:=MID(A1;SEARCH("myThing";A1);13)

该单元格的值是:myThing": "He13从 中第一个字符开始的myThing、您在 中搜索的字符SEARCH()

因此,您显然不希望拥有其中的一部分。若要仅获取的myThing": "值,则可以使用以下公式:。HellomyThing=MID(A1;SEARCH("myThing";A1)+11;5)

这会:

  1. 查找myThing开始的位置(警告:如果字符串有两个实例,则将获得第一个)
  2. 返回偏移量处的 5 个字符。因此:myThi
  3. 然后从索引开始偏移11+11公式中的)
  4. 因此它跳过前 11 个字符(myThing": ")并从那里返回 5 个字符,即Hello

当然,这仍然是相当手动的,但至少对于简单的事情来说这是一种可行的方法。祝你好运!

答案3

最好在 StackOverflow 上提问,但是是的,您可以使用 Python 检索和访问/转换 JSON 对象,这与 LibreOffice Calc 配合得很好。您可以双向解决问题,要么使用 Python 来控制 LibreOffice,要么让 LibreOffice 运行 Python 脚本,这取决于您的需要。

至于将 JSON 转换为 LibreOffice 可以使用的内容 (csv),这里有一个很好的初学者解释应用信息学

答案4

增强@sentientflesh 的答案:

GetRest 插件可以在这里下载: https://gist.github.com/ThomasG77/4ed97370af8355feabf50cb2909198a0#file-libreofficegetrestplugin-oxt

它仍然可以与 LibreOffice Calc v.7.1 一起使用 get 和 parsejson 函数,如下所述: https://extensions.libreoffice.org/en/extensions/show/libreoffice-getrest-plugin-1

相关内容