Google Таблицы
62.9K subscribers
563 photos
201 videos
8 files
947 links
С 2017 года пишем про Google Таблицы и Google Apps Script — с юмором, реальными кейсами и эффективными решениями.

Обучение, заказ услуг, реклама: @namokonov 🍒

Оглавление: goo.gl/HdS2qn

РКН: clck.ru/3F3u9M
Download Telegram
🔥⌨️

1 Нажимаем Ctrl + / (или Справка — Быстрые клавиши, help— Keyboard shortcuts)
2 Активируем "Включить совместимые быстрые клавиши для таблиц" (Enable compatible spreadsheet shortcuts)
3 Наслаждаемся вот этими всеми прелестями:

Ctrl + минус
будет удалять выделенные строки / столбцы
(если выделены не строки/столбцы целиком, то будет контекстное меню с выбором — что удалять)

Ctrl + 9
будет скрывать все выделенные строки (целиком их выделять предварительно не нужны — скроются все строки, в которых выделены ячейки; даже если это несмежные ячейки)

Ctrl + 0
аналогично — скрытие столбцов

Ctrl + 1
для открытия меню "Формат", если привыкли к этому сочетанию в Excel (там оно позволяет не только формат ячеек открыть, но и формат выделенного объекта в диаграмме, например)

Alt + F1
быстрая вставка диаграммы


---
📗 Канал и Чат
📕 Оглавление канала
🏄 Заказ работы у нас
🔥167👎1
Друзья, посмотрите, вдруг вы пропустили что-нибудь полезное:

— СОБИРАТОР 4.0, интерфейс для сбора других Таблиц

🧞‍♂️ПРЕВРАЩАТОР Листа Таблицы в xlsx / pdf / csv

— ОТПРАВЛЯТОР, отправляем ваши отчеты в теле письма по расписанию

— ОТПРАВЛЯТОР 2, создаём из Таблиц PDF и JPG и рассылаем в Телеграм по заданному расписанию

— ДОПУСКАТОР 2, убираем из файлов всех пользователей кроме себя и закрываем доступ по ссылке.

— ЗАМЕНЯТОР, заменяем значения по словарю в выбранных Таблицах

— ЗАКРЫВАТОР, скрипт автоматического закрытия прошедших дней

— ДОСТАВАТОР, берём из кода веб-страниц регуляркой нужное

— Скриптами определяем, когда освободится домен

— Запускаем скрипт по чекбоксу (работает и из мобильной версии Таблиц)

— DRIVE COLUMBUS, смотрим на свой Google Диск и управляем им прямо из Таблицы

— С помощью скрипта даём доступ к другой Таблице, чтобы IMPORTRANGE заработал сразу

— Защищаем скрипты от редактирования

— Регулярный бэкап Таблиц в формате XLSX в телеграм!

— Скрипт. Распознаем текст на изображениях. OCR в Google Docs

— Скрипт onEdit(), реагирующий на изменения и отправляющий письма (или триггер в триггере)
Скрипт, загружаем письма вашего GMAIL-аккаунта в Таблицу

— Важный скрипт. Связанные выпадающие списки из кэша

📗 Канал и Чат
📕 Оглавление канала
🏄 Заказ работы у нас
5🔥1910👍4👎1
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍6🍓1
🧩 Как достать рейтинг товара с сайта через IMPORTXML

Друзья, привет! Некоторые сайты можно парсить прямо из Google Таблиц с помощью IMPORTXML.

Задача
Из страницы:

https://okapteka.ru/moskva/adyenoprosin-susp-ryekt-29mg-10-549226/

нужно достать рейтинг товара (например, 4.82 из 5 звезд).

В коде страницы нужный элемент выглядит так:

<div class="product-reviews__rating">4.82 из 5 звезд</div>


🧠 XPath-запрос
Чтобы достать эти данные, используем XPath:

//div[@class='product-reviews__rating']


Разбираем:
1. // - ищем в любом месте документа
2. div - тип элемента, который ищем
3. [@class='product-reviews__rating'] - фильтруем: берём только те div, где атрибут class равен "product-reviews__rating"

Формула в Google Таблицах

