Как разобрать в Google Sheets вложенную структуру JSON с запасным вариантом, когда данные недоступны? - PullRequest
0 голосов
/ 25 февраля 2019

Я получаю данные Yahoo Finance в виде файла JSON (через python API YahooFinancials), и я хотел бы иметь возможность разумно анализировать данные для подачи в Google Sheet.

Для этогоНапример, я заинтересован в получении переменной «cash» под вложенной структурой «date».Но, как вы увидите, иногда нет переменной «cash» под первой датой, поэтому я бы хотел, чтобы скрипт / формула перешел и получил переменную «cash», которая находится под структурой второй даты.

Вот пример 1 кода JSON:

{ "balanceSheetHistoryQuarterly": {
        "ABBV": [
            {
                "2018-12-31": {
                    "totalStockholderEquity": -2921000000,
                    "netTangibleAssets": -45264000000
                }
            },
            {
                "2018-09-30": {
                    "intangibleAssets": 26625000000,
                    "capitalSurplus": 14680000000,
                    "totalLiab": 69085000000,
                    "totalStockholderEquity": -2921000000,
                    "otherCurrentLiab": 378000000,
                    "totalAssets": 66164000000,
                    "commonStock": 18000000,
                    "otherCurrentAssets": 112000000,
                    "retainedEarnings": 6789000000,
                    "otherLiab": 16511000000,
                    "goodWill": 15718000000,
                    "treasuryStock": -24408000000,
                    "otherAssets": 943000000,
                    "cash": 8015000000,
                    "totalCurrentLiabilities": 15387000000,
                    "shortLongTermDebt": 1026000000,
                    "otherStockholderEquity": -2559000000,
                    "propertyPlantEquipment": 2950000000,
                    "totalCurrentAssets": 18465000000,
                    "longTermInvestments": 1463000000,
                    "netTangibleAssets": -45264000000,
                    "shortTermInvestments": 770000000,
                    "netReceivables": 5780000000,
                    "longTermDebt": 37187000000,
                    "inventory": 1786000000,
                    "accountsPayable": 10981000000
                }
            },
            {
                "2018-06-30": {
                    "intangibleAssets": 26903000000,
                    "capitalSurplus": 14596000000,
                    "totalLiab": 65016000000,
                    "totalStockholderEquity": -3375000000,
                    "otherCurrentLiab": 350000000,
                    "totalAssets": 61641000000,
                    "commonStock": 18000000,
                    "otherCurrentAssets": 128000000,
                    "retainedEarnings": 5495000000,
                    "otherLiab": 16576000000,
                    "goodWill": 15692000000,
                    "treasuryStock": -23484000000,
                    "otherAssets": 909000000,
                    "cash": 3547000000,
                    "totalCurrentLiabilities": 17224000000,
                    "shortLongTermDebt": 3026000000,
                    "otherStockholderEquity": -2639000000,
                    "propertyPlantEquipment": 2787000000,
                    "totalCurrentAssets": 13845000000,
                    "longTermInvestments": 1505000000,
                    "netTangibleAssets": -45970000000,
                    "shortTermInvestments": 196000000,
                    "netReceivables": 5793000000,
                    "longTermDebt": 31216000000,
                    "inventory": 1580000000,
                    "accountsPayable": 10337000000
                }
            },
            {
                "2018-03-31": {
                    "intangibleAssets": 27230000000,
                    "capitalSurplus": 14519000000,
                    "totalLiab": 65789000000,
                    "totalStockholderEquity": 3553000000,
                    "otherCurrentLiab": 125000000,
                    "totalAssets": 69342000000,
                    "commonStock": 18000000,
                    "otherCurrentAssets": 17000000,
                    "retainedEarnings": 4977000000,
                    "otherLiab": 17250000000,
                    "goodWill": 15880000000,
                    "treasuryStock": -15961000000,
                    "otherAssets": 903000000,
                    "cash": 9007000000,
                    "totalCurrentLiabilities": 17058000000,
                    "shortLongTermDebt": 6024000000,
                    "otherStockholderEquity": -2630000000,
                    "propertyPlantEquipment": 2828000000,
                    "totalCurrentAssets": 20444000000,
                    "longTermInvestments": 2057000000,
                    "netTangibleAssets": -39557000000,
                    "shortTermInvestments": 467000000,
                    "netReceivables": 5841000000,
                    "longTermDebt": 31481000000,
                    "inventory": 1738000000,
                    "accountsPayable": 10542000000
                }
            }
        ]
}
}

Структура первой даты (под 2018-12-31) не содержит переменную cash.Поэтому я бы хотел, чтобы в Google лист и те же данные шли в 2018-09-30, а если нет, то и в 2018-06-30.ИЛИ просто просканируйте даты вложенных структур и извлеките первое найденное «денежное» вхождение.

По сути, я хотел бы знать, как пропустить имя переменной даты (т.е. 201-12-12-31) какэто на самом деле не имеет значения, и просто заставьте формулу искать первую доступную переменную «cash».

Основные вопросы, резюмируя

  • Как пропустить упоминание точного имени вложенного уровня исканировать что внутри?
  • Как продолжать сканирование, пока не найдете нужную переменную со значением, которое не является «нулевым» (это может произойти)?
  • Какая будет вся формула для достижения следующей логики: СканированиеJSON-файл до тех пор, пока вы не найдете значение>, если значение не найдено, откат к этой функции IMPORTXML, которая вызывает внешний API.

Дайте мне знать, если вам нужно больше контекста о проблеме, и спасибо заранее заваша помощь:)

РЕДАКТИРОВАТЬ: это формула IMPORTJSON, которую я сейчас использую в ячейке таблицы.

=ImportJSON("https://api.myjson.com/bins/8mxvi", "/financial/balanceSheetHistoryQuarterly/ABBV/2018-31-12/cash", "noHeaders")

Очевидно, что эта возвращает ошибку, поскольку ничего нетпод этой датой.JSON также является действующей ссылкой, которую я использую только сейчас.

screenshot of the Google Sheet

1 Ответ

0 голосов
/ 25 февраля 2019
=REGEXEXTRACT(FILTER(
 TRANSPOSE(SPLIT(SUBSTITUTE(A1, ","&CHAR(10), "×"), "×")), 
 ISNUMBER(SEARCH("*"&"cash"&"*",
 TRANSPOSE(SPLIT(SUBSTITUTE(A1, ","&CHAR(10), "×"), "×"))))), ": (.+)")

0


=INDEX(ARRAYFORMULA(SUBSTITUTE(REGEXEXTRACT(FILTER(TRANSPOSE(SPLIT(SUBSTITUTE(
 TRANSPOSE(IMPORTDATA("https://api.myjson.com/bins/8mxvi")), ","&CHAR(10), "×"), "×")), 
 ISNUMBER(SEARCH("*"&"cash"&"*", TRANSPOSE(SPLIT(SUBSTITUTE(
 TRANSPOSE(IMPORTDATA("https://api.myjson.com/bins/8mxvi")), ","&CHAR(10), "×"), "×"))))),
  ":(.+)"), ",", "")), 1, 1)

...