Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Получить строка/столбец "кликнутой" ячейки Гугл-таблицы (https://javascript.ru/forum/events/80418-poluchit-stroka-stolbec-kliknutojj-yachejjki-gugl-tablicy.html)

Андрей_Ко 02.06.2020 13:39

Получить строка/столбец "кликнутой" ячейки Гугл-таблицы
 
Скрипты только постигаю... работал исключительно в VBA...
Пытаюсь наваять "нечто" в Гугл-Таблице. Вопрос - в заголовке темы.
Стырил на каком-то сайте код:
document.querySelector('Prestige').onclick = (event) => {
  let cell = event.target;
  if (cell.tagName.toLowerCase() != 'td')
    return;
  let i = cell.parentNode.rowIndex;
  let j = cell.cellIndex;
 
  console.log(i, j);
}
};

В таблице вставил его в редактор скриптов... и ничего, хоть обкликайся:cray:
А ,если запустить скрипт прямо в редакторе, то он пишет что "документ не определён и указывает на первую строку.
'Prestige' - имя Таблицы

laimas 02.06.2020 13:42

https://learn.javascript.ru/onload-ondomcontentloaded

Андрей_Ко 02.06.2020 15:02

Прочёл ссылку... ешё раз прочёл... интуитивно догадываюсь, что чего-то не дописал? Понять бы только - что?
Если файл(Таблица) открыт на экране, то разве он уже не загружен и событие DOMContentLoaded не произошло? Зачем его специально обрабатывать? (Логика работы в VBA меня всё время сбивает.:-E )

laimas 02.06.2020 15:17

Цитата:

Сообщение от Андрей_Ко
пишет что "документ не определён и указывает на первую строку

То есть, вы обработчик document.querySelector('Prestige').onclick определяете тогда, когда документ еще не загружен и не готов DOM. Поэтому вы и получаете это сообщение об ошибке, так как нет еще элемента 'Prestige', который вы пытаетесь получить. Обработчик нужно устанавливать когда документ загружен и DOM готов, то есть в обработчике события загрузки документа. По ссылке о нем и рассказывается (DOMContentLoaded) и дается код такого обработчика.

PS. Кстати, querySelector(), это получение ссылки на объект по селектору, которым может быть значения: имя тега, атрибута id, или имя класса. То есть в вашем случае, если Prestige, это id, то

document.querySelector('#Prestige')

если имя класса, то

document.querySelector('.Prestige')

а у вас не понять что. Если ваш скрипт размещен, например, в конце страницы, то DOMContentLoaded и не обязателен, и причиной ошибки может быть как раз проблема с некорректным селектором (при этом об этом в ошибке будет сказано). Не заметил я сразу этот ляп, проверьте, что у вас и исправьте.

Андрей_Ко 02.06.2020 17:01

Я пока не понимаю - где размещён мой скрипт? Есть Гугл-таблица, у неё есть Редактор скриптов, вот в нём и лежит скрипт. Интуичу, что все эти td,tr и т.п. мне не нужны, ведь сама страница(собственно таблица) уже сформирована?
Пробую переделать код.
Вариант 1:
function myFunc() {
  function ready(){
  document.querySelector('Prestige').onclick = (event) => {
  let cell = event.target;
  if (cell.tagName.toLowerCase() != 'td')
    return;
  let i = cell.parentNode.rowIndex;
  let j = cell.cellIndex;

    console.log(i, j);
}}};

Ошибка при запуске в Редакторе пропала, но и работать не стало.
Вариант 2:
function myFunc() {
  document.addEventListener("DOMContentLoaded", () => {
  document.querySelector('Prestige').onclick = (event) => {
  let cell = event.target;
  if (cell.tagName.toLowerCase() != 'td')
    return;
  let i = cell.parentNode.rowIndex;
  let j = cell.cellIndex;

    console.log(i, j);
}})};

И опять возникает "документ не определён" во второй строке
Prestige - имя таблицы, пробовал и '#Prestige', и '.Prestige' в Варианте 1 - без толку.

laimas 02.06.2020 17:13

Цитата:

Сообщение от Андрей_Ко
Prestige - имя таблицы

Что значит имя?

Андрей_Ко 02.06.2020 17:19

Google Таблицы, по умолчанию создаётся Новая таблица, я её и переименовал:blink:
ради интереса в строке document.querySelector('Prestige').onclick... менял значение в скобках на любое... а ничего не происходит! В смысле - ошибки не возникает!

laimas 02.06.2020 17:21

<table id="as"> будет найдена по селектору querySelector("#as") - по идентификатору
<table class="as"> будет найдена по селектору querySelector(".as") - по имени класса
<table> будет найдена по селектору querySelector("table") - по имени тега
А querySelector("as") ничего не найдет.

laimas 02.06.2020 17:25

Цитата:

Сообщение от Андрей_Ко
умолчанию создаётся Новая таблица, я её и переименовал

Нет у таблицы атрибута name, в котором можно указать "Новая таблица", хотя пользовательские атрибуты не запрещены. Если Гугл возвращает объект, которому задается "Новая таблица" как, например, ее заголовок, то и бог с ним. Используйте сам объект, которому и назначайте обработчик, querySelector() в этом случае не нужен.

Андрей_Ко 02.06.2020 17:30

:blink: если нет атрибута Name, то где тогда хранится моё название?


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