=--SUBSTITUTE(INDEX(
SPLIT(IMPORTXML(A2;"//div[@class='product-reviews__rating']");" ");
1);
".";",")


Формула пошагово:
1. IMPORTXML - тянет содержимое <div> (например, "4.82 из 5 звезд")
2. SPLIT(...;" ") - разбивает по пробелам - {"4.82" \ "из" \ "5" \ "звезд"}
3. INDEX(...;1) - берёт первое значение - "4.82"
4. SUBSTITUTE(...;".";",") - заменяет точку на запятую (для русской локали)
5. VALUE(...) или --(...) - превращает текст "4,82" в число 4,82

📌 В итоге в ячейке вы получите чистое число 4,82, готовое для расчётов, фильтрации и красивых дашбордов.

Задавайте вопросы в нашем чате: @google_spreadsheets_chat
223🔥9👍2👎1
Алиса, извлеки электропочты!

Точнее, =АЛИСАПРО("извлеки электропочты"; A2).

Да, в редакторе таблиц от Яндекс 360 теперь есть такая функция в формулах и доступна всем пользователям.

Если ее не видите — убедитесь, что вы в новой версии редактора — см. переключатель на скриншоте. Вас встретит новость про функцию — см другой скриншот.

Как видно на скриншоте, вполне себе заменяет регулярки с объединением и проверку на пустой результат в одном флаконе.

Или справляется с тем, что решалось через регулярки (в Google Таблицах и новом Excel) или многоэтажные мучения с текстом по столбцам и ПРОСМОТРом в старом Excel.
Можно и не задавать второй аргумент — диапазон. А просто попросить написать формулу:

=АЛИСАПРО("Напиши формулу для вычисления...")

То есть это такая справка/помощь по функциям-формулам прямо на рабочем листе.

Еще до конца года обещают решение с собственной реализацией CRDT (конфликтно-устойчивые реплицируемые типы данных), которое позволит изменить подход к редактированию файлов. Тогда одновременно работать смогут до 400 человек.

А на начало следующего года обещаны десктопные версии Таблиц и Документов. Презентации тоже планируют обновлять (интересно, Алиса сможет и слайды рисовать по запросу?)
🔥18👍75👎1🤡1
🌤 Погода, часть 1. Получаем прогноз в Красной Поляне и записываем в Таблицу

Друзья, привет!
Мы сделали для вас Таблицу со скриптом, который обращается к бесплатному API api.open-meteo.com по введённым координатам и возвращает в Таблицу температуру и осадки на сегодня и завтра.

Делайте копию, ниже разберём, как всё работает.

1. Формируем ссылку запроса
Ссылка выглядит так:

https://api.open-meteo.com/v1/forecast?latitude=43.676932&longitude=40.251855&daily=temperature_2m_max,temperature_2m_min,precipitation_sum&timezone=auto

где
* latitude - широта,
* longitude - долгота места, для которого получаем прогноз.

В примере указаны координаты курорта Красная Поляна.

2. Смотрим на ответ API
Если перейти по ссылке (можете прямо в браузере), API вернёт JSON вроде этого:

{
"latitude": 43.6875,
"longitude": 40.1875,
"generationtime_ms": 0.07867813110351562,
"utc_offset_seconds": 10800,
"timezone": "Europe/Moscow",
"timezone_abbreviation": "GMT+3",
"elevation": 722,
"daily_units":
{
"time": "iso8601",
"temperature_2m_max": "°C",
"temperature_2m_min": "°C",
"precipitation_sum": "mm"
},
"daily":
{
"time": [
"2025-11-01",
"2025-11-02",
"2025-11-03",
"2025-11-04",
"2025-11-05",
"2025-11-06",
"2025-11-07"
],
"temperature_2m_max": [
13,
12.7,
17.1,
18.7,
17.7,
22.6,
23
],
"temperature_2m_min": [
6.6,
5.1,
6.5,
10,
10.5,
11,
17.1
],
"precipitation_sum": [
0,
0,
0,
0,
0,
0,
0
]
}
}


В нём содержится прогноз погоды и осадков на ближайшие 7 дней, включая текущий.

