Могу ли я получить и получить доступ к простому объекту JSON через HTTP в LibreOffice Calc?
Я нашел ресурс веб-API, доступ к которому я хотел бы получить из LibreOffice Calc.
Он возвращает простой объект JSON/JavaScript, который представляет собой всего лишь несколько пар имя-значение, одну из которых я хочу вытащить и поместить в ячейку.
Я знаю программирование, но почти никогда не использовал электронные таблицы. От Googling я до сих пор не могу сказать, какой язык программирования я должен использовать для этого и понадобятся ли мне какие-либо внешние дополнения или только функции, встроенные в LibreOffice.
(Я рад перенести этот вопрос в StackOverflow, если будет решено, что он действительно принадлежит.)
5 ответов
Спустя 4 года они все еще не реализовали предложенный
FILTERJSON()
.
Очевидно, это не настоящее решение, но оно работает на данный момент для очень простых случаев:
- Отправьте запрос в свой API, используя:
=WEBSERVICE("http://example.com/v1/stuff")
в напр. ячейка A1 - Например, в ячейке 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": "He
Который
13
символы, начиная с первого символа в
myThing
, что вы искали в
SEARCH()
.
Итак, очевидно, что вы не хотели бы иметь
myThing": "
Часть этого. Чтобы получить только ценность
Hello
из
myThing
, вы должны использовать эту формулу:
=MID(A1;SEARCH("myThing";A1)+11;5)
.
Это будет:
- Найти где
myThing
начинается (предостережение: если есть два экземпляра строки, вы получите первый) - Вернуть 5 символов из смещения. Так:
myThi
- Затем смещает начало от индекса
11
(в+11
в формуле) - Таким образом, он пропускает первые 11 символов (
myThing": "
) и возвращает 5 символов оттуда, что являетсяHello
Конечно, это все еще довольно ручной, но по крайней мере один работоспособный способ для простых вещей. Удачи!
Я нашел самый простой способ — использовать плагин GetRest для LibreOffice.
Вы можете использовать отдельные ячейки: одну для извлечения данных, другую для их форматирования и т. д. Однако, комбинируя функции (или создавая макрос), вы можете добиться достаточного форматирования в одной ячейке.
Пример: получение текущей спотовой цены биткойнов
Для этого я буду использовать Coinbase API, многие из их вызовов не требуют аутентификации.
- Загрузите и установите плагин. У вас появятся две новые функции:
- который принимает конечную точку API в качестве аргумента
-
PARSEJSON()
который принимает два аргумента:- Источник JSON. Это может быть любой локальный или онлайн-файл, если он соответствует формату JSON. Мы будем использовать вывод.
- Структура/иерархия файла JSON, указывающая на нужное вам конкретное значение.
HTTP-запрос
GET https://api.coinbase.com/v2/prices/:currency_pair/spot
Для валюты_пара мне нужна стоимость BTC в долларах США, поэтому она будет заменена наBTC-USD
JSON-ответ
{
"data": {
"amount": "1015.00",
"currency": "USD"
}
}
Использование двух ячеек
В А1:
=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"))
Это вписывается в ячейку Once, ее можно обновить, нажав F9 (помните, что каждое обновление конечной точки открытого API занимает часть пропускной способности сервера, поэтому постарайтесь ограничить количество обновлений. Если вы можете повторно использовать ячейку без необходимости создать еще один звонок, это еще более внимательно.)
Возможно, лучше спросить о StackOverflow, но да, вы можете получить и получить доступ / преобразовать объект JSON с помощью Python, который очень хорошо работает с LibreOffice Calc. Вы можете решить эту проблему в обоих направлениях, используя Python для управления LibreOffice, или же LibreOffice запускает скрипты Python, в зависимости от ваших потребностей.
Что касается преобразования JSON во что-то, что LibreOffice может использовать (csv), в Applied Informatics есть хорошее объяснение для начинающих.
Они действительно открыли вопрос в SO . Есть несколько других идей:
- попробуйте установить этот плагин - который, кажется, не работает - для меня это не сработало
- использовать онлайн-парсер для создания CSV
Усиление ответа @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 .