source
Копия CSV. Значения не исправляются вручную.
На прошлом занятии собрана цепочка:
UTM
↓
сайт на Vercel
↓
форма
├→ GA4 → generate_lead
└→ Apps Script → Google SheetsВ листе leads появились строки с полями request_id, created_at, name, email, direction, utm_source, utm_medium, utm_campaign и status.
В этой теме разбирается, как подготовить такие данные к анализу, когда строк много и значения записаны по-разному.
В столбце источника встречаются значения:
Telegram
telegram
TELEGRAM
tg
TelegramВсе пять записей обозначают один источник. Таблица сравнивает значения посимвольно, поэтому при подсчёте заявок по источникам получится пять строк вместо одной.
Цель подготовки — привести все варианты к одному значению telegram.
Каждое значение можно исправить руками: удалить пробелы, поменять регистр, разделить столбец, заменить сокращения.
Для пяти строк это несколько минут. В выгрузке на 10 000 строк ручная правка занимает часы. Когда приходит новая выгрузка, все исправления повторяются заново, а пропущенную ячейку можно найти только повторным просмотром всей таблицы.
В Google Таблицах правило записывается формулой. Формула ссылается на ячейки другого листа и пересчитывается сама, когда значения там меняются.
В этой теме таблица состоит из двух листов:
Копия CSV. Значения не исправляются вручную.
Формулы берут значения из source и очищают их.
Значения, которые формулы выводят на лист leads_clean.
Импорт CSV на лист source.
Формулы листа leads_clean очищают значения.
Лист leads_clean — готовая таблица для анализа.
Apps Script из темы 7 записывал в таблицу аккуратные строки. На них не видно, как работают правила очистки.
Поэтому для практики подготовлен файл leads_dirty.csv. В нём те же заявки, но с типичными ошибками ручного ввода и выгрузки.
9 полей, отдельные utm_source и utm_medium, полный UUID.
8 входных полей: source_medium объединяет source и medium через |. ID сокращены для чтения.
lesson_data_cleaning/
├── data/
│ ├── leads_dirty.csv
│ ├── leads_dirty_v1_backup.csv
│ └── leads_dirty_v2.csv
├── result/
└── README.mdВ папку result в конце занятия сохраняется очищенный результат в формате CSV.
request_id,created_at,name,email,direction,source_medium,utm_campaign,status
REQ-001,2026-09-23 12:40:00," Иван Тестов ",student1@example.com,backend," Telegram | Social ","LESSON07","NEW"
REQ-002,2026-09-23 12:44:00,"Анна ",student2@example.com,data,"vk|social","lesson07","new"
REQ-003,wrong_date," Петр",student3@example.com,frontend," telegram|SOCIAL ","Lesson07","done"
REQ-004,2026-09-23 13:01:00,"Мария",student4@example.com,backend,"direct|none","not_set"," new "
REQ-005,2026-09-23 13:05:00,"Олег",student5@example.com,data,"TG|social","LESSON07","DONE"Откройте файл в текстовом редакторе: правый щелчок по leads_dirty.csv → Открыть с помощью → TextEdit (в Windows — Блокнот). В Excel и Google Таблицах кавычки и часть пробелов при открытии не видны, поэтому для просмотра они не подходят.
Первая строка — заголовки восьми столбцов. Ниже пять заявок. Значения с пробелами по краям записаны в кавычках: так CSV сохраняет эти пробелы.
Файл только просматривается. Закройте его без сохранения.
Перед импортом ошибки находят глазами:
После преобразования остаются девять столбцов:
request_id created_at name email direction
utm_source utm_medium utm_campaign statusПервая заявка после очистки:
2026-09-23 12:40:00 · Иван Тестов · student1@example.com · backend
telegram · social · lesson07 · newВместо ошибочной даты в результате остаётся ошибка. Придуманную дату не подставляют.
До первой формулы нужно знать:
В новой пустой таблице нажмите на название «Новая таблица» в левом верхнем углу и введите:
leads_cleaningТаблица сохраняется на Google Диске автоматически.
Откройте меню Файл и выберите Импортировать.
Импорт кладёт данные CSV на лист этой же таблицы. Формулы, которые появятся на соседнем листе, смогут ссылаться на них по имени листа.
Окно импорта открывается на вкладке «Мой диск». CSV лежит на компьютере, поэтому перейдите на вкладку Добавить и нажмите Обзор.
В окне выбора файла откройте распакованную папку и выберите:
lesson_data_cleaning/data/leads_dirty.csvОкно выбора файла — системное: в macOS это окно Finder, в Windows — окно Проводника. Перейдите в папку data, выделите leads_dirty.csv и нажмите Открыть.
После загрузки открывается окно «Импорт файла». В строке «Файл» должно стоять имя leads_dirty.csv.
В списке Выбрать цель для импорта выберите Заменить текущий лист.
Данные лягут на открытый сейчас лист, в новой таблице это «Лист1». Остальные пункты списка создают отдельную таблицу, добавляют новые листы, заменяют всю таблицу или дописывают строки к уже имеющимся.
Google Таблицы читают CSV в кодировке UTF-8. Учебные файлы сохранены в UTF-8, и имена Иван, Мария, Петр читаются без искажений.
Если вместо букв видны нечитаемые символы, файл был сохранён в другой кодировке. Откройте его в текстовом редакторе, сохраните в UTF-8 и повторите импорт.
В списке Тип разделителя выберите Запятая.
Снимите флажок Преобразовывать текст в числа, даты и формулы. Тогда все значения лягут на лист как текст, в том виде, в каком они записаны в CSV. Тип даты позже задаётся формулой на листе leads_clean.
Нажмите Импортировать данные.
На листе появились 8 заголовков и 5 заявок.
Пробелы сохранены: выделите ячейку C2, в строке формул видно « Иван Тестов » с пробелами по краям. Значения wrong_date, TG и NEW тоже на месте.
Дважды щёлкните по ярлыку «Лист1» внизу окна и введите:
sourceФормулы будут ссылаться на этот лист по имени, например source!A2:A.
Нажмите + слева от ярлыков, чтобы добавить лист. Переименуйте его в leads_clean.
В строку 1 введите девять заголовков из контракта, по одному в ячейку от A1 до I1. К следующей ячейке переходите клавишей Tab:
request_id created_at name email direction utm_source utm_medium utm_campaign statusВыделите ячейку A2 листа leads_clean и введите:
=ARRAYFORMULA(ЕСЛИ(source!A2:A="";;СЖПРОБЕЛЫ(source!A2:A)))source!A2:A — все ячейки столбца A листа source, начиная со второй строки.
СЖПРОБЕЛЫ убирает лишние пробелы.
ЕСЛИ(source!A2:A="";;…) оставляет ячейку пустой, если в source строка пустая. Между двумя точками с запятой ничего нет: это пустой результат.
ARRAYFORMULA применяет правило ко всем строкам сразу. Столбец A заполнился до пятой заявки, хотя формула записана только в A2.
Во второй строке каждого столбца стоит одна формула. Она описывает правило для всего столбца:
A request_id СЖПРОБЕЛЫ
B created_at ЗНАЧЕН → дата и время
C name СЖПРОБЕЛЫ + ПЕЧСИМВ
D email СЖПРОБЕЛЫ + ПЕЧСИМВ
E direction СЖПРОБЕЛЫ + ПЕЧСИМВ
F:G utm_… SPLIT по | + СЖПРОБЕЛЫ + СТРОЧН + замена tg
H utm_campaign СЖПРОБЕЛЫ + ПЕЧСИМВ + СТРОЧН
I status СЖПРОБЕЛЫ + ПЕЧСИМВ + СТРОЧНСтроки ниже второй заполняются сами. Вручную в них ничего не вводится.
Выделите ячейку A4. В строке формул видно только значение REQ-003. Его рассчитала формула из A2.
Чтобы изменить правило для всего столбца, исправляют одну формулу в A2.
Ссылка source!A2:A состоит из имени листа, восклицательного знака и диапазона.
Формулы находят данные по буквам столбцов. Если в source поменять порядок столбцов, формула возьмёт значения из другого поля. К этому свойству относится проверка структуры в конце темы.
В таблицах с региональными настройками «Россия» аргументы функций разделяются точкой с запятой, а названия функций показываются по-русски: СЖПРОБЕЛЫ, ЕСЛИ, СТРОЧН.
Если таблица подчёркивает формулу как ошибочную, откройте Файл → Настройки и проверьте поле Региональные настройки. Для формул этой темы нужно значение «Россия».
Флажок Всегда использовать названия функций на английском языке оставьте снятым: тогда формулы на экране совпадут с формулами на слайдах.
Google Таблицы различают текст, числа, даты и время.
Текст прижимается к левому краю ячейки, числа и даты — к правому.
На листе source все значения лежат слева: при импорте мы отключили преобразование, и даже 2026-09-23 12:40:00 хранится как текст.
Откройте лист source и выделите ячейку B2. В строке формул перед значением стоит апостроф: '2026-09-23 12:40:00. Так таблица помечает текст, который похож на дату.
Пока created_at хранится как текст, значение состоит только из символов. Такие значения нельзя сравнить по времени, отсортировать по дате или вычесть одну дату из другой.
Когда значение становится датой и временем, таблица хранит его как число: целая часть — день, дробная — время суток.
Автоматическое преобразование при импорте угадывает тип по виду значения. Оно может убрать ведущие нули в идентификаторе или прочитать дату в формате другой страны, например поменять местами день и месяц.
Поэтому тип created_at задаётся формулой на листе leads_clean. Правило видно в ячейке B2, и его можно проверить.
request_id текст
created_at дата и время
name текст
email текст
direction текст
utm_source текст
utm_medium текст
utm_campaign текст
status текстrequest_id остаётся текстом: это метка заявки, считать с ней не нужно.
Вернитесь на лист leads_clean и в ячейку B2 введите:
=ARRAYFORMULA(ЕСЛИ(source!B2:B="";;ЗНАЧЕН(СЖПРОБЕЛЫ(source!B2:B))))ЗНАЧЕН превращает текст 2026-09-23 12:40:00 в число. Пока у ячеек нет формата даты, видны числа вида 46288,52778: 46288 — день, 0,52778 — доля суток.
Строку wrong_date нельзя превратить в число. В ячейке B4 появилась ошибка:
#VALUE!Остальные четыре даты преобразованы. Ошибка в одной ячейке показывает, какая строка нарушает контракт.
Правило требует, чтобы в created_at стояли дата и время. В источнике записано:
wrong_dateОшибка показывает, что значение не соответствует контракту. Исправлять нужно источник или правило приёма данных. Формула остаётся прежней.
Наведите указатель на ячейку с #VALUE!. Красный треугольник в углу означает, что у ячейки есть сообщение.
В подсказке написано: «Параметр wrong_date в функции VALUE невозможно интерпретировать как число». VALUE — английское название функции ЗНАЧЕН. Сообщение называет функцию и значение, которое она не смогла преобразовать.
В строке формул та же ошибка показана по-русски: #ЗНАЧ!.
Ошибку можно скрыть функцией ЕСЛИОШИБКА, подставив пустую ячейку. Тогда в отчёте окажется заявка без даты, и по отчёту нельзя будет определить, что в источнике было неверное значение.
В этой теме ошибка остаётся видимой: по ней находят строку, которую нужно исправить в источнике.
Выделите столбец B, щёлкнув по его букве. Откройте Формат → Числа → Дата и время.
Числа 46288,52778 превращаются в 23.09.2026 12:40:00. Значение в ячейке то же, меняется только способ показа.
В ячейку C2 листа leads_clean введите:
=ARRAYFORMULA(ЕСЛИ(source!C2:C="";;СЖПРОБЕЛЫ(ПЕЧСИМВ(source!C2:C))))СЖПРОБЕЛЫ в Google Таблицах удаляет пробелы по краям и заменяет несколько пробелов подряд внутри строки одним:
« Иван Тестов » → «Иван Тестов»Пробел между именем и фамилией остаётся.
ПЕЧСИМВ удаляет управляющие символы: перенос строки внутри значения, табуляцию и другие коды, которые не видны на экране. Они попадают в данные при копировании из писем, сайтов и других программ.
В учебном файле таких символов нет, поэтому видимого изменения не будет. Правило оставлено, чтобы новые выгрузки обрабатывались так же.
Для email и direction нужны те же функции. В ячейки D2 и E2 введите:
=ARRAYFORMULA(ЕСЛИ(source!D2:D="";;СЖПРОБЕЛЫ(ПЕЧСИМВ(source!D2:D))))
=ARRAYFORMULA(ЕСЛИ(source!E2:E="";;СЖПРОБЕЛЫ(ПЕЧСИМВ(source!E2:E))))СЖПРОБЕЛЫ работает с обычными пробелами: убирает их по краям и сжимает повторы внутри.
ПЕЧСИМВ удаляет невидимые управляющие символы, обычные пробелы остаются.
Поэтому в формулах используются обе функции: СЖПРОБЕЛЫ(ПЕЧСИМВ(…)). Сначала выполняется внутренняя функция, затем внешняя.
В файле источник и канал записаны в одном поле:
Telegram | Social
vk|social
telegram|SOCIAL
direct|none
TG|socialПо контракту нужны два отдельных поля: utm_source и utm_medium.
В ячейку F2 введите:
=ARRAYFORMULA(ЕСЛИ(source!F2:F="";;SPLIT(source!F2:F;"|")))SPLIT делит текст по указанному символу. Из « Telegram | Social » получаются два значения: « Telegram » и « Social ».
SPLIT возвращает два значения, поэтому результат формулы из F2 занимает столбцы F и G.
Если в G2 или ниже что-то ввести, формула не сможет вывести результат и покажет ошибку #REF!. Столбец G заполняется формулой из F2, своей формулы у него нет.
В столбце F появился источник, в столбце G — канал. Заголовки из строки 1 уже подходят: utm_source и utm_medium.
Пробелы по краям и разный регистр пока остались: « Telegram », « Social », SOCIAL.
Измените формулу в F2, обернув SPLIT в СЖПРОБЕЛЫ:
=ARRAYFORMULA(ЕСЛИ(source!F2:F="";;СЖПРОБЕЛЫ(SPLIT(source!F2:F;"|"))))Одна функция обрабатывает оба столбца, потому что SPLIT передаёт ей оба значения.
В ячейки H2 и I2 введите:
=ARRAYFORMULA(ЕСЛИ(source!G2:G="";;СЖПРОБЕЛЫ(ПЕЧСИМВ(source!G2:G))))
=ARRAYFORMULA(ЕСЛИ(source!H2:H="";;СЖПРОБЕЛЫ(ПЕЧСИМВ(source!H2:H))))Буквы сдвинулись: utm_campaign в source стоит в столбце G, а в leads_clean — в H, потому что source_medium превратился в два столбца.
СТРОЧН переводит все буквы в нижний регистр. Добавьте её в формулы трёх ячеек:
=ARRAYFORMULA(ЕСЛИ(source!F2:F="";;СТРОЧН(СЖПРОБЕЛЫ(SPLIT(source!F2:F;"|")))))
=ARRAYFORMULA(ЕСЛИ(source!G2:G="";;СТРОЧН(СЖПРОБЕЛЫ(ПЕЧСИМВ(source!G2:G)))))
=ARRAYFORMULA(ЕСЛИ(source!H2:H="";;СТРОЧН(СЖПРОБЕЛЫ(ПЕЧСИМВ(source!H2:H)))))Получаем: Telegram → telegram, SOCIAL → social, LESSON07 → lesson07, NEW → new.
Имя и email в нижний регистр не переводятся.
При подсчёте заявок таблица сравнивает значения посимвольно. Telegram, telegram и TELEGRAM дают три строки в сводной таблице.
После СТРОЧН остаётся одна категория telegram.
В формуле СТРОЧН(СЖПРОБЕЛЫ(SPLIT(…))) порядок выполнения такой:
SPLIT « Telegram | Social » → « Telegram », « Social »
СЖПРОБЕЛЫ « Telegram » → «Telegram»
СТРОЧН «Telegram» → «telegram»Каждая внешняя функция получает результат внутренней.
После СТРОЧН значение TG стало tg. По контракту источник должен называться telegram.
СТРОЧН меняет только регистр букв, поэтому для tg нужно отдельное правило замены.
Измените формулу в F2:
=ARRAYFORMULA(ЕСЛИ(source!F2:F="";;LET(v;СТРОЧН(СЖПРОБЕЛЫ(SPLIT(source!F2:F;"|")));ЕСЛИ(v="tg";"telegram";v))))LET(v; …) даёт промежуточному результату имя v, чтобы не писать длинное выражение дважды.
ЕСЛИ(v="tg";"telegram";v) заменяет значение, только когда ячейка целиком равна tg. Значения вроде tgbot или instagram не меняются.
Формула не меняет лист source. В ячейке source!F6 так и осталось TG|social.
Правило tg → telegram хранится в формуле и применяется каждый раз, когда таблица пересчитывает leads_clean.
Выделите любую ячейку листа leads_clean и выберите Данные → Создать фильтр.
В заголовках появятся значки фильтра. Фильтр нужен, чтобы посмотреть список значений столбца.
Нажмите значок фильтра в заголовке status. В списке должны остаться только два значения:
done
newВместо NEW, « new » и DONE получились два значения. Закройте список кнопкой Отмена, ничего не снимая.
Если в status появится finished, unknown или ???, автоматически превращать их в done нельзя.
Замена добавляется только тогда, когда есть утверждённое правило: например, отдел продаж подтвердил, что finished означает done. Остальные неизвестные значения нужно показать и разобрать.
Замена tg → telegram стоит после СЖПРОБЕЛЫ и СТРОЧН. К моменту замены все варианты TG, tg, « Tg » и tG уже превратились в tg.
Если заменять до очистки, пришлось бы перечислять каждый вариант записи отдельно.
A2 СЖПРОБЕЛЫ(source!A2:A)
B2 ЗНАЧЕН(СЖПРОБЕЛЫ(source!B2:B)) формат: дата и время
C2 СЖПРОБЕЛЫ(ПЕЧСИМВ(source!C2:C))
D2 СЖПРОБЕЛЫ(ПЕЧСИМВ(source!D2:D))
E2 СЖПРОБЕЛЫ(ПЕЧСИМВ(source!E2:E))
F2 SPLIT → СЖПРОБЕЛЫ → СТРОЧН → tg = telegram (заполняет F и G)
H2 СТРОЧН(СЖПРОБЕЛЫ(ПЕЧСИМВ(source!G2:G)))
I2 СТРОЧН(СЖПРОБЕЛЫ(ПЕЧСИМВ(source!H2:H)))Каждая формула обёрнута в ARRAYFORMULA(ЕСЛИ(…="";;…)). Восемь формул описывают обработку любого количества строк.
Обычно в ячейках видны результаты формул. Режим показа формул выводит в ячейках сами формулы.
Так удобно проверить набор правил целиком: вторая строка leads_clean показывает все восемь формул.
Откройте Вид → Показать → Формулы (сочетание клавиш Ctrl+`). Во второй строке вместо значений появятся формулы.
Режим включается и выключается одной и той же командой. Пока он включён, ничего не меняйте.
Откройте лист source. В нём по-прежнему TG, NEW, пробелы и source|medium в одном поле.
Вернитесь на лист leads_clean: в нём очищенные значения тех же заявок.
Формулы пересчитываются сразу после ввода. Лист leads_clean уже содержит результат, отдельной команды загрузки нет.
Проверьте результат по контракту: 9 столбцов, 5 заявок, ошибка #VALUE! у REQ-003.
Проверьте каждую строку:
Имена листов показывают роль данных:
source данные из CSV, не редактируются
leads_clean результат правил, не редактируетсяОба листа заполняются без ручного ввода значений: source — импортом, leads_clean — формулами.
Для пяти строк ручная очистка была бы быстрее. Преимущество формул видно, когда приходит новая выгрузка.
Сейчас данные будут заменены, и ни одна формула не будет введена повторно.
Откройте data/leads_dirty_v2.csv в текстовом редакторе так же, как leads_dirty.csv на шаге просмотра, и закройте без сохранения.
Во втором файле 8 заявок: к пяти прежним добавлены REQ-006, REQ-007 и REQ-008.
Ошибки в новых строках того же вида: пробелы, регистр, TG, source|medium и ещё одна ошибочная дата у REQ-008.
Формулы leads_clean ссылаются на лист source. Чтобы они обработали новые данные, v2 импортируется на этот же лист с заменой содержимого.
Новый лист или новая таблица для v2 не создаётся: формулы на них не ссылаются.
Строки v2 нельзя вставлять в leads_clean вручную. Если ввести значение в ячейку, которую заполняет формула, формула не сможет вывести результат, и в A2 появится #REF!. В подсказке написано: «Массив не выведен, поскольку это привело бы к перезаписи данных в диапазоне A7».
На снимке в ячейку A7 введён текст. После проверки ввод отменён сочетанием Ctrl+Z (на Mac — ⌘Z).
Откройте лист source. Выберите Файл → Импортировать → Добавить и загрузите leads_dirty_v2.csv.
Настройки те же: Заменить текущий лист, Запятая, флажок преобразования снят. Нажмите Импортировать данные.
Откройте лист leads_clean. Его не редактировали: после импорта таблица пересчитала все восемь формул на новых данных.
СЖПРОБЕЛЫ, ПЕЧСИМВ, SPLIT, СТРОЧН, замена tg и преобразование даты выполнены для восьми строк.
ПРАВИЛА записаны один раз
ДАННЫЕ заменяются при каждой выгрузке
ПЕРЕСЧЁТ выполняется автоматическиВ source строка REQ-006 записана так:
" Елена ", " TG | SOCIAL ", " LESSON08 ", " NEW "В leads_clean она должна выглядеть так:
Елена · telegram · social · lesson08 · newУ REQ-008 в created_at снова #VALUE!: вторая ошибочная дата тоже осталась видимой.
Включите Вид → Показать → Формулы. Во второй строке те же восемь формул, что и до импорта.
После импорта изменились только данные на листе source. Выключите режим той же командой Вид → Показать → Формулы.
Формулы находят данные по буквам столбцов. source!F2:F означает «шестой столбец», какое бы имя ни стояло в его заголовке.
Если в новой выгрузке перед source_medium появится ещё один столбец, формула F2 начнёт делить на части кампанию. Ошибки не будет: в результате окажутся неверные значения.
Проверка ставится на отдельный лист: если поставить её рядом с таблицей, она попадёт в скачанный CSV лишним столбцом.
Добавьте лист кнопкой +, переименуйте его в check и в ячейку A1 введите:
=ЕСЛИ(JOIN(",";source!A1:H1)="request_id,created_at,name,email,direction,source_medium,utm_campaign,status";"структура source: OK";"СТОП: изменились столбцы source")JOIN склеивает заголовки source через запятую. Формула сравнивает их с контрактом и сообщает, совпадает ли структура.
Ошибка значения — #VALUE! в одной ячейке. Остальные строки обработаны, проблема видна сразу.
Ошибка структуры — изменился порядок или названия столбцов. Формулы продолжают работать, но берут не те данные. Такую ошибку показывает только лист check.
В копии таблицы откройте лист source и в ячейку F1 введите traffic вместо source_medium. Откройте лист leads_clean: данные выглядят как прежде. Откройте лист check: в A1 появилось сообщение «СТОП: изменились столбцы source».
После опыта закройте вкладку с копией. Рабочая таблица leads_cleaning не изменилась.
Порядок диагностики:
Лист source — копия CSV.
Формулы второй строки leads_clean.
Значения, которые формулы выводят на лист leads_clean.
Формулы этой темы приводят значения к контракту. Итоговые формулы — СУММ, СРЗНАЧ, СЧЁТ — считаются уже по подготовленным данным, и одинаковые значения попадают в одну группу.
Лист leads из темы 7 остаётся местом, куда приходят заявки.
Таблица leads_cleaning получает выгрузку и готовит её к анализу. Новые заявки в неё не поступают: она работает только с загруженным CSV.
В этой теме исправлены пробелы, регистр, структура столбцов, типы и запись значений.
Не проверены:
Строка REQ-001 · new выглядит аккуратно. Если заявка REQ-001 уже есть в таблице, это дубль.
Проверка качества смотрит на набор строк целиком: повторы, пропуски, количество.
Проверка качества включает:
CSV v1 → source → формулы leads_clean → результат.
CSV v2 → source → те же формулы → новый результат.
Сохранён способ обработки данных: его можно применить к любой следующей выгрузке той же структуры.
Сейчас заявки приходят только от тех, кто сам нашёл сайт. В следующей теме разбирается, как привести пользователя из Instagram:
комментарий под публикацией
↓
личное сообщение от ManyChat
↓
материал на сайте по ссылке с UTM
↓
форма
↓
GA4 и Google ТаблицыЗаявки из этой цепочки попадают в тот же лист leads и готовятся к анализу так же, как в этой теме.