3. Извлекаем нужные данные
* Температура на сегодня

data.daily.temperature_2m_min[0]

data.daily.temperature_2m_max[0]


*Осадки на сегодня

data.daily.precipitation_sum[0]


4. Чтобы извлечь следующие дни
Для завтра используем индекс [1], для послезавтра [2] и так далее.

📢 В следующем посте покажем, как автоматически отправлять прогноз погоды в Telegram-канал.
15👍11🔥5👎1🤡1
🚞Не расписание электричек, но список всех станций "от и до" — формулой

Задача — склеить все значения в заданном диапазоне (задаем начало и конец) в одну текстовую строку.

Как и у любой задачи, вариантов решения всегда много — предлагайте свои! Вот один из:

1 Находим, в каких строках первая и последняя станция — это XMATCH

2 Отправляем найденные номера строк в ИНДЕКСы

3 Превращаем два ИНДЕКСа в ссылки, ставя между ними двоеточие.

4 Склеиваем полученный массив в один текст с помощью JOIN


=JOIN(" - ";
ИНДЕКС(список станций;XMATCH(начальная;список)):ИНДЕКС(список;XMATCH(конечная;список)))


Таблица с примером


📗 Канал и Чат
📕 Оглавление канала
🏄 Заказ работы у нас
👍118🔥5👎1🤡1
Google Таблицы
🌤 Погода, часть 1. Получаем прогноз в Красной Поляне и записываем в Таблицу Друзья, привет! Мы сделали для вас Таблицу со скриптом, который обращается к бесплатному API api.open-meteo.com по введённым координатам и возвращает в Таблицу температуру и осадки…
Погода, часть 2, @ski_weather

Друзья, привет! Мы продолжаем работать с бесплатным погодным API api.open-meteo.com.

С помощью кода в Таблице, которую мы вам приготовили, вы сможете получать данные по погоде в указанных точках (в скрипт передаётся широта и долгота) на сегодня, завтра и послезавтра.

Скрипт группирует данные по каждой точке в одно сообщение и отправляет его с помощью Telegram-бота в ваш телеграм-канал (или чат или в личку).

Что нужно сделать, чтобы повторить всё у себя

1) Делаете копию Таблицы с примером.

2) На листе settings вводите координаты и названия точек.

3) Регистрируете в @BotFather своего Telegram-бота и получаете его токен.

4) Создаёте канал или чат (или используете существующий), добавляете в него бота с правами администратора.

5) Открываете редактор скриптов и заменяете botToken и chat_id для отправки сообщения на свои (как получить chat_id — смотрите на канале).

6) Один раз запускаете функцию main. Если всё работает корректно, ставите её на триггер, например, на ежедневный запуск каждое утро.

Таблица с кодом / Код отдельно (без копирования Таблицы)

🐟 Заказать работу у нас: @namokonov
🔥124👍4👎1🤡1
Переведём \u0411\u0430\u043d\u043a \u0425\u043e\u0440\u043e\u0448\u0438\u0445 \u0418\u0434\u0435\u0439 на читаемый русский 🙂

Друзья, эта строчка - это представление последовательности символов в юникоде.

Unicode - это универсальный стандарт кодировки символов. Он нужен, чтобы одинаково представлять символы, цифры, эмоджи во всех языках и системах.


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

function fromUnicode() {
const unicodeString = "\\u0411\\u0430\\u043d\\u043a \\u0425\\u043e\\u0440\\u043e\\u0448\\u0438\\u0445 \\u0418\\u0434\\u0435\\u0439";
const normalText = unicodeString.replace(/\\u([\dA-F]{4})/gi, (m, g) =>
String.fromCharCode(parseInt(g, 16))
);
console.log(normalText); // Банк Хороших Идей
}


Как это работает:
1) регулярка \\u([\dA-F]{4}) находит все юникод-последовательности.
2) parseInt(g, 16) превращает шестнадцатеричный код в число.
3) String.fromCharCode() превращает число в символ.

Если хочешь наоборот (из кириллицы сделать Unicode):

