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
Media is too big
VIEW IN TELEGRAM
Анпивот! Таблица

Плоская, неплоская и анпивот (превращаем одно в другое)

В свежем видео показываю:

— Чем отличается плоская таблица от неплоской
— Зачем вообще превращать таблицы в плоские
— Как написать формулу UNPIVOT в Google Таблицах
— И как всё это помогает в автоматизации и анализе


А ещё:


🎓 Мы запускаем новый интенсив!
4 урока по формулам + 3 урока по скриптам
Только практика и только для тех, кто действительно хочет учиться и прокачиваться. Детали / Отзывы

📌 Чатик, попробуйте наоборот - из плоской таблицы неплоскую, пишите в комментарии
🔥13👍54🍓1
Друзья, появилось место на программирование, Google Apps Script!

Старт — завтра, занятия начнем с Google Диска.

Что будет в программе:
— Автоматизация Google Drive и Gmail
— Работа с API: Ozon, Wildberries, Telegram
— Разворачиваем скрипт как веб-сервер (для приема сообщений от Telegram-бота)

🧠 5-6 занятий — понедельник, среда, пятница
🕚 Время: 11:00 по МСК
💰 Стоимость: 50 000 рублей
📩 Детали и запись: @namokonov
7
Google Таблицы
Друзья, появилось место на программирование, Google Apps Script! Старт — завтра, занятия начнем с Google Диска. Что будет в программе: — Автоматизация Google Drive и Gmail — Работа с API: Ozon, Wildberries, Telegram — Разворачиваем скрипт как веб-сервер…
Апну, пишите @namokonov кто хочет попасть на курс: прикладное применение GAS-скриптов для работы с
— Google Диском
— Google Почтой
— также изучим обращения к API: WB, OZON, Telegram

У нас мини-группа, практически индивидуальное обучение, первый урок по диску уже сегодня

Возьмем одного человека.
1🍓1
Лаконичная визуализация для сводной и не только: функция REPT

Это древний метод, который использовали еще в Excel в те времена, когда Google Таблиц не было, в книгах Excel вели учет убитых мамонтов, а спарклайны были в черно-белых книгах Тафти, но никак не в табличных редакторах. Но он сгодится и для наших времен!

Здесь применяется функция ПОВТОР / REPT. Она просто повторяет текстовую строку, заданную в первом аргументе, столько раз, сколько указано во втором аргументе. На каждые 10 000 выручки она возвращает один символ валюты.
=REPT("₽ ";F5/10000)


Также к ячейкам в столбце G применяется условное форматирование со следующей формулой, чтобы выделять цветом значения выше среднего:
=первая ячейка>СРЗНАЧ(диапазон)



📗 Канал и Чат
📕 Оглавление канала
🏄 Заказ работы у нас
13🔥2
QUERY для группировки и ещё одно QUERY для итогов — всё в одной формуле!

Друзья, модернизировали наш старый пост.
Делаем сводную таблицу, используя LET, дважды QUERY и INDEX.
При этом к исходным данным обращаемся только один раз. Таблица.

Записаться на наш интенсив / заказать у нас работу

Формула
👍133🔥1
Переводим текст на другой язык функцией

Друзья, не забываем и про базовые функции, ниже эпиграф Гоголя к его "сорочинской ярмарке"


Менi нудно в хатi жить.
Ой, вези ж мене iз дому,
Де багацько грому, грому
Де гопцюють все дiвки,
Де гуляють парубки!


Он на украинском, как перевести на другие языки?

Используем функцию googletranslate:

=googletranslate(
наш текст;
"ISO-код языка оригинала";
"ISO-код языка перевода")


ISO-коды языков, которые вы используете в функции можно посмотреть вот здесь.

Ну а результат перевода - на скриншоте
11👍2🍓1
Google Таблицы
QUERY для группировки и ещё одно QUERY для итогов — всё в одной формуле! Друзья, модернизировали наш старый пост. Делаем сводную таблицу, используя LET, дважды QUERY и INDEX. При этом к исходным данным обращаемся только один раз. Таблица. Записаться на наш…
А как называете переменные вы?

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


