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

Многие SMM-щики вынуждены проходить все круги ада, пока не автоматизируют максимум процессов при проведении нетипичных конкурсов. Поэтому хотим поделиться некоторыми из используемых нами технических лайфхаков.

Конкурс прогнозов

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

И да, любые призывы делать всё в едином формате обычно игнорируются. Аудитория не любит читать условия конкурса – «Monkey see – Monkey do», сделают примерно как у всех, не глядя в правила.

Что же было предпринято нашим маркетологом (с техническим прошлым)? Процесс очистки данных в Excel был автоматизирован несколькими VBA-макросами. Рассказываем про каждый.

Перед началом копируем старым дедовским «Ctrl+C» – «Ctrl+V» методом данные в таблицу. И дублируем в соседнюю ячейку те же данные, они пригодятся, чтобы можно было сравнить результат работы макросов с оригиналом.

Первым делом надо удалить всё, кроме цифр и десятичных знаков. Первый макрос делает именно это:

Const AlfaBet As String = "=-/\()`'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя"

Sub Macros1CharDel()
    Set R = Application.Selection
    
    R.Replace What:=".", Replacement:=",", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
    
    R.Replace What:=" ", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
    
    R.Replace What:="+", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
    R.Replace What:="$", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
    
    R.Replace What:="~?", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
    R.Replace What:="~!", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
    R.Replace What:="~#", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
    R.Replace What:="~;", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
    R.Replace What:="~@", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
    
    R.Replace What:=":", Replacement:="%", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
    
    Dim n As Integer, i As Integer, S() As String
    n = Len(AlfaBet): ReDim S(1 To n)
    For i = 1 To n
        S(i) = Mid(AlfaBet, i, 1)
        R.Replace What:=S(i), Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
    Next i
End Sub

Задаём алфавит, по которому потом пройдём циклом, удаляя все символы из списка.

Дальше идёт предварительное причёсывание данных:

  1. Меняем все точки на запятые, именно они выступают десятичным знаком в Excel.

  2. Удаляем все пробелы.

  3. Дальше по одному удаляем спецсимволы (в цикле обработать не выйдет, он захватывает только один символ, а в макросах они должны экранироваться тильдой).

  4. Подменяем для удобства двоеточие на знак процента, иначе рискуем получить в итоге ячейки со «временем» после удаления лишних символов.

Наконец данные готовы для удаления символов из заданной в самом начале строки.

Второй макрос удаляет размеченные ранее даты:

Sub Macros2DatesDel()
    Set R = Application.Selection
    
    R.Replace What:="*%*", Replacement:="", LookAt:=xlWhole, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
      
End Sub

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

Выход есть, заставляем Excel работать, меняя формат ячеек третьим макросом:

Sub Macros3DoNumbers()
    For Each Cell In Selection
    If Cell.Value <> "" And IsNumeric(Cell.Value) Then
        Cell.Value = (Cell.Value * 1)
        Cell.NumberFormat = "General"
    End If
    Next
End Sub

И вот у нас уже нужный результат. Визуально уже можно определить где числа. Но, всё же полученные данные портят оставшиеся записи о лайках (эти 1,2 или 3…).

Делаем последний макрос:

Sub Macros4DelLittleNumbers()
    For Each Cell In Selection
    If Cell.Value < 1000 And Cell.Value > 0 Then Cell.Clear
    Next
End Sub

Им мы удалили всё, что меньше тысячи. Но не трогали отрицательные значения, если где-то закралась ошибка, и прилипшее тире превратило число в отрицательное.

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

Быстро исправляем ошибки, благо справа у нас есть оригинал для сравнения. Всё, переносим на страничку с сортировкой разницы от цифры по модулю =ABS(A2-B$2)и сортируем ASC.

Список претендентов готов, дальше скучная маркетинговая рутина. Ниже простенькая гифка, иллюстрирующая этапы работы макросов:

Викторина с купонами

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

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

Первый этап: Экспортируем ответы викторины в CSV и считаем правильные ответы в каждой графе. В итоге получаем список: ссылка + верные ответы.

Копируем, чтобы избавиться от дублей (при вставке указываем: только уникальные значения) на столбце с именами. Все повторные попытки стираются – profit.

Полученный CSV импортируем в любую БД, у меня под рукой mysql. А дальше ловкость рук и никакого мошенничества:

<?php
$link = mysqli_connect("хост", "логин", "пароль", "база");
mysqli_query($link, "SET NAMES utf8");
$names = mysqli_query($link, "SELECT * FROM `таблица`");
$number=1;
while ($arr = mysqli_fetch_array($names)) { while ($arr[2]>0) {echo $number++.';'.$arr[1].'<br>'; $arr[2]--;}}
?>

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

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

А тут всё просто, отбираем претендентов вертикальным просмотром по номеру из рэндомайзера: =VLOOKUP(C9;'Список билетов'!A:B;2;0)

Проверяем адекватность победителей и готово!

Конкурс с комментариями

И если этого вам показалось мало, ловите ещё один мини-лайфхак для очередного типа конкурса.

По условиям необходимо просто оставить комментарий под публикацией. А нам, как маркетологам, достать список участников, не прибегая к лишним инструментам.

Делаем старый добрый «Ctrl+C» – «Ctrl+V» комментариев в табличку (с сохранением исходного форматирования).

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

Sub доставательссылок()
With ActiveSheet
For I = 1 To .Hyperlinks.Count
.Hyperlinks(I).Range.Offset(0, 1).Value = .Hyperlinks(I).TextToDisplay
.Hyperlinks(I).Range.Offset(0, 2).Value = .Hyperlinks(I).Address
Next I
End With
End Sub

В первом столбце текст ссылки (Имя и Фамилия), а во втором сама ссылка.

А теперь удаляем из списка ссылки на публикации:

Sub удалятельпостов()
    Set R = Application.Selection
    
    R.Replace What:="*wall*", Replacement:="", LookAt:=xlWhole, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
      
End Sub

Готово! Удаляем дубли и вставляем в рэндомайзер.


Надеемся, было полезно. И чьи-то соцсети теперь наполнятся более глубокими конкурсами, чем простые угадайки с подключёнными ботами.

А если есть идеи для новых активностей или упрощения приведённых схем, делитесь в комментариях.

Комментарии (3)


  1. PereslavlFoto
    11.06.2023 19:03
    +2

    Set R = Application.Selection

    Вы память не бережёте. Используя with, потратим меньше памяти.

    Меняем все точки на запятые, именно они выступают десятичным знаком в Excel.

    Это неверно. Десятичным знаком является десятичный знак. Его следует прочитать из локали как Application.DecimalSeparator.

    Sub Macros3DoNumbers()

    Если сделать эту обработку в отдельном столбце при помощи функций Excel, обработка пройдёт намного быстрее. Вообще, вы делаете макросами то, что быстрее и проще сделать в соседнем столбце.

    Аномалии будут выровнены по левой стороне, а правильные цифры по правой

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


    1. BestChange Автор
      11.06.2023 19:03
      +1

      Вы память не бережёте. Используя with, потратим меньше памяти.

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

      Это неверно. Десятичным знаком является десятичный знак. Его следует прочитать из локали как Application.DecimalSeparator.

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

      Если сделать эту обработку в отдельном столбце при помощи функций Excel, обработка пройдёт намного быстрее. Вообще, вы делаете макросами то, что быстрее и проще сделать в соседнем столбце.

      Про быстрее и проще очень спорно. Что проще, чередовать способы обработки макросами и формулами в соседних столбцах, либо просто по очереди нажать на 5 строчек в меню разработчика? Кому как удобней, но ваш метод тоже имеет место быть, если перевалим сильно за существующую 1000 участников конкурса, будем экономить память при обработке.

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

      Здесь речь о дополнительном контроле автоматики. Иногда (редко) могут проскочить ошибки. Например, если пользователь оставил прогноз 12,345.67, наши макросы превратят это в 12,345,67, что не станет числом без дополнительных обработок регулярными выражениями. Это можно было бы автоматизировать, но ввиду редкости таких ошибок оставили на откуп маркетологам. Всё равно дополнительный контроль для выявления новых ошибок будет полезен.

      В любом случае, большое спасибо за такую конструктивную критику!


      1. PereslavlFoto
        11.06.2023 19:03

        Про быстрее и проще очень спорно.

        В оправдание скажу, что пришёл к этим выводам, обрабатывая столбцы по сто тысяч строк. Поэтому такие предостережения я вижу уже не разумом, а спиной.