преобразование результата запроса визуализации Google в массив javascript

URL-адрес запрашиваемой электронной таблицы:

docs.google.com/spreadsheets/d/1EIBhBQY1zbdBEKXsJIY1uyvdQw0b1cIBSrBE_tZvA6Y/edit?usp=sharing

Используемый URL-адрес запроса:

https://spreadsheets.google.com/tq?tqx=out:&key=1EIBhBQY1zbdBEKXsJIY1uyvdQw0b1cIBSrBE_tZvA6Y&gid=0&headers=1&tq=select%20B%2CC%2CD%20where%20(A%20matches%20%22DIS%22)

Есть ли способ преобразовать или сохранить этот результат в массиве JavaScript?

var dis = ["The Walt Disney Company","Entertainment",.1]

Мне нужно иметь возможность манипулировать данными в какой-то момент и добавлять новые данные в визуализацию.

Данные из одного из нескольких запросов -> Преобразовать в массив -> Манипулировать данными например: умножение на ввод -> data.addRows (управляемый ввод);


person George    schedule 01.08.2015    source источник
comment
Вы уже пробовали какой-либо реальный код JavaScript, кроме URL-запроса?   -  person dakab    schedule 01.08.2015
comment
да, в настоящее время я использую один запрос для визуализации, но я пытаюсь добавить строки - addRows (); разрешает только массивы для дополнительных входных данных - я пытаюсь добавить данные из нескольких запросов для одной визуализации   -  person George    schedule 02.08.2015


Ответы (4)


Ваш запрос действительно возвращает строку, содержащую JSON, заключенную в вызов функции:

var responseText = 'google.visualization.Query.setResponse({…});';

Это связано с тем, что вы указали out: в качестве аргумента для tqx (см. руководства для разработчиков Google < / а>).

Если вы хотите, чтобы все было необработанным, вы можете извлечь и проанализировать JSON нескольких запросов и _ 4_ данные в массив, так что вы получите массив массивов строковых данных. Для вашего единственного запроса вы можете начать с чего-то вроде этого:

responseJSON = JSON.parse(
responseText.replace(/(^google\.visualization\.Query\.setResponse\(|\);$)/g,'')
);
var rowsArray = [];
responseJSON.table.rows.forEach(function(row){
    var rowArray = [];
    row.c.forEach(function(prop){ rowArray.push(prop.v); });
    rowsArray.push(rowArray);
});
console.log(rowsArray); // ===  [["The Walt Disney Company", "Entertainment", 0.1]]
person dakab    schedule 01.08.2015

Есть более простое решение. В ответ вы получаете строку JSONP, данные которой хранятся в функции обратного вызова, как упоминал @dakab.

Помимо этого, недавно Google включил в ответ дополнительный текст, чтобы помочь с некоторыми средствами защиты своего API от перехвата контента. Вы можете узнать больше об этом в этой ветке Github. . Ответ, который вы получаете сейчас, представляет собой неразборчивую строку в такой форме:

/*O_o*/
google.visualization.Query.setResponse({…});

Один из способов справиться с обеими проблемами (строка «комментарий» и данные, скрытые внутри функции обратного вызова) - это оценить функцию. Независимо от того, рискованно это или нет, это неотъемлемая часть формата JSONP, поэтому вы должны знать, откуда приходит ваш ответ, и решать, стоит ли рисковать. Но, учитывая, что он исходит от запроса к серверу Google, и с точки зрения синтаксического анализа, он работает.

Итак, в вашем случае вы могли бы просто объявить функцию обратного вызова (обратите внимание, что вы можете передать собственное имя функции в строке запроса, как также упоминается в руководства для разработчиков Google), а затем оцените его. Меня вдохновляет эта тема:

//Declare your call back function
function callback(data){
  return data;
}
//Evaluate and store the data in your callback function
var result = eval(UrlFetchApp.fetch(url + uri, options).getContentText());

В «результате» у вас будет уже проанализированный JSON, который вы можете преобразовать во все, что захотите.

person Diego    schedule 09.10.2016

Согласно документации Google по их API визуализации для форматов ответов, вы можете добавить заголовок в свой запрос, который будет возвращать JSON без функции или комментария.

Если вы добавите заголовок с именем X-DataSource-Auth в свой запрос, API визуализации будет отвечать в формате JSON, а не в формате JSONP, который является форматом ответа по умолчанию и включает JSON, заключенный в обработчик функции.

Однако даже при наличии этого заголовка API добавляет к ответу странную строку: )]}', которая, как мне кажется, связана с анализом анти-контента, упомянутым @Diego. Хорошо, Google - даже с токеном OAuth вам действительно нужно это делать?

Итак, чтобы получить фактический JSON в этом ответе, вы можете использовать следующий Javascript, чтобы обойти это. Предположим, что responseBody - это то, что API действительно возвращает вам, и что data хранит нужный вам JSON.

var data = JSON.parse(responseBody.replace(/^\)]\}'\n/, ''));
person ariestav    schedule 01.02.2020

Предполагая, что str - это возвращенный ответ в формате JSONP:

var str = `/*O_o*/
google.visualization.Query.setResponse({"version":"0.6","reqId":"0","status":"ok","sig":"403123069","table":{"cols":[{"id":"A","label":"Timestamp","type":"datetime","pattern":"dd/MM/yyyy HH:mm:ss"},{"id":"B","label":"AskGod Search Query","type":"string"}],"rows":[{"c":[{"v":"Date(2020,9,25,12,30,5)","f":"25/10/2020 12:30:05"},{"v":"لا أعرف لماذا"}]}],"parsedNumHeaders":1}});`

console.log(JSON.parse(str.match(/(?<=.*\().*(?=\);)/s)[0]))

person Community    schedule 28.10.2020