Как исправить импорт JSON, когда в ответе несколько массивов? - PullRequest
1 голос
/ 14 июля 2020

Я использую сценарий Import JSON для Google Таблиц, чтобы получать данные из Semru sh API . Import JSON отлично работает с ответами, содержащими один массив. Однако API-интерфейс Semru sh возвращает несколько элементов с разным уровнем вложенности в одном ответе, что портит результаты и заставляет меня добавлять несколько запросов API для получения сведений об одном из массивов. Что, в конце концов, увеличивает затраты.

Вот пример ответа, который я получаю:

{ "total": "29", "state": "0", "data": { "0": { "Dt": "20200614", "Vi": 1653000, "Vr": 4.324900, "Av": 73.428571, "Tr": 2.114600, "Tc": 10.410500 }, "1": { "Dt": "20200615", "Vi": 1675800, "Vr": 4.384600, "Av": 71.428571, "Tr": 2.209800, "Tc": 10.791000 }, "2": { "Dt": "20200616", "Vi": 1650300, "Vr": 4.317800, "Av": 72.352381, "Tr": 2.179500, "Tc": 10.675800 }, "3": { "Dt": "20200617", "Vi": 1651200, "Vr": 4.320200, "Av": 71.723810, "Tr": 2.197900, "Tc": 10.763800 }, "4": { "Dt": "20200618", "Vi": 1634900, "Vr": 4.277600, "Av": 71.666667, "Tr": 2.193400, "Tc": 10.767900 }, "5": { "Dt": "20200619", "Vi": 1641800, "Vr": 4.295600, "Av": 71.761905, "Tr": 2.198800, "Tc": 10.962600 }, "6": { "Dt": "20200620", "Vi": 1570200, "Vr": 4.108300, "Av": 72.371429, "Tr": 2.180600, "Tc": 11.023400 }, "7": { "Dt": "20200621", "Vi": 1670200, "Vr": 4.369900, "Av": 70.771429, "Tr": 2.344200, "Tc": 11.692500 }, "8": { "Dt": "20200622", "Vi": 1642000, "Vr": 4.296100, "Av": 71.571429, "Tr": 2.207300, "Tc": 11.033100 }, "9": { "Dt": "20200623", "Vi": 1562300, "Vr": 4.087600, "Av": 72.619048, "Tr": 2.079900, "Tc": 10.447300 }, "10": { "Dt": "20200624", "Vi": 1462700, "Vr": 3.827000, "Av": 73.904762, "Tr": 1.889200, "Tc": 9.632100 }, "11": { "Dt": "20200625", "Vi": 1519200, "Vr": 3.974800, "Av": 74.171429, "Tr": 1.916900, "Tc": 9.526400 }, "12": { "Dt": "20200626", "Vi": 1532800, "Vr": 4.010400, "Av": 72.514286, "Tr": 1.986100, "Tc": 9.883400 }, "13": { "Dt": "20200627", "Vi": 1562700, "Vr": 4.088600, "Av": 71.914286, "Tr": 1.953700, "Tc": 9.681800 }, "14": { "Dt": "20200628", "Vi": 1597500, "Vr": 4.179700, "Av": 71.685714, "Tr": 2.052800, "Tc": 10.228700 }, "15": { "Dt": "20200629", "Vi": 1596000, "Vr": 4.175800, "Av": 71.542857, "Tr": 2.122200, "Tc": 10.527300 }, "16": { "Dt": "20200630", "Vi": 1591000, "Vr": 4.162700, "Av": 72.295238, "Tr": 2.097000, "Tc": 10.457600 }, "17": { "Dt": "20200701", "Vi": 1589100, "Vr": 4.157700, "Av": 71.647619, "Tr": 2.062500, "Tc": 10.066900 }, "18": { "Dt": "20200702", "Vi": 1581700, "Vr": 4.138400, "Av": 72.066667, "Tr": 2.093000, "Tc": 10.365100 }, "19": { "Dt": "20200703", "Vi": 1619300, "Vr": 4.236700, "Av": 71.704762, "Tr": 2.179100, "Tc": 10.612600 }, "20": { "Dt": "20200704", "Vi": 1657200, "Vr": 4.335900, "Av": 70.923810, "Tr": 2.202100, "Tc": 10.588400 }, "21": { "Dt": "20200705", "Vi": 1663800, "Vr": 4.353200, "Av": 71.390476, "Tr": 2.216700, "Tc": 10.664500 }, "22": { "Dt": "20200706", "Vi": 1673300, "Vr": 4.378000, "Av": 71.219048, "Tr": 2.220300, "Tc": 10.712800 }, "23": { "Dt": "20200707", "Vi": 1631200, "Vr": 4.267900, "Av": 71.533333, "Tr": 2.199600, "Tc": 10.583900 }, "24": { "Dt": "20200708", "Vi": 1634100, "Vr": 4.275500, "Av": 71.361905, "Tr": 2.181500, "Tc": 10.534000 }, "25": { "Dt": "20200709", "Vi": 1642300, "Vr": 4.296900, "Av": 70.580952, "Tr": 2.118400, "Tc": 10.245100 }, "26": { "Dt": "20200710", "Vi": 1680800, "Vr": 4.397600, "Av": 70.504762, "Tr": 2.191700, "Tc": 10.716200 }, "27": { "Dt": "20200711", "Vi": 1628100, "Vr": 4.259800, "Av": 71.314286, "Tr": 2.138100, "Tc": 10.466500 }, "28": { "Dt": "20200712", "Vi": 1670600, "Vr": 4.371000, "Av": 72.104762, "Tr": 2.153400, "Tc": 10.434300 } }, "server": "F-Gl", "exec_time": 0.25903199999999998 }

Он содержит несколько элементов, из которых мне нужны только элементы внутри «данных»: скриншот

Чтобы получить элементы вручную, мне нужно несколько раз использовать формулу:

=importjson("url","/data/0")
=importjson("url","/data/1")
=importjson("url","/data/2")

Если бы я использовал стандартную функцию IMPORT XML, я бы пропустил элемент числа в xpath, чтобы получить такие дочерние элементы:

=importxml("url","/data//Dt")

Но с Import JSON это не работает.

Может ли кто-нибудь посоветовать, как исправить Импортировать сценарий JSON, чтобы можно было решить эту проблему с несколькими ответами?

1 Ответ

0 голосов
/ 15 июля 2020

К сожалению, мне не удалось найти варианты помещения вложенного объекта JSON в качестве таблицы для импорта Json. Итак, как обходной путь, как насчет использования указанной c специальной формулы для URL?

Пример сценария:

Скопируйте и вставьте следующий сценарий в редактор сценариев электронной таблицы и сохраните это.

function CUSTOMFORMULA(url) {
  const res = UrlFetchApp.fetch(url).getContentText();
  const obj = JSON.parse(res);
  const ar = Object.values(obj.data);
  const headers = Object.keys(ar[0]);
  const values = ar.map(e => headers.map(f => e[f]));
  values.unshift(headers);
  return values;
}
  • При использовании этого скрипта, пожалуйста, поместите =CUSTOMFORMULA("###URL###") в ячейку. Таким образом можно получить следующий результат.
Результат:

enter image description here

Reference:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...