Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Как забрать данные из внешнего js функция({объект}) (https://javascript.ru/forum/events/80172-kak-zabrat-dannye-iz-vneshnego-js-funkciya-%7Bobekt%7D.html)

sovsem-nub 05.05.2020 21:16

Как забрать данные из внешнего js функция({объект})
 
Есть такой такой внешний js в котором запускается функция с объектом


https://docs.google.com/spreadsheets/d/1iwGvYQZYe1oQU1809QG1qqJWUG84gxVLKyqWBWyvDqU/gviz/tq?sheet=goods&tq=where%20B%3D'A04'%20%20OR%20%20B %3D'A03'

google.visualization.Query.setResponse({....как ие-то данные...});

я хочу эти данные забрать и показать в консоли на сайте
<script>
function google.visualization.Query.setResponse(data){ console.log(data)};
</script>
<script  src="https://docs.google.com/spreadsheets/d/1iwGvYQZYe1oQU1809QG1qqJWUG84gxVLKyqWBWyvDqU/gviz/tq?sheet=goods&tq=where%20B%3D'A04'%20%20OR%20%20B%3D'A03'" type="text/javascript"> </script>


почему на мою функцию с точками ругается? нужно что-то еще до этого создать?

Malleys 06.05.2020 01:47

Даже если имя функции будет содержать точку, присланный код не запустится, поскольку в глобальном объекте google должен быть visualization в котором Query в котором метод setResponse.
<pre id="pre">Loading...</pre>
<script>
(async function main() {
	try {
		const response = await fetch("https://docs.google.com/spreadsheets/d/1iwGvYQZYe1oQU1809QG1qqJWUG84gxVLKyqWBWyvDqU/gviz/tq?sheet=goods&tq=where%20B%3D'A04'%20%20OR%20%20B%3D'A03'");
		const text = await response.text();

		const getData = new Function(`return new Promise(setResponse => {
			const google = { visualization: { Query: { setResponse } } };
			${text}
		})`);
		const data = await getData();

		/* вывод в консоль и на страницу */
		console.log(data);
		pre.textContent = JSON.stringify(data, null, "    ");
	} catch(error) {
		pre.textContent = error.message;
		console.error(error);
	}
})();
</script>

Vlasenko Fedor 06.05.2020 03:05

еще вариант
<script>
fetch("https://docs.google.com/spreadsheets/d/1iwGvYQZYe1oQU1809QG1qqJWUG84gxVLKyqWBWyvDqU/gviz/tq?sheet=goods&tq=where%20B%3D'A04'%20%20OR%20%20B%3D'A03'")
    .then(response => response.text())
    .then(text => JSON.parse(text.replace(/^.*\s.*?\((.*)\);/m, '$1')))
    .then(obj => {
        console.log(obj);
        alert(JSON.stringify(obj, null, "    "));
    })
    .catch(e => console.log(e.message));
</script>

sovsem-nub 06.05.2020 09:53

Спасибо большое. А можно сделать то же самое без fetch ?
Я запускаю скрипты с рабочего стола, поэтому браузер ругается на запросы (has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.)

Эта функция с точками может быть callback функцией? JSONP получается, когда функция без точек в названии, а если есть точка, то вылетает ошибка. Как по-нормальному задать такую функцию с точками?
как создать в "объекте google должен быть visualization в котором Query в котором метод setResponse."

рони 06.05.2020 10:47

Цитата:

Сообщение от sovsem-nub
как создать в "объекте google должен быть visualization в котором Query в котором метод setResponse."

строка 9 в коде от Malleys,
Цитата:

Сообщение от sovsem-nub
А можно сделать то же самое без fetch ?

можно с fetch через сервер https://cors-everywhere.glitch.me/https://docs.... (вариант от Malleys)

sovsem-nub 06.05.2020 11:14

Цитата:

Сообщение от рони (Сообщение 523863)
строка 9 в коде от Malleys,

можно с fetch через сервер https://cors-everywhere.glitch.me/https://docs.... (вариант от Malleys)

9-ую строку вставлял. но все равно google is not defined . мне нужно понять. Если есть точки, то простой JSONP невозможен?

Спрашиваю, потому что у гугла есть АПИ, которое собирает данные безо всякого CORS (работает с рабочего стола) но оно огромное и тормознутое. Вместе с собой пакетом заливает кучу непонятных скриптов и CSS которые мне не нужны. Хотел ускорить этот вариант и забирать данные напрямую. cors-everywhere.glitch.me очень тормозит

<script>
var google = { visualization: { Query: { setResponse } } };
function google.visualization.Query.setResponse(data){ console.log(data)};
</script>
<script  src="https://docs.google.com/spreadsheets/d/1iwGvYQZYe1oQU1809QG1qqJWUG84gxVLKyqWBWyvDqU/gviz/tq?sheet=goods&tq=where%20B%3D'A04'%20%20OR%20%20B%3D'A03'" type="text/javascript"> </script>

Vlasenko Fedor 06.05.2020 11:33

<body>
<script>
    const send = msg => {
        let el = document.createElement('script');
        el.src = `https://docs.google.com/spreadsheets/d/1iwGvYQZYe1oQU1809QG1qqJWUG84gxVLKyqWBWyvDqU/gviz/tq?${msg}`;
        document.body.appendChild(el);
    }
    const google = {
        visualization: {
            Query: {
                setResponse: value => {
                    console.log(value)
                }
            }
        }
    }
    send("sheet=goods&tq=where%20B%3D'A04'%20%20OR%20%20B%3D'A03'")
</script>
</body>

как просили JsonP

рони 06.05.2020 11:37

sovsem-nub,
<!doctype html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Document</title>

<script>
function setResponse(data){ console.log(data)};
var google = { visualization: { Query: { setResponse } } };

</script>
<script  src="https://docs.google.com/spreadsheets/d/1iwGvYQZYe1oQU1809QG1qqJWUG84gxVLKyqWBWyvDqU/gviz/tq?sheet=goods&tq=where%20B%3D'A04'%20%20OR%20%20B%3D'A03'" type="text/javascript"> </script>



</head>
<body>

</body>
</html>

sovsem-nub 06.05.2020 13:35

Цитата:

Сообщение от рони (Сообщение 523866)
sovsem-nub,

Офигеть как просто. Спасибо большое. :thanks:


Часовой пояс GMT +3, время: 12:04.