function toUnicode() {
const text = "Банк Хороших Идей";
const encoded = text.split('').map(ch =>
'\\u' + ('000' + ch.charCodeAt(0).toString(16)).slice(-4)
).join('');
Logger.log(encoded);
// → \u0411\u0430\u043d\u043a \u0425\u043e\u0440\u043e\u0448\u0438\u0445 \u0418\u0434\u0435\u0439
}
3👍2👎1🔥1🤡1
Google Таблицы
Переведём \u0411\u0430\u043d\u043a \u0425\u043e\u0440\u043e\u0448\u0438\u0445 \u0418\u0434\u0435\u0439 на читаемый русский 🙂 Друзья, эта строчка - это представление последовательности символов в юникоде. Unicode - это универсальный стандарт кодировки символов.…
Кто покажет, как перевести строчку юникода \u0411\u0430\u043d\u043a \u0425\u043e\u0440\u043e\u0448\u0438\u0445 \u0418\u0434\u0435\u0439 с помощью формулы в Таблице?

Покажите в комментариях свой вариант :)
👍21👎1🤡1
💬 Вопрос от Туко из нашего чата:
Как добавить к результату QUERY пустую строку — в начало или в конец?

Ответ:
Используем функцию VSTACK, которая объединяет массивы данных вертикально.
Чтобы добавить пустую строку в начало, оставляем первый аргумент пустым, а во втором указываем нашу QUERY.

Если оставить первый диапазон пустым, то в результате появится одна ячейка сверху, а остальные будут заполнены значениями #N/A.
Чтобы убрать #N/A, обернём всё в IFNA без второго аргумента.


=IFNA(VSTACK(; QUERY(A1:B7;"select Col1, sum(Col2) group by Col1";0)))


Чтобы добавить пустую строку в конец - просто поменяйте аргументы VSTACK местами:

=IFNA(VSTACK(QUERY(A1:B7; "select Col1, sum(Col2) group by Col1"; 0); ))


VSTACK и HSTACK — мощные функции для объединения диапазонов.
Если ещё не пробовали — самое время 😊.
6👍4👎1🤡1
Google Таблицы
💬 Вопрос от Туко из нашего чата: Как добавить к результату QUERY пустую строку — в начало или в конец? Ответ: Используем функцию VSTACK, которая объединяет массивы данных вертикально. Чтобы добавить пустую строку в начало, оставляем первый аргумент пустым…
💡 А как вставить пустые столбцы в результат QUERY?

Чтобы вставить пустые столбцы, используйте приём с делением на 0 в SELECT.

Например:

=QUERY(A1:D9;"select 1/0, Col1, 2/0, Col3";1)


Добавив в запрос label для этих столбцов, можно убрать заголовки:

=QUERY(A1:D9;"select 1/0, Col1, 2/0, Col3 label 1/0 '', 2/0 ''";1)


Спасибо Алексею Одиссею из Одессы за идею 🙌
🔥24👎1🤡1
Google Таблицы
💡 А как вставить пустые столбцы в результат QUERY? Чтобы вставить пустые столбцы, используйте приём с делением на 0 в SELECT. Например: =QUERY(A1:D9;"select 1/0, Col1, 2/0, Col3";1) Добавив в запрос label для этих столбцов, можно убрать заголовки: =…
Но вставлять можно не только пустые столбцы

Например, создадим столбец с текстом и текущей датой:

=QUERY(A1:D9;
"select '" & "Отчет " & TEXT(NOW();"dd-mm-yyyy") & "', Col1, 2/0, Col3";
1)
🔥104👎1🤡1
Выводим в одной ячейке список выбранных в фильтре параметров

В примере — выбранные каналы продаж.

Используем, как водится, ПРОМЕЖУТОЧНЫЕ.ИТОГИ (SUBTOTAL), чтобы выявить отображаемые строки. Для этого каждое значение "подсчитываем" этой функцией — она вернет единицу, если значение в моменте отображается (выбрано в фильтре). Дубликаты потом убираем с помощью UNIQUE.


=JOIN("разделитель";UNIQUE(FILTER(столбец;MAP(столбец;lambda(a;SUBTOTAL(103;a)))=1)))


Еще идеи с этой функцией:

Делаем кнопку группировки с интерактивной надписью
Нумеруем только видимые строки


