Как изолировать выполнение скриптов, чтобы они не мешали друг другу?
Есть такой код, он забирает данные из гугл таблички из кажой вкладки по очереди.
Для этого через document.head.appendChild(script2) в документ одновременно подгружаются три скрипта (по количеству вкладок), котрые тут же выполняются и через по сути JSONP загружаются данные. Но проблема в том, что я не знаю какая вкладка грузится в данный момент, а мне нужно в зависимости от названия вкладки модифицировать заливаемые данные. Код ниже работает случайным образом. Иногда попадает "images это вкладка IMAGES" иногда нет. Нужно, чтобы попадало всегда.
<div id="test"></div>
<div id="test2"></div>
<script>
var idfromURL="16gDZVsB8FOIxrsFKbkbBNWC37lPUAfKOGf-rCVxeOmY";
var sheetsWeNeed =["parts","system","images"];
var dataURL=" ";
for (var im=0; im<sheetsWeNeed.length; im++) {
dataURL = "https://spreadsheets.google.com/tq?key="+idfromURL+"&sheet="+sheetsWeNeed[im]+"&headers=1";
var script2 = document.createElement('script');
script2.src = dataURL;
document.head.appendChild(script2);
var arrObjectsGoogle = [];
var ii=-1;
var google = { visualization: { Query: { setResponse:function setResponse(data){
ii=ii+1;
var fields = Object.create(null);
for (var il=0; il<data.table.rows.length; il++) {
for (var ik=0; ik<data.table.cols.length; ik++) {
if(data.table.rows[il].c[ik]!=undefined && data.table.rows[il].c[ik].v!=null ){
document.getElementById('test2').innerHTML=(sheetsWeNeed[ii]+" "+data.table.cols[ik].label +" __ " +data.table.rows[il].c[ik].v)
}
}
}
}
} } } }
</script>
|
Цитата:
https://learn.javascript.ru/promise-basics#loadscript Тогда ты сам сможешь управлять их последовательностью выполнения, строя цепочки https://learn.javascript.ru/promise-...mer-loadscript Или используя async/await https://learn.javascript.ru/async-await |
Цитата:
Нашел в старой ветке пример с fetch он вроде как работает, но если делать по первому варианту без fetch, то внутрь гугл фунции невозможно передать что-то (например название вкладки). от fetch нужно как-то избавиться, чтобы можно было запускать скрипт с рабочего стола...
<div id="test"></div>
<div id="test2"></div>
<script>
(async function main() {
try {
var idfromURL="16gDZVsB8FOIxrsFKbkbBNWC37lPUAfKOGf-rCVxeOmY";
var sheetsWeNeed =["system","parts","goods","images","GD-images"];
var dataURL=" ";
for (var im=0; im<sheetsWeNeed.length; im++) {
const response = await fetch("https://docs.google.com/spreadsheets/d/16gDZVsB8FOIxrsFKbkbBNWC37lPUAfKOGf-rCVxeOmY/gviz/tq?sheet="+sheetsWeNeed[im]+"&headers=1");
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.table.cols);
for (var il=0; il<data.table.rows.length; il++) {
var fields = Object.create(null);
for (var ik=0; ik<data.table.cols.length; ik++) {
if(data.table.rows[il].c[ik]!=undefined && data.table.rows[il].c[ik].v!=null ){
if(data.table.cols[ik].label=="id"){data.table.cols[ik].label="title"}
if(data.table.cols[ik].label=="name"){data.table.cols[ik].label="caption"}
if(sheetsWeNeed[im]=="images" || sheetsWeNeed[im]=="GD-images" ){ fields.type="image/jpeg" }
if( sheetsWeNeed[im]=="GD-images" ){ data.table.rows[il].c[ik].v="https://drive.google.com/uc?export=download&confirm=no_antivirus&id="+data.table.rows[il].c[ik].v }
if(data.table.cols[ik].label=="tags" && sheetsWeNeed[im]=="parts"){data.table.rows[il].c[ik].v=data.table.rows[il].c[ik].v+" $:/TOC"}
if(data.table.cols[ik].label=="tags" && sheetsWeNeed[im]=="goods"){data.table.rows[il].c[ik].v=data.table.rows[il].c[ik].v+" $:/Note"}
//console.log(currSheet);
//fields[data.table.cols[ik].label]=data.table.rows[il].c[ik].v;
document.getElementById('test2').innerHTML=(sheetsWeNeed[im]+" "+data.table.cols[ik].label +" __ " +data.table.rows[il].c[ik].v)
}
//if($tw.browser) {$tw.wiki.addTiddler(new $tw.Tiddler($tw.wiki.getModificationFields(),fields,$tw.wiki.getCreationFields()))};
}
}
// pre.textContent = JSON.stringify(data, null, " ");
}} catch(error) {
//pre.textContent = error.message;
console.error(error);
}
})();
</script>
|
Цитата:
Ты будешь получать управление "по порядку", а вот порядок уже сможешь определять сам. |
В порядке бреда
<div id="test"></div>
<div id="test2"></div>
<script>
var idfromURL="16gDZVsB8FOIxrsFKbkbBNWC37lPUAfKOGf-rCVxeOmY";
var sheetsWeNeed =["parts","system","images"];
var dataURL=" ";
function loadScript (src) {
let scr = document.createElement ('script')
scr.src = src;
document.head.appendChild(scr)
}
function response(data, sheet){
ii=ii+1;
var fields = Object.create(null);
for (var il=0; il<data.table.rows.length; il++) {
for (var ik=0; ik<data.table.cols.length; ik++) {
if(data.table.rows[il].c[ik]!=undefined && data.table.rows[il].c[ik].v!=null ){
document.getElementById('test2').innerHTML=(sheet+" "+data.table.cols[ik].label +" __ " +data.table.rows[il].c[ik].v)
}
}
}
}
var google = {
visualization: {
Query: {
setResponse: function (data) {
try {
let e = new Error()
e.data = data;
throw e;
} catch (e) {
let nb = e.stack.indexOf('&sheet=')
if (nb>=0) {
ne = e.stack.indexOf('&', nb+7)
if (ne>=0) {
let sheet = e.stack.slice (nb+7, ne)
console.log(sheet, e.data)
response (e.data, sheet)
}
}
}
}
}
}
}
for (let im=0; im<sheetsWeNeed.length; im++) {
dataURL = "https://spreadsheets.google.com/tq?key="+idfromURL+"&sheet="+sheetsWeNeed[im]+"&headers=1";
var arrObjectsGoogle = [];
var ii=-1;
loadScript(dataURL)
}
</script>
|
voraa,
спасибо, не знал, что можно получить название листа из url скрипта let nb = e.stack.indexOf('&sheet=') |
Цитата:
когда указан неправильный idfromURL="16gDZVsB8FOIxrsFKbkbBNWC37lPUAfKOGf-rCVxXXXXX" ничего не происходит а в консоли появляется красная ошибка GET как тут https://heeg.ru/shop2_2.html?id=1gtS...9CQHxLsE#index как эту ошибку вывести в alert. пробовал try-catch ничего не меняется. |
Цитата:
function loadScript (src) { let scr = document.createElement ('script') scr.src = src; scr.onerror = function(){alert('таблица не существует')}; document.head.appendChild(scr) } |
код не работает на айфоне помогите
Помогите пожалуйста код voraa не работает на айфонах
почему понять не могу. Открыл эту тему через iPhone и в окошке с моим кодом (начало темы) появляется текст. у кода voraa остается пустое окошко. Помогите пожалуйста переделать его код. |
А не работает, потому что iPhone считает переменную nb равной - 1 хотя саму строчку для поиска названия листа он видит правильно.
Как его заставить понять? |
Цитата:
let nb = e.stack.indexOf('&sheet=') Я все таки подозреваю, что в iOs эта строка какая то другая, и сделать с этим тогда ничего нельзя. |
Оказывается сочетание &sheet= не находилось в строке, так как в айфоне этот кусок пишется ?sheet=
Мдааа... |
| Часовой пояс GMT +3, время: 11:56. |