Расскажите в комментариях, а как называете переменные вы?


Кстати, сейчас в названиях можно использовать и кирилицу.
2🔥2
Делим текстовую строку на отдельные элементы при помощи =REGEXREPLACE

Друзья, про этот трюк писал в своей рассылке Бенн Коллинс, а недавно про него вспомнил модератор нашего чата Алексей Одиссей, за что ему спасибо.

И так, второй аргумент =REGEXREPLACE - регулярное выражение, мы его опускаем вовсе и третьим аргументом добавляем свой символ, в примере это три шарпа ###.

После мы получаем три шарпа перед каждым символом в нашей строке и дальше просто делим по этим шарпам строчку с помощью SPLIT и получаем все составляющие этой строчки.

Ну и добавляем TRANSPOSE, чтобы элементы шли построчно.


=TRANSPOSE(SPLIT(REGEXREPLACE(A1;;"###");"###"))


Записаться на наш интенсив / заказать у нас работу

PS Зачем-то усложненная версия с заполненным вторым элементом =REGEXREPLACE

=TRANSPOSE(SPLIT(REGEXREPLACE(A1;"(.)";"$1###");"###"))
🔥11🍓4👍3
Достаём курсы криптовалют, Таблица, описание API

Друзья, есть открытое API, которое возвращает курсы криптовалюты (5000 монет) по ссылке cryptorates.ai/files/standard.csv (при клике на ссылку у вас скачается csv-файл).

Загрузить данные по всем монетам в Таблицу можно с помощью функции:

=IMPORTDATA(A1;;"en_US")


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

А так с помощью QUERY можно на лету отфильтровать массив и оставить в нём только нужные нам монеты:


=QUERY(IMPORTDATA(A1;;"en_US");"where Col1 matches 'BTC|ETH|TRUMP'";1)


Записаться на наш интенсив / заказать у нас работу

PS Как мы помним, запрос QUERY - текстовая строка, поэтому строку с нужными для вывода монетами легко можно собрать из листа с помощью функции

="where Col1 matches '"&TEXTJOIN("|";1;I4:I30)&"'"
10🔥4👍3
Функция ТИП.ОШИБКИ / ERROR.TYPE

Даем ей ячейку, получаем порядковый номер ошибки (число). Смотрим в справку:
1 для ошибки #NULL!
2 для ошибки #DIV/0!
3 для ошибки #VALUE!
4 для ошибки #REF!
5 для ошибки #NAME?
6 для ошибки #NUM!
7 для ошибки #N/A
8 для всех других ошибок.

То есть можно отлавливать определенные ошибки по схеме:

=ЕСЛИ(ТИП.ОШИБКИ(ячейка)=2; "Кажется, тут случилось деление на ноль"; вычисление)


Еще напомним про другие функции:
ЕОШ / ISERR — возвращает ИСТИНА / TRUE для всех ошибок, кроме Н/Д (N/A)
ЕНД / ISNA — ИСТИНА только для Н/Д
IFNA — сразу заменяет N/A на второй аргумент, а без ошибки возвращает первый аргумент.

Смотрите также:
Как выделить ячейки с ошибками REF внутри формул
Подробная статья про ошибки в формулах


📗 Канал и Чат
📕 Оглавление канала
🏄 Заказ работы @namokonov
👍62🔥1
В функции LET можно задавать свои функции! Это, конечно, экзотика (потому что, как правило, если нам нужно применять одно и то же вычисление много раз, мы используем LAMBDA + MAP или другую вспомогательную функцию), но тем не менее.

Если после имени переменной последует не константа / выражение, а функция LAMBDA, то это будет имя функции, которую потом можно в LET вызывать. В следующем примере у нас простая функция, умножающая число, данное ей на входе, на 2:
=LET(f; LAMBDA (a;a*2); f(10) + f(5) )

Здесь f – название функции, а – название переменной, аргумента этой функции. Затем в последнем аргументе LET мы уже ее вызываем с конкретными значениями 10 и 5.

Про базовые сценарии применения LET читайте в статье:
https://shagabutdinov.ru/tpost/47brblc2e1-novaya-funktsiya-excel-i-google-tablits


📗 Канал и Чат
📕 Оглавление канала
🏄 Заказ работы @namokonov
👍104
Пара примеров, как сделать ваш GAS-скрипт быстрее

Друзья, привет! Сегодня расскажу, как без глубокого рефакторинга можно ускорить ваш код.

1) Убирайте методы из глобальной области видимости

Смотрите на скриншот: userStates будет инициализироваться при запуске любого скрипта, даже того, где он не используется.

Это отнимет у скрипта некоторое время ещё до старта.

Оставляйте в глобальной области видимости только текстовые строки, числа, объекты или массивы, но не вызывайте методы.
5🔥3👍2🍓1
2) Минимизируйте количество обращений к таблице

Если записываете или получаете данные — старайтесь делать это за одно действие: формируйте массив в скрипте и вставляйте его с помощью setValues().

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

📗 Канал и Чат
📕 Оглавление канала
🏄 Заказ работы @namokonov
8🔥5👍3🍓1
Сколько пятниц, 13 в периоде?

Можно вычислить это такой формулой:

=ArrayFormula(СЧЁТЕСЛИ(ТЕКСТ(SEQUENCE(конец периода-начало периода+1;1;B1);"D DDD");"13 пт"))


=ArrayFormula(COUNTIF(TEXT(SEQUENCE(B2-B1+1,1,B1),"D DDD"),"13 пт"))

С другими региональными настройками будет иначе, например, для американских — "13 fri", а не "13 пт".
Ваши варианты формул приветствуются!

P.S. А если нужны просто все вторники или другие дни недели в периоде?
Кол-во вторников в месяце:

=ЧИСТРАБДНИ.МЕЖД(КОНМЕСЯЦА(дата;-1)+1;КОНМЕСЯЦА(дата;0);"1011111")
👍105🔥4🍓2
Задачка на формулы и скрипты

Друзья, привет!

Задача 1.
Напишите формулу в Google Таблице, чтобы посчитать общее количество номеров в формате: две буквы + четыре цифры.

Задача 2.
Напишите GAS-скрипт, который выведет все возможные номера в этом формате.

📌 Пишите свои решения в комментариях.

PS Буквы – от A до Z
👍52
Друзья, привет!

Сегодня берём "интересный" скрипт и заставим его работать.

Вот то, что нам прислал пользователь.

Пользователь пишет, что скрипт работает только для отправки одного сообщения.

Но если присмотреться внимательно, то данный скрипт вообще никуда сообщение отправить не может, так как внутри нет ни одного e-mail адреса:


var ID = "1btifyGowr_cWzkSzo0tZF_5bjRAs2ahgxTmsxju2VkE"; //speadsheet id
var EMAIL = "Лист1!A1:A"; //email
var RANGE = "Лист1!B1:B"; //data range to send
var check = "Лист1!C1:C"; //parametr
var text = "Информация по Вашему заказу"; //subject


function sendData() {
var spreadsheet = SpreadsheetApp.openById(ID);
var data = spreadsheet.getRangeByName(RANGE).getValues();


var message = {};
if (SpreadsheetApp.openById(ID).getRangeByName(check).getValues() < 100) { //condition
message.subject = "Заказ готов к отгрузке" + text;
message.to = EMAIL;
message.htmlBody = dataToHtmlTable_(data) +
"<br><br>С уважением";
MailApp.sendEmail(message);
}
}

Array.prototype.datesToString = function () {
return this.map(function (row) {
return row.map(function (cell) {
return cell && cell.getTime ? Utilities.formatDate(cell, Session.getScriptTimeZone(), "yyyy-MM-dd") : cell;
});
});
}


function dataToHtmlTable_(data) {
return JSON.stringify(data, null, " ")
.replace(/^\[/g, "<table>")
.replace(/\]$/g, "</table>")
.replace(/^\s\s\[$/mg, "<tr>")
.replace(/^\s\s\],{0,1}$/mg, "</tr>")
.replace(/^\s{4}"{0,1}(.*?)"{0,1},{0,1}$/mg, "<td>$1</td>");
}}"
6👍1🔥1
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