📗 Канал и Чат
📕 Оглавление канала
🏄 Заказ работы у нас
8🔥8👎1🤡1🍓1
Как узнать, что в Таблице удалили строки: готовый скрипт

Друзья, наш подписчик Дмитрий обратился за помощью - у него завёлся сотрудник, который удаляет в таблице строки, нужно как-то про это узнавать.

Мы написали короткий скрипт, он ниже

function onCha(e) {
if (e.changeType != 'REMOVE_ROW') { return; };

const sh = e.source.getActiveSheet();
const shName = sh.getName();
const range = sh.getActiveRange();
const startRow = range.getRow();
const numRows = range.getNumRows();

const msg = `В Таблице, на листе ${shName}, начиная со строки ${startRow} удалено ${numRows} ${plural(numRows)}, примите меры`;

GmailApp.sendEmail('grclubpoker@gmail.com', 'удалены строки', msg);


};

function plural(n) {
const forms = ["строка", "строки", "строк"]
n = Math.abs(n) % 100;
const n1 = n % 10;

if (n > 10 && n < 20) return forms[2];
if (n1 > 1 && n1 < 5) return forms[1];
if (n1 === 1) return forms[0];
return forms[2];
};


При удалении строки скрипт отправит на введённую почту (в примере это grclubpoker@gmail.com) сообщение, как на скриншоте.

Чтобы скрипт заработал:

1) поместите его в редактор скриптов в своей Таблице

2) Кликните на секундомер и откройте триггеры

3) Добавьте триггер: функцию onCha на тип события "Change / При изменении"


Этот устанавливаемый триггер будет реагировать на изменения структуры Таблицы, к ним относится и удалении строк.

А еще в коде функция plural, она склоняет строки в завимости от их количества :)

🐟 Заказать работу у нас: @namokonov
4👍32🔥176👎1🤡1
Если вы очень не любите Excel... и не любите тех, кто там работает...

эта статья для вас! Парочка приемов оттуда в экселе ваших коллег — и вот уже в офис вызывают экзорциста, а все стремительно переходят на Google Таблицы😈

Розыгрыши в Excel: немного табличного хулиганства (и пользы тоже)

При написании статьи ни один офисный сотрудник не пострадал, все тестировалось только на себе и коте Лемуре.


---
📗 Канал и Чат
📕 Оглавление канала
🏄 Заказ работы у нас
👍10🔥6🍓32👎1🤡1
IMPORTRANGE сломался 🚫
Или результат слишком большой или данные не выводятся вообще


Друзья, наверняка вы видели такую или похожую ошибку, когда пытались загрузить слишком большой диапазон данных с помощью IMPORTRANGE.

Иногда и на меньшем объёме данных IMPORTRANGE "ломается" и не выводит результат.

Есть решение: делим IMPORTRANGE на небольшими диапазоны (скажем, по 1000 строк) и соединяем их с помощью фигурных скобо {} или VSTACK.

Получится что-то вроде:

={
IMPORTRANGE(url;"a1:1000");
IMPORTRANGE(url;"a1001:2000");
IMPORTRANGE(url;"a1:1000")
}


Но, если фрагментов много, то писать такую формулу руками неудобно.

Напишем же формулу формулой :)


=let(
_url;"https://docs.google.com/";
_shName;"Лист1";
_step;1000;
_n;25;
_s;SEQUENCE(_n;1;2;_step);

REDUCE(importrange(_url;_shName & "!1:1");_s;

LAMBDA(_acc;_add1; IFNA(VSTACK(_acc;IFERROR(IMPORTRANGE(_url; _shName & "!" & _add1 & ":" & _add1 + _step - 1)))))))


Что здесь происходит?

🔹 SEQUENCE генерирует стартовые строки: 2, 1002, 2002…
🔹 IMPORTRANGE тянет по 1000 строк за раз.
🔹 VSTACK складывает всё друг под другом.
🔹 REDUCE аккуратно объединяет блоки в единую таблицу.
🔹 LET делает формулу читабельной, как будто это вовсе не формула.


Дополнительные материалы:
Большая статья про IMPORTRANGE от нашего маэстро Рената Шагабутдинова

