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
Google Таблицы
Друзья, привет! Сегодня берём "интересный" скрипт и заставим его работать. Вот то, что нам прислал пользователь. Пользователь пишет, что скрипт работает только для отправки одного сообщения. Но если присмотреться внимательно, то данный скрипт вообще никуда…
Media is too big
VIEW IN TELEGRAM
Заставляем работать чудо-код сверху:


function send() {
const spreadsheet = SpreadsheetApp.openById(ID);
const sh = spreadsheet.getSheetByName('лист1');
const data = sh.getDataRange().getValues();

for (let x = 0; x < data.length; x++) {
const to = data[x][0];
const Htmlbody = data[x][1] + "<br><br>С уважением";
const subject = "Заказ готов к отгрузке." + "Информация по Вашему заказу.";
GmailApp.sendEmail(to, subject, Htmlbody);
sh.getRange(x + 1, 4).setValue(new Date());
}
};


📗 Канал и Чат
📕 Оглавление канала
🏄 Заказ работы @namokonov
🔥53
оnEdit, который дает e-mail того, кто аккаунт редактирует

Друзья, пара открыть страшную тайнов веков - простый триггер onEdit умеет достать email того, кто редактирует ячейку только если действие (редактирование) происходит в платном google workspace аккаунтe.

На бесплатных аккаунтах такой возможнсти нет, раньше (когда-то) была, сейчас уже нет.

Детали:
🔹 В бесплатных аккаунтах Google (обычные @gmail.com) простой триггер onEdit(e) не возвращает email.
Аргумент e содержит, например:

range — ячейку, которую изменили,

value / oldValue — новое и старое значения,

user — пустое поле.


🔹 В платных Google Workspace (корпоративных доменах) при срабатывании onEdit(e) можно достать e.user.getEmail(), и тогда действительно видно, кто редактировал.
🔥65
Стартуем интенсив: формулы + скрипты

Скоро сентябрь — а это значит, что пора учиться!

Мы запускаем интенсив, старт — в пятницу, 29 августа.

Формат обучения:


каждую неделю — два занятия;

4 занятия по продвинутым (и просто полезным) формулам;

4 занятия по практичным скриптам;

продолжительность каждого занятия — 80–90 минут;

домашние задания для закрепления.


Это отличная возможность прокачать уставшие за лето нейроны 🙂

Отзывы https://xn--r1a.website/google_sheets1/7

Вопросы — @namokonov (Евгений). С формулами мне будет помогать приглашённый специалист.

Что входит по скриптам: https://xn--r1a.website/google_sheets/1861

Если просто хотите узнать и больше вопросов: 75 000 за 10 занятий, два + месяца, если есть любые вопросы: @namokonov
9👍5🍓1
Google Таблицы
Стартуем интенсив: формулы + скрипты Скоро сентябрь — а это значит, что пора учиться! Мы запускаем интенсив, старт — в пятницу, 29 августа. Формат обучения: каждую неделю — два занятия; 4 занятия по продвинутым (и просто полезным) формулам; 4 занятия…
Скрипты на интенсиве: навыки, которые экономят часы работы и приносят деньги 💰

Telegram-боты под ваши задачи
Научитесь создавать собственных ботов, которые пишут в чаты и каналы, собирают сообщения и даже следят за порядком.

Google Документы на автопилоте
Зачем вручную готовить договоры и отчёты, если это можно делать за секунды?
👉 Вы увидите, как данные из Google Таблиц автоматически превращаются в готовые документы. Минимум кликов — максимум экономии времени.

– Интеграции через API и маркетплейсы
Разберём простыми словами, что такое API и как с его помощью соединять сервисы.
👉 На практике — примеры работы с Wildberries и OZON: вы поймёте, как автоматизировать продажи и быстрее масштабировать бизнес.

🔥 После этих занятий вы сможете убрать рутину, запускать процессы «на автомате» и использовать те инструменты, которые реально дают результат.

Вопросы — @namokonov

PS в понедельник покажем веб-приложения, которое может запускать любые скрипты
6👍4
Сколько месяцев в году имеют 30 дней и более?

Напишем и разберем формулу:

=ARRAYFORMULA(
QUERY(
EOMONTH(DATE(2025; SEQUENCE(12); 1); 0);
"select Col1, day(Col1) where day(Col1) >= 30";
0
)
)


1. SEQUENCE(12)
Даёт массив чисел от 1 до 12 → номера месяцев.

2. DATE(2025; SEQUENCE(12); 1)
Создаёт массив дат:


01.01.2025
01.02.2025
01.03.2025
...
01.12.2025


3. EOMONTH(...; 0)
Функция EOMONTH(дата; смещение) даёт конец месяца.
Так как смещение = 0, берём последний день того же месяца:


31.01.2025
28.02.2025
31.03.2025
30.04.2025
...
31.12.2025


4. QUERY(...;"select Col1, day(Col1) where day(Col1) >= 30";0)

QUERY смотрит на массив дат:
Col1 = дата конца месяца
day(Col1) = количество дней в месяце

Фильтр "where day(Col1) >= 30" убирает месяца, в которых меньше 30 дней

📗 Канал и Чат
📕 Оглавление канала
🏄 Заказ работы у нас / интенсив (стартует скоро)
8👍3🍓1
Media is too big
VIEW IN TELEGRAM
🚀 Запускаем своё первое doGet-приложение в Google Таблицах

Хотите, чтобы ваши скрипты выполнялись по одной ссылке?
Это реально! Мы покажем, как за пару минут развернуть простое веб-приложение прямо в Google Таблицах.

🔥 Что это за приложение?
doGet-приложение запускает функцию, имя которой вы укажете в ссылке (?func=).
Например:

?func=clear — очистить таблицу,
?func=color — закрасить её случайными цветами.

Всё работает в один клик, а код остаётся полностью скрытым.

💡 Зачем это нужно?
• Вы даёте коллегам только ссылку — без раскрытия кода.
• Приложение запускается от вашего аккаунта.
• Можно подключить сколько угодно функций и запускать их прямо из браузера.

Пример кода
В примере всего две функции:
color() — заполняет каждый лист в таблице (массив 20×20) случайными цветами.
clear() — очищает все листы в таблице.


function doGet(e) {
const funcName = e.parameters['func'];
console.log(funcName);
this[funcName]();
}

function clear() {
const ss = SpreadsheetApp.getActive();
const sheets = ss.getSheets();
for (let sh of sheets) {
sh.clear();
}
SpreadsheetApp.flush();
}

function color() {
const ss = SpreadsheetApp.getActive();
const sheets = ss.getSheets();

for (let sh of sheets) {
let arr = [];
for (let i = 0; i < 20; i++) {
arr[i] = [];
for (let j = 0; j < 20; j++) {
arr[i][j] = basicColors[getRandomInt(0, basicColors.length - 1)];
}
}
sh.getRange(1, 1, arr.length, arr[0].length).setBackgrounds(arr);
}
SpreadsheetApp.flush();
}

const basicColors = [
"#FF0000", // красный
"#00FF00", // зелёный
"#0000FF", // синий
"#FFFF00", // жёлтый
"#FFA500", // оранжевый
"#800080", // фиолетовый
"#00FFFF", // бирюзовый
"#FFC0CB", // розовый
"#A52A2A", // коричневый
"#FFFFFF", // белый
"#000000" // чёрный
];

function getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min + 1)) + min;
}


🚀 Как это работает
[ссылка веб-приложения]?func=clear → моментальная очистка.
[ссылка веб-приложения]?func=color → мгновенная заливка таблицы цветами.

Названия функций можно менять. Добавьте свои — и запускайте любое количество скриптов через ?func=.

📺 В видео показано, как развернуть приложение и получить на него ссылку.

🔥 На интенсиве мы разберём такие приёмы подробно и соберём рабочие проекты прямо на ваших глазах.
t.me/google_sheets/1860
1🔥209
Обновления Google Таблиц и Презентаций

Спасибо Бену Коллинсу и его чудесной рассылке за информирование — а мы в свою очередь делимся с вами.

Функции ISEMAIL и ISURL стали работать точнее, и должны корректно определять больше электропочт и доменных имен. Напоминаем — обе возвращают TRUE / ИСТИНА, если в аргументе корректная почта или адрес.
Если хочется превратить тру-фолсы в красивые флажки — никто вам не сможет запретить.

Ну а в Google Презентациях объекты теперь будут двигаться всего лишь на 1 пиксель при нажатии на стрелки на клавиатуре. Рай для перфекционистов! Для остальных, чтобы двигать объекты посущественнее, нужно будет теперь зажимать Shift.

Вот вам еще несколько советов для Презентаций:
— можно "вшить" ссылку в объект — в изображение, например, с помощью стандартного сочетания Ctrl + K
— создавать дубликат слайда сочетанием Ctrl + D
— увеличивать и уменьшать размер текста в выделенном объекте сочетаниями Ctrl + Shift + > и Ctrl + Shift + < (тоже работает не только лишь в Google Презентациях)
— Ctrl + Shift + V — вставка только текста, без исходного форматирования
👍144
Google Таблицы
Скрипты на интенсиве: навыки, которые экономят часы работы и приносят деньги 💰 – Telegram-боты под ваши задачи Научитесь создавать собственных ботов, которые пишут в чаты и каналы, собирают сообщения и даже следят за порядком. – Google Документы на автопилоте…
🔥 Друзья! Уже завтра стартует наш интенсив!
Группа маленькая и уютная, поэтому каждому уделим максимум внимания.

Осталось всего 1–2 места — можно успеть вписаться! 🚀

Что будет на интенсиве:
Полезные кейсы по скриптам — даже без знаний сможете просто скопировать, вставить и применить у себя.
Фишки и практические приёмы по формулам.
10-12 занятий (по 2 раза в неделю) в формате лайв.
Все записи сохраняются на Google Диске — доступ у вас останется навсегда, сможете и скачать к себе.
Домашки и чат курса, где можно задавать вопросы и после завершения.

📩 Чтобы спросить детали или записаться — пишите: @namokonov
🔥52🍓1
Друзья, наш интенсив стартовал в пятницу!

Было первое вводное занятие, обсуждали, как с помощью пользовательской функции вывести цвета закраски ячеек прямо в таблицу.

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

Вспомнили про новые функции: let, lambda, byrow, bycor.

Курс стартовал, поэтому, кто хочет присоединиться сейчас - скидка, 60000, вместо 75000, которые были на старте.

Вопросы, запись: @namokonov
🍓32
🔥 Уже на первом занятии нашего интенсива мы разобрали пользовательские функции в Google Sheets!

Написали простейший скрипт (положил в комментарии), который возвращает HEX-цвет каждой ячейки, и научились использовать его для:
подсчёта ячеек по цвету,
суммирования через SUMIF,
фильтрации строк по выделению,
и других «умных» комбинаций формул.

И это только начало 💡

💰 Раньше участие стоило 75 000, но сейчас действует специальная цена — 60 000 (скидка 15 000).
Скидка доступна только до следующего урока, он во вторник!

⚡️ Про интенсив подробнее: t.me/google_sheets/1861
Вопросы, запись: @namokonov
5🔥3👍2
Воскресное применение getActiveRange()

Друзья, в Google Скриптах метод getActiveRange() возвращает выделенный диапазон в Таблице.

Есть интересный момент: если вызвать этот метод внутри пользовательской функции (той, что написана прямо в Таблице), то он вернёт диапазон, в котором введена формула.

Например, создаём простую функцию:


function воскресенье(a) {
return a + ', ' + typeof a;
};


Вставляем её в ячейку A1 и передаём в качестве аргумента C1:C2.

Результат (на скриншоте): возвращаются данные из ячеек и их тип.
👍21
Так а как же получить аргумент, который передан в функцию?

Просто: берем активную ячейку, вытаскиваем формулу как текст и регуляркой достаём то, что внутри скобок.

Вуаля 👇


function воскресенье(a) {
// Получаем активную таблицу
const sh = SpreadsheetApp.getActive();

// Берём адрес активного диапазона (в котором введена формула), например "A1"
const rangeA1 = sh.getActiveRange().getA1Notation();

// По адресу получаем саму формулу из ячейки, где стоит пользовательская функция
// Например: "=воскресенье(C1:C2)"
const formula = sh.getRange(rangeA1).getFormula();

/* Возвращаем строку с тремя частями:
1) сама формула, как она написана в ячейке
2) переданный аргумент (вытаскиваем всё, что внутри скобок с помощью RegExp)
формула.match(/\((.+?)\)/)?.[1] → ищет первую группу в скобках
?. — это оператор "optional chaining", чтобы не было ошибки, если нет совпадения
3) значения, которые реально пришли в функцию (в параметр a)
*/
return 'формула: ' + formula + '\n'
+ 'переданный аргумент: ' + formula.match(/\((.+?)\)/)?.[1] + '\n'
+ 'значения: ' + a;
};


Завтра, 1 сентября, стартует наш интенсив 🚀

Будут очень практические вещи:
— как автоматически собирать данные из таблиц в Google Docs,
— как сделать бота, который отвечает в чате и подгружает данные из таблиц,
— и много других рабочих кейсов.

💰 Стоимость: 75 000
👉 со скидкой 10% — 67 500
👉 для участников чата — 52 500 (-30%)

📌 Подробнее про интенсив: t.me/google_sheets/1861
Вопросы и запись: @namokonov

Приходи, мы тебя ждем! Запись открыта ещё несколько дней.
3🔥1
Оглавление ваших Таблиц на максималках 🚀

Когда я работал в одной компании, мне катастрофически не хватало простого списка листов в наших главных Таблицах — с возможностью сразу перейти на любой лист.

Мы сделали для вас скрипт, который решает эту задачу 🔥

👉 Таблица (делайте копию) / Код с комментариями отдельно

Как он работает:

1️⃣ В первую строку вводите ссылки на Таблицы.
2️⃣ Жмёте кнопку.
3️⃣ Скрипт проходит по каждой Таблице и:


• собирает список всех листов,
• делает кликабельные ссылки,
• считает количество строк и столбцов (полезно для оптимизации),
• считает количество формул и значений.

В итоге получаете полезное «оглавление» выбранных Таблиц в одной сводной таблице



🎓 А ещё: в пятницу, 29 августа, стартовал наш Интенсив по Скриптам Google Таблиц и Формулам.

Первый урок уже прошёл, уютная и небольшая группа, время спикеров достанется всем.

Но набор ещё открыт: вы успеваете присоединиться в течение ближайших 30 часов (до завтрашнего урока).


На интенсиве будут кейсы:
полезное применение новых и проверенных старых функуций,
автоматизация Google Таблиц,
интеграция с Телеграм-ботами,
работа с почтой,
и другие скрипты и формулы для бизнеса и жизни.

💰 Стоимость участия: 75 000
👉 сейчас со скидкой 10% — 67 500
👉 для участников нашего чата — 52 500 (-30%)

📌 Формат и программа интенсива
📌 Отзывы по нашим курсам
📩 Запись и вопросы: @namokonov
16👍6🔥6🍓1
Media is too big
VIEW IN TELEGRAM
Видео: формулы массива и ручные vs формульные данные
Продолжительность: 10 минут

Друзья, небольшое видео про 2 темы, часто вызывающие у новичков сложности (по моим наблюдениям):
— Формулы массива. Когда формула возвращает результат на весь столбец, это снижает риск ошибок, ее не надо протягивать. Но есть риск случайного ввода данных где-то на пути работы формулы и как следствие ошибок :)
— Cочетание данных, возвращаемых формулой и вводимых вручную. Комбинация приводит к ошибкам, так как комментарии и введенные вручную значения привязаны к ячейкам, а не к данным, которые выдает формула.

Наглядно про оба нюанса табличного строительства в видео.

Если вы помогаете коллегам с формулами и периодически объясняете, почему слетело настроенное вами заклинание ArrayFormula(XLOOKUP(...), поделитесь этим видео с ними 😃

Это видео на Youtube
Оно же на Kinescope
Больше бесплатных видеоуроков по ссылке


📗 Канал и Чат
📕 Оглавление канала
🏄 Заказ работы у нас
👍136
Alt + / — поиск команд и инструментов

Нажимаем Alt + / или кликаем в поисковое поле рядом с лупой на панели инструментов — и начинаем вводить то, что нас интересует.

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

А можно и ввести цвет, например — как на скриншоте — и получить список возможных действий.


📗 Канал и Чат
📕 Оглавление канала
🏄 Заказ работы у нас
👍10🔥83
Как вытянуть погоду из бесплатного API за 10 минут — даже если вы никогда не писали скрипты

Хотите одним кликом получать температуру и ветер по любой точке? Берём бесплатное API Open-Meteo и делаем это прямо в Google Таблицах.

Есть сайт https://api.open-meteo.com
— у него есть бесплатное и платное API. Мы используем бесплатное.

Чтобы получить текущую погоду, соберите ссылку вида:
https://api.open-meteo.com/v1/forecast?latitude=59.5638&longitude=150.803&current_weather=true

Здесь latitude и longitude — широта и долгота, конечно.

Если просто открыть ссылку в браузере — сразу увидите данные.

Мы подготовили решение в Google Таблице вместе со скриптом.


1) Вы кликаете в таблице по нужной строке с координатами.
2) Скрипт формирует ссылку с этими координатами.
3) «Как бы» открывает эту ссылку и получает из неё данные.
3) Извлекает температуру.
4) Извлекает скорость ветра.
5) Сохраняет полный ответ целиком — на случай, если вам будет интересно посмотреть, что ещё можно достать кроме температуры и ветра.


Таблица (делайте копию) / код отдельно с комментариями

Про такие вещи мы рассказываем на нашем интенсиве. Порог входа нулевой — можно учиться с нуля.

Сейчас поток идёт, через месяц стартует новый поток.

👉 Уже можно записать на новый поток — со скидкой, условия и программа: @namokonov
1🔥10👍9🍓32
Media is too big
VIEW IN TELEGRAM
Извлекаем из исходной таблицы не все столбцы, а только те, что в отдельном списке — или по номерам.

Что если нам нужны первый, потом с 5 по 20 и потом еще последний столбцы?
=CHOOSECOLS(Данные; 1; SEQUENCE(16;1;5); -1)


А если нужно все столбцы из списка с заголовками? Вот такая формула нам поможет:

=ArrayFormula(CHOOSECOLS(Данные; XMATCH(заголовки нужных столбцов; строка заголовков в данных)))


В видео есть и другие варианты решения:
— Новые и "старые" формулы в Google Таблицах
— Новые формулы в Excel
— Power Query

Это же видео на Youtube
И оно же на Kinescope (доступно в России, без рекламы)


📗 Канал и Чат
📕 Оглавление канала
🏄 Заказ работы у нас
🔥188👍6
Задача от прекрасной Лизы из нашего чата.

Возьмите текст ниже, вставьте в одну ячейку Google Таблиц. Сделайте ширину столбца — 250 px, шрифт — по умолчанию, 10 pt.

Придумайте формулу, которая разобьёт текст на строки так же, как его переносит ячейка.

Пишите ответы в комментариях — за лучшие варианты начислим +25 в нашем чате.



Учиться и развиваться можно в любом возрасте: важно лишь найти дело по душе, упорно двигаться вперёд и радоваться маленьким победам. Каждый шаг открывает новые возможности и ведёт к успеху.
9👍2
А чтобы финдиру стало проще, мы покажем классные лайфхаки с функцией ВПР (VLOOKUP).

— Последний аргумент ВПР или ВПР с интервальным просмотром = 1: t.me/google_sheets/13

— ВПР с ПОИСКПОЗ в массиве: t.me/google_sheets/78

— ВПР по нескольким диапазонам: t.me/google_sheets/145

— Видео про функцию ВПР в Google Таблицах: t.me/google_sheets/182

— ВПР (VLOOKUP) по нескольким условиям: t.me/google_sheets/265

— ВПР в массиве вместо тысячи CУММЕСЛИМН: t.me/google_sheets/355

— ЛЕВЫЙ ВПР (когда искомое значение не в первом столбце): t.me/google_sheets/397

— Храним данные в Properties и обращаемся к ним
Аналог функции ВПР: t.me/google_sheets/483

— ВПР, достаём последнее значение по ключу: t.me/google_sheets/558

— Массивный ВПР: t.me/google_sheets/577

— ВПР / VLOOKUP со звездочкой: t.me/google_sheets/640

— Условное форматирование + ВПР: выделяем цветом имена сотрудников из определенного отдела: t.me/google_sheets/925

— ВПР-им с разных листов: t.me/google_sheets/945

— Объединяем ВПР и СУММПРОИЗВ (SUMPRODUCT): t.me/google_sheets/253

🔥 Посты про другие функции и скрипты в оглавлении нашего канала: перейти


📗 Канал и Чат
📕 Оглавление канала
🏄 Заказ работы у нас
14🔥9👍3🍓2
Поговорили про ВПР (VLOOKUP), пришло время и про ПРОСМОТРX (XLOOKUP) поговорить!

В Google Таблицах функция доступна всем, а вот в Excel 2019 и древнее будет ошибка ИМЯ / NAME, ибо она есть только в 2021 / 365 / 2024 / Online. В Р7-Офис функция тоже есть.

— В ПРОСМОТРX есть встроенная замена ошибок (когда ничего не найдено) на любое значение — это четвертый необязательный аргумент.

По умолчанию ищет текст, а не ближайшее число. При этом число может искать и ближайшее наименьшее, и наибольшее, и без сортировки диапазона (ВПР при интервальном просмотре требует сортировки диапазона по возрастанию).

— Если ВПР по умолчанию работает с символами подстановки (то есть * в искомом значении будет означать текстовую строку любой длины из любых символов, а ? любой символ), то ПРОСМОТРX, наоборот, воспринимает *, ? и ~ как просто символы. Чтобы они стали подстановочными знаками, нужен пятый аргумент функции, равный 2.

В Excel с недавнего времени ПРОСМОТРX работает и с регулярными выражениями, для этого пятый аргумент должен быть равен 3. В Google Таблицах (пока?) такого варианта нет. Но, как правило, при поиске с регулярками нас интересуют все значения, а не одно (а ПРОСМОТРX, ВПР, ГПР, ПОИСКПОЗ возвращают только одно), так что для поиска всех значений, соответствующих регулярке, более актуальна конструкция:

=FILTER(диапазон; REGEXMATCH(столбец; регулярка))


— ПРОСМОТРX работает и со строками, и со столбцами. ВПР — только вертикально ,на то он и Вертикальный ПРосмотр, а не Горизонтальный (ГПР).

— ПРОСМОТРX может возвращать сразу несколько столбцов / строк (внимание на скриншот)

— ПРОСМОТРX может возвращать и первое, и последнее по порядку значение (здесь про это подробнее).

Можно отправить в ПРОСМОТРX массив, полученный другой такой же функцией, чтобы искать и по строкам, и по столбцам — пример тут.


📗 Канал и Чат
📕 Оглавление канала
🏄 Заказ работы у нас
18👍8🔥7🍓1
Экспортируем XLSX в Google Таблицу «налету» 🚀

Друзья, у нас есть очень удобный приём:
мы можем подхватить XLSX-файл прямо с Google Диска и тут же вывести его содержимое в нашу Таблицу — без скачиваний, конвертаций и промежуточных файлов.

Файл должен быть открыт по ссылке хотя бы на просмотр.

Базовая формула выглядит так:

=IMPORTDATA(A2 & "export?format=csv"; ""; "en_US")


🚨 Где A2 — ссылка на XLSX-файл (все, что в ссылке идёт до /edit или /view), открытый хотя бы на просмотр.
Формула вернёт данные с первого листа файла.

Если нужен конкретный лист — добавляем параметр gid (его можно подсмотреть в ссылке, открыв лист):

=IMPORTDATA(A2 & "export?format=csv&gid=1789128788"; ""; "en_US")


А если хотим сразу ограничить диапазон:

=IMPORTDATA(A2 & "export?format=csv&gid=1789128788&range=A1:C10"; ""; "en_US")


Что тут происходит?
1. Мы собираем ссылку с параметрами и Google сам «на лету» конвертирует XLSX в CSV через открытое API.
2. IMPORTDATA сразу подхватывает CSV и выводит в нашу Таблицу.

Такие маленькие, но мощные лайфхаки мы разбираем на нашем курсе по Google Таблицам.

Скоро открываем набор в новый поток — следите за анонсом, будет жарко 🔥

Спасибо за пример Алексею Одиссею.
13👍11🔥7🍓2