我可以在 LibreOffice Calc 中通过 HTTP 检索和访问简单的 JSON 对象吗?

hip*_*ail 7 import macros api json libreoffice-calc

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

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

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

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

Juh*_*nen 5

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

这显然不是一个真正的解决方案,但目前适用于非常简单的情况:

  1. 使用以下方式向您的 API 发送请求:=WEBSERVICE("http://example.com/v1/stuff")例如。细胞A1
  2. 例如,在单元格 A2 中添加=MID(A1;SEARCH("rootProperty";A1)+2;10)(请记住更改分隔符(在我的例子中为分号)以匹配您在 LibreOffice 中的区域设置)

解释:

  • MID()将从完整响应中获取部分文本
  • SEARCH()将查找给定文本的开始索引,例如。“根属性”
  • +2是开始读取值的偏移量(基本上是子字符串)
  • 10是从找到的文本开头读取多少个字符SEARCH()(在+2偏移之后)

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

{
  "id": 12345678,
  "something": "Example",
  "myThing": "Hello",
  "another": "Not needed"
}
Run Code Online (Sandbox Code Playgroud)

单元格 A2 的公式为:=MID(A1;SEARCH("myThing";A1);13)

该单元格的值是:myThing": "He 这是从您在 中搜索的13第一个字符开始的字符。myThingSEARCH()

所以显然你不想参与myThing": "其中。Hello要仅获取的值myThing,您可以使用以下公式:=MID(A1;SEARCH("myThing";A1)+11;5)

这会:

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

当然,它仍然是相当手动的,但至少是一种简单的可行方法。祝你好运!


小智 4

我发现最简单的方法是使用 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
Run Code Online (Sandbox Code Playgroud)

对于货币对,我想要以美元为单位的 BTC 值,因此将替换为BTC-USD

JSON 响应

GET https://api.coinbase.com/v2/prices/:currency_pair/spot
Run Code Online (Sandbox Code Playgroud)

使用两个单元

在A1中:

=GET("https://api.coinbase.com/v2/prices/BTC-USD/spot")
Run Code Online (Sandbox Code Playgroud)

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

=PARSEJSON(A1, "data.amount")
Run Code Online (Sandbox Code Playgroud)

内容如下:

23966.93
Run Code Online (Sandbox Code Playgroud)

使用一个电池

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

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

格式化

JSON 响应传递一个字符串值,该值包装在一个函数中,因此您无法使用该单元格中的任何选项来格式化它的货币或数字。

不过,我仍然希望在电子表格中在其前面添加“$”,因此我们可以连接字符串来添加此前缀,我们的结果函数如下所示:

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

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