С помощью скрипта даём доступ к Таблицам, чтобы IMPORTRANGE заработал без ручного расшаривания

🐟 Заказать работу у нас: @namokonov
238🔥25👍16🍓3👎1🤡1
Получаем список с отдельными строками для каждой даты каждого этапа — одной формулой

Что тут происходит? Мы задаем функцию f.
На входе она получает один параметр x — в нашей задаче это название этапа.
И делает следующее:
Берет даты на столбец и на два правее от названия этапа (это делает функция СМЕЩ / OFFSET).

Превращает эти даты в последовательность дат от начала и до конца с помощью SEQUENCE. Чтобы не повторять большую конструкцию, называем ее "даты" с помощью функции LET — все это уже внутри нашей "пользовательской" функции f.

SEQUENCE(СМЕЩ(x;0;2)-СМЕЩ(x;0;1)+1;1;СМЕЩ(x;0;1))


Повторяем название этапа с помощью функции MAKEARRAY. Ну а число дат в последовательности считаем через старый добрый СЧЁТ / COUNT.

MAKEARRAY(СЧЁТ(даты);1;LAMBDA(i;j;x))

Соединяем (HSTACK) эти даты с названием этапа, повторенным столько раз, сколько в нем дат:

HSTACK(MAKEARRAY(СЧЁТ(даты);1;LAMBDA(i;j;x));даты))


И далее эту функцию f мы используем. В качестве первоначального аргумента в REDUCE мы отправляем заголовки
{"Название" \ "Дата"}, а далее накапливаем результат: пробегаемся по списку этапов, для каждого получаем таблицу с помощью написанной нами ранее функции f, и добавляем полученные таблицы одна под другой с помощью VSTACK.

REDUCE({"Название" \ "Дата"};Данные[Название]; LAMBDA(acc;val; VSTACK(acc; f(val)))))


Вся формула:

=LET(f; LAMBDA(x; LET(даты; SEQUENCE(СМЕЩ(x;0;2)-СМЕЩ(x;0;1)+1;1;СМЕЩ(x;0;1)); HSTACK(MAKEARRAY(СЧЁТ(даты);1;LAMBDA(i;j;x));даты)));
REDUCE({"Название" \ "Дата"};Данные[Название]; LAMBDA(acc;val; VSTACK(acc; f(val)))))


Альтернативное решение:

=ARRAYFORMULA(SPLIT(TOCOL( MAP(A2:A4;B2:B4;C2:C4;LAMBDA(a;b;c;a & "#" & ТЕКСТ(ТРАНСП( SEQUENCE(c-b + 1;1;b));"dd.mm.yyyy")));1);"#"))


Ссылка на таблицу с обеими формулами
🔥6👍52👎1🤡1
🚀 Курс от авторов и модераторов канала @google_sheets: Скрипты и Формулы в Google Таблицах

Курс для тех, кто ежедневно работает в Таблицах и хочет делать свою работу быстрее и проще.

Если вы давно хотели уверенно владеть формулами и функциями, автоматизировать рутину и начать писать скрипты на "вайб-кодинге": это ваш поток.

Что вас ждёт

13 уроков по 1.5–2 часа
Два занятия в неделю
• Домашние задания после каждого урока
Личные чатики с поддержкой и ответами на ваши вопросы по Таблицам
• Записи уроков остаются у вас навсегда
• Исходные и готовые таблицы со всеми примерами и дополнительные материалы
Индивидуальная обратная связь от лектора по каждому выполненному заданию — в формате скринкаста

Формулы:
от базы и логики до ПРОСМОТРX, массивов, LET, LAMBDA и собственных функций.

Скрипты:
автоматизация рутины, onEdit / onOpen / onChange, интеграции по API, генерация из Таблицы договоров в PDF, работа с файлами, подключение ИИ и разбор реальных кейсов.

Сейчас стоимость курса 50 000. дальше стоимость будет увеличиваться.
Можно оплатить со счёта компании, мы сделаем чек.

Чтобы задать вопросы и присоединиться, напишите в личку @namokonov.
3🔥167😱3👎1🤡1🍓1