61109
Работа в Google Таблицах. Кейсы, решения и угар. админы: @namokonov @r_shagabutdinov @IT_sAdmin оглавление: goo.gl/HdS2qn заказ работы: teletype.in/@google_sheets/sheet_happens купить рекламу: https://telega.in/c/google_sheets РКН: clck.ru/3F3u9M
🚀 Запускаем своё первое 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=.
Скрипты на интенсиве: навыки, которые экономят часы работы и приносят деньги 💰
– Telegram-боты под ваши задачи
Научитесь создавать собственных ботов, которые пишут в чаты и каналы, собирают сообщения и даже следят за порядком.
– Google Документы на автопилоте
Зачем вручную готовить договоры и отчёты, если это можно делать за секунды?
👉 Вы увидите, как данные из Google Таблиц автоматически превращаются в готовые документы. Минимум кликов — максимум экономии времени.
– Интеграции через API и маркетплейсы
Разберём простыми словами, что такое API и как с его помощью соединять сервисы.
👉 На практике — примеры работы с Wildberries и OZON: вы поймёте, как автоматизировать продажи и быстрее масштабировать бизнес.
🔥 После этих занятий вы сможете убрать рутину, запускать процессы «на автомате» и использовать те инструменты, которые реально дают результат.
Вопросы — @namokonov
PS в понедельник покажем веб-приложения, которое может запускать любые скрипты
оnEdit, который дает e-mail того, кто аккаунт редактирует
Друзья, пара открыть страшную тайнов веков - простый триггер onEdit умеет достать email того, кто редактирует ячейку только если действие (редактирование) происходит в платном google workspace аккаунтe.
На бесплатных аккаунтах такой возможнсти нет, раньше (когда-то) была, сейчас уже нет.
Детали:
🔹 В бесплатных аккаунтах Google (обычные @gmail.com) простой триггер onEdit(e) не возвращает email.
Аргумент e содержит, например:
range — ячейку, которую изменили,
value / oldValue — новое и старое значения,
user — пустое поле.
onEdit(e) можно достать e.user.getEmail(), и тогда действительно видно, кто редактировал.
Читать полностью…
Друзья, привет!
Сегодня берём "интересный" скрипт и заставим его работать.
Вот то, что нам прислал пользователь.
Пользователь пишет, что скрипт работает только для отправки одного сообщения.
Но если присмотреться внимательно, то данный скрипт вообще никуда сообщение отправить не может, так как внутри нет ни одного 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>");
}}"
Сколько пятниц, 13 в периоде?
Можно вычислить это такой формулой:
=ArrayFormula(СЧЁТЕСЛИ(ТЕКСТ(SEQUENCE(конец периода-начало периода+1;1;B1);"D DDD");"13 пт"))
=ArrayFormula(COUNTIF(TEXT(SEQUENCE(B2-B1+1,1,B1),"D DDD"),"13 пт"))
Читать полностью…
=ЧИСТРАБДНИ.МЕЖД(КОНМЕСЯЦА(дата;-1)+1;КОНМЕСЯЦА(дата;0);"1011111")
2) Минимизируйте количество обращений к таблице
Если записываете или получаете данные — старайтесь делать это за одно действие: формируйте массив в скрипте и вставляйте его с помощью setValues().
То же самое при получении данных: забирайте целую строку или диапазон, а затем уже в скрипте извлекайте нужные значения.
📗 Канал и Чат
📕 Оглавление канала
🏄 Заказ работы @namokonov
В функции LET можно задавать свои функции! Это, конечно, экзотика (потому что, как правило, если нам нужно применять одно и то же вычисление много раз, мы используем LAMBDA + MAP или другую вспомогательную функцию), но тем не менее.
Если после имени переменной последует не константа / выражение, а функция LAMBDA, то это будет имя функции, которую потом можно в LET вызывать. В следующем примере у нас простая функция, умножающая число, данное ей на входе, на 2:
=LET(f; LAMBDA (a;a*2); f(10) + f(5) )
Функция ТИП.ОШИБКИ / ERROR.TYPE
Даем ей ячейку, получаем порядковый номер ошибки (число). Смотрим в справку:
1 для ошибки #NULL!
2 для ошибки #DIV/0!
3 для ошибки #VALUE!
4 для ошибки #REF!
5 для ошибки #NAME?
6 для ошибки #NUM!
7 для ошибки #N/A
8 для всех других ошибок.
То есть можно отлавливать определенные ошибки по схеме:
=ЕСЛИ(ТИП.ОШИБКИ(ячейка)=2; "Кажется, тут случилось деление на ноль"; вычисление)
Достаём курсы криптовалют, Таблица, описание API
Друзья, есть открытое API, которое возвращает курсы криптовалюты (5000 монет) по ссылке cryptorates.ai/files/standard.csv (при клике на ссылку у вас скачается csv-файл).
Загрузить данные по всем монетам в Таблицу можно с помощью функции:
=IMPORTDATA(A1;;"en_US")
=QUERY(IMPORTDATA(A1;;"en_US");"where Col1 matches 'BTC|ETH|TRUMP'";1)
QUERY - текстовая строка, поэтому строку с нужными для вывода монетами легко можно собрать из листа с помощью функцииЧитать полностью…
="where Col1 matches '"&TEXTJOIN("|";1;I4:I30)&"'"
А как называете переменные вы?
Друзья, у нас тут разгорелся спор по недавнему посту, спор про имена переменных, которые были использованы.
Расскажите в комментариях, а как называете переменные вы?
QUERY для группировки и ещё одно QUERY для итогов — всё в одной формуле!
Друзья, модернизировали наш старый пост.
Делаем сводную таблицу, используя LET, дважды QUERY и INDEX.
При этом к исходным данным обращаемся только один раз. Таблица.
Записаться на наш интенсив / заказать у нас работу
Формула
🔥 Бухгалтер? Хочешь больше заказов — мы собрали их специально для тебя!
«Подработка бухгалтера» — Telegram-канал, который сам находит для тебя свежие заказы с фриланс-бирж и hh. ru
📌 Удобные карточки: тип задачи, теги, оплата
📌 Быстрый доступ к заказам — откликаешься первым
📌 Экономия времени на поиске
📌 Отличный старт, если хочешь выйти на своих клиентов
Подходит как для опытных аутсорсеров, так и для тех, кто только набирает обороты.
Просто переходи — и начни зарабатывать быстрее. 🚀 💼
Реклама ООО "ЭР Софт" ИНН 7716509296 erid 2VtzqwzGRk9
Друзья, появилось место на программирование, Google Apps Script!
Старт — завтра, занятия начнем с Google Диска.
Что будет в программе:
— Автоматизация Google Drive и Gmail
— Работа с API: Ozon, Wildberries, Telegram
— Разворачиваем скрипт как веб-сервер (для приема сообщений от Telegram-бота)
🧠 5-6 занятий — понедельник, среда, пятница
🕚 Время: 11:00 по МСК
💰 Стоимость: 50 000 рублей
📩 Детали и запись: @namokonov
Мы ведём наш канал уже 8 лет — за это время с нами 65 000 подписчиков, а в нашем чате — более 6 000 участников.
За эти годы мы помогли решить сотни задач и вопросов наших подписчиков и заказчиков, связанных с Google Таблицами, формулами и скриптами.
---
Сейчас мы запускаем двухнедельный интенсив:
* 4 урока по формулам — на первой неделе
* 3 урока по скриптам — на второй
---
Уроки буду вести я (не Макаренко, зато живой) — Намоконов Евгений,
а также наша прекрасная Лиза — Елизавета.
💰 Стоимость всего курса — 70 000 рублей.
Работаем как с СЗ (самозанятыми), так и с ПС (группами и компаниями).
Но можно выбрать только то, что нужно вам — участие гибкое.
---
Если не хотите все 7 уроков — выбирайте минимум 4 из списка:
* JS: база
* Работа с Таблицей через скрипты
* Google Диск и скрипты
* Отправка писем (а может, и событий в Календарь)
* Работа с API разных видов
* Автоматическое создание мемов каждое утро и отправка их в WhatsApp
---
Любые вопросы знаете кому задавать: @namokonov
Понужужу: три раза в неделю, примено 10-12 реаллных часов
Новая опция в фильтрах таблиц: можно выбрать строки с ячейками, соответствующими правилу проверки данных в столбце или с ошибочными данными.
Пункты называются так:
Данные проверены (Data validated)
Данные не проверены (Data not validated)
Соответственно, если выбрать "не проверены", останутся только ячейки, в которых значения не соответствуют установленному правилу проверки данных.
Про проверку мы писали ранее тут:
Выбор нескольких значений /channel/google_sheets/1488
Проверка данных (Data validation) с формулами /channel/google_sheets/792
📗 Канал и Чат
📕 Оглавление канала
🏄 Заказ работы у нас
Сколько месяцев в году имеют 30 дней и более?
Напишем и разберем формулу:
=ARRAYFORMULA(
QUERY(
EOMONTH(DATE(2025; SEQUENCE(12); 1); 0);
"select Col1, day(Col1) where day(Col1) >= 30";
0
)
)
01.01.2025
01.02.2025
01.03.2025
...
01.12.2025
EOMONTH(дата; смещение) даёт конец месяца.
31.01.2025
28.02.2025
31.03.2025
30.04.2025
...
31.12.2025
QUERY смотрит на массив дат:Col1 = дата конца месяца"where day(Col1) >= 30" убирает месяца, в которых меньше 30 дней
Стартуем интенсив: формулы + скрипты
Скоро сентябрь — а это значит, что пора учиться!
Мы запускаем интенсив, старт — в пятницу, 29 августа.
Формат обучения:
каждую неделю — два занятия;
4 занятия по продвинутым (и просто полезным) формулам;
4 занятия по практичным скриптам;
продолжительность каждого занятия — 80–90 минут;
домашние задания для закрепления.
Заставляем работать чудо-код сверху:
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());
}
};
Задачка на формулы и скрипты
Друзья, привет!
Задача 1. Напишите формулу в Google Таблице, чтобы посчитать общее количество номеров в формате: две буквы + четыре цифры.
Задача 2. Напишите GAS-скрипт, который выведет все возможные номера в этом формате.
📌 Пишите свои решения в комментариях.
PS Буквы – от A до Z
🎉 Давно думаете, как войти в мир данных, но не знаете, с чего начать?
Регистрируйтесь на бесплатный мини-курс по SQL! Это ключевой навык для работы с данными, который поможет вам открыть двери в перспективную профессию аналитика.
На курсе вас ждет:
✔️ 5 часов обучения, чтобы уверенно начать работать с SQL,
✔️ Пошаговые видео-разборы от эксперта, которые помогут во всем разобраться,
✔️ Поддержка куратора в чате и нетворкинг с другими участниками,
✔️ 30+ практических заданий для закрепления навыков,
✔️ Финальный кейс, который вы решите самостоятельно,
✔️ Сертификат о прохождении курса.
Обучение на курсе стартует 13 августа — успейте зарегистрироваться по ссылке ниже.
🎁 Всех ждет подарок — гайд «20 фреймворков аналитика» после регистрации!
Это супер-конспект на 133 страницы с описанием самых главных шаблонов и инструментов для анализа и поиска решений от наших экспертов!
🎁 Также все участники курса получат грант на дальнейшее обучение аналитики!
SQL — это старт к новой карьере в аналитике или важный навык, который сделает вас ценным специалистом в своей сфере.
Регистрируйтесь до 13 августа по ссылке
Пара примеров, как сделать ваш GAS-скрипт быстрее
Друзья, привет! Сегодня расскажу, как без глубокого рефакторинга можно ускорить ваш код.
1) Убирайте методы из глобальной области видимости
Смотрите на скриншот: userStates будет инициализироваться при запуске любого скрипта, даже того, где он не используется.
Это отнимет у скрипта некоторое время ещё до старта.
Оставляйте в глобальной области видимости только текстовые строки, числа, объекты или массивы, но не вызывайте методы.
🔔Бесплатный доступ к курсу по автоматизации управленческого учёта
По статистике📊 8 из 10 предпринимателей требуют от финдира умения работать в сервисах управленческого учёта.
Если вы до сих пор ведёте отчёты в Excel и Google таблицаx, самое время попробовать более современное решение 😉.
Курс по настройке отчёта ДДС от Финтабло — ваш быстрый старт в автоматизации финансового учёта.
Всего за 4 урока вы:
✅ Освоите 1 из лучших сервисов финансового и управленческого учёта для финансистов
✅ Построите отчёт ДДС без ручных операций — данные из банка и платёжных систем будут подтягиваться автоматически
✅ Сделаете финансовый анализ с помощью встроенного АИ аналитика — на этой уйдет 5 минут.
❗️Ровно 100 бесплатных мест. Успейте занять ваше. В подарок🎁 — доступ к сервису на 30 дней.
Получить бесплатный доступ к курсу>>>
Реклама ООО "НФ Софт". ИНН: 2311303019. Erid: 2VtzqxkoPoE
😿 Когда часы утекают на обновление данных из всех источников в Google Sheets… и в конце — формула сбилась, ссылки не те, а дедлайн — вчера.
Хватит тратить время на ручное обновление таблиц!
JetStat — это сервис для автоматизации маркетинговой отчётности.
— JetStat подключается к 60+ источникам (рекламные кабинеты, аналитические системы, CRM, маркетплейсы, коллтрекеры, базы данных и др): Google Ads, Яндекс.Директ, VK, TikTok, Bitrix24, AmoCRM и др.
— Загружает данные по расписанию прямо в Google Sheets, Excel или BI
— Отчёты всегда актуальны благодаря автоматизации: обновление данных до 5 раз в день
✅ Забудьте про ручной импорт и вечные исправления
✅ Отчёты обновляются без сбоев, даже когда у вас гора задач
✅ Экономьте до 30% времени — больше свободы и меньше стресса
100+ агентств уже с нами — Циан, KION, e-Promo и другие
Работает без кода — просто подключи, настрой и забудь
🧪 Попробуйте 7 дней бесплатно — jetstat.io
Реклама ООО “Джет лабс”. ИНН: 7728475027. Erid: 2Vtzqwb8s4c
Делим текстовую строку на отдельные элементы при помощи =REGEXREPLACE
Друзья, про этот трюк писал в своей рассылке Бенн Коллинс, а недавно про него вспомнил модератор нашего чата Алексей Одиссей, за что ему спасибо.
И так, второй аргумент =REGEXREPLACE - регулярное выражение, мы его опускаем вовсе и третьим аргументом добавляем свой символ, в примере это три шарпа ###.
После мы получаем три шарпа перед каждым символом в нашей строке и дальше просто делим по этим шарпам строчку с помощью SPLIT и получаем все составляющие этой строчки.
Ну и добавляем TRANSPOSE, чтобы элементы шли построчно.
=TRANSPOSE(SPLIT(REGEXREPLACE(A1;;"###");"###"))
=REGEXREPLACEЧитать полностью…
=TRANSPOSE(SPLIT(REGEXREPLACE(A1;"(.)";"$1###");"###"))
Переводим текст на другой язык функцией
Друзья, не забываем и про базовые функции, ниже эпиграф Гоголя к его "сорочинской ярмарке"
Менi нудно в хатi жить.
Ой, вези ж мене iз дому,
Де багацько грому, грому
Де гопцюють все дiвки,
Де гуляють парубки!
googletranslate:
=googletranslate(
наш текст;
"ISO-код языка оригинала";
"ISO-код языка перевода")
Лаконичная визуализация для сводной и не только: функция REPT
Это древний метод, который использовали еще в Excel в те времена, когда Google Таблиц не было, в книгах Excel вели учет убитых мамонтов, а спарклайны были в черно-белых книгах Тафти, но никак не в табличных редакторах. Но он сгодится и для наших времен!
Здесь применяется функция ПОВТОР / REPT. Она просто повторяет текстовую строку, заданную в первом аргументе, столько раз, сколько указано во втором аргументе. На каждые 10 000 выручки она возвращает один символ валюты.
=REPT("₽ ";F5/10000)
=первая ячейка>СРЗНАЧ(диапазон)
Апну, пишите @namokonov кто хочет попасть на курс: прикладное применение GAS-скриптов для работы с
— Google Диском
— Google Почтой
— также изучим обращения к API: WB, OZON, Telegram
У нас мини-группа, практически индивидуальное обучение, первый урок по диску уже сегодня
Возьмем одного человека.
Анпивот! Таблица
Плоская, неплоская и анпивот (превращаем одно в другое)
В свежем видео показываю:
— Чем отличается плоская таблица от неплоской
— Зачем вообще превращать таблицы в плоские
— Как написать формулу UNPIVOT в Google Таблицах
— И как всё это помогает в автоматизации и анализе
А ещё:
MATH.SUM для подсчета суммы В JS/GAS НЕТ, ЗАТО ЕСТЬ РЕДЬЮС!
Показываем пример попроще
function reduce() {
let a = [1, 'a', 3, 3, 3, 'f'];
console.log(
a.reduce(
(acc, v) => acc + (typeof v == 'number' ? v : 0),
100
)
);
}
Читать полностью…
function reduce() {
let a = [
[1, 'a', 3, 3, 3, 3, 3, 3, 'f'],
[1, 'a', 3, 3, 3, 3, 3, 3, 'f'],
[1, 'a', 3, 3, 3, 3, 3, 3, 'f']
];
console.log(
a.reduce((acc, row) =>
acc + row.reduce(
(acc2, v) => acc2 + (typeof v == 'number' ? v : 0),0),
)
);
}
Когда решения в команде принимаются «на ощущениях», легко промахнуться.
Разберитесь за один вечер, как вытащить из данных ответ «почему» и куда расти дальше, на нашем мини-курсе:
• 6 уроков: SQL → Python → Excel/PowerPoint
• практика на реальных данных (можно положить в портфолио)
• поддержка эксперта-практика в чате
• гайд-подарок «20 фреймворков аналитика» (133 стр. схем и шаблонов, которые помогают быстро находить решения)
1 300+ специалистов уже прошли курс; большинство отмечают, что после него проще находить точки роста продукта и аргументировать решения перед руководством.
⏰ Курс открыт бесплатно до конца июля
Зарегистрироваться на курс