Подготавливая семантическое ядро для нового проекта каждый специалист по контекстной рекламе сталкивается с необходимостью обработать огромное количество строк в таблице, выявив и удалив среди поисковых фраз неявные дубли.
Неявные дубли – фразы, состоящие из одних и тех же слов, расположенных в разном порядке. Например, “купить цветы” и “цветы купить”.
Есть много разных способов сделать это – от чистки вручную до использования специальных сервисов или формул для Google Таблиц и Excel. Но вручную – долго, сервисы требуют регистрации и часто имеют ограничения в бесплатных версиях, а формулы для таблиц не учитывают частотность поисковой фразы.
Так какой же из вариантов выбрать?
Полезный скрипт от Peklo Company
Для экономии времени наших специалистов мы используем кастомный скрипт для Google Таблиц. Он идеально справляется с задачей и чистит неявные дубли с учётом частотности, оставляя фразу, частотность которой выше.
Скорость работы скрипта зависит от количества строк в таблице, которые необходимо обработать. В качестве примера приведём результаты последнего запуска – в таблице было 2 703 строки, скрипт обработал их за 2 минуты и удалил 244 дубликата. Впечатляет, не правда ли?
Пример выполнения чистки при помощи скрипта
Пример логирования времени выполнения скрипта
Код скрипта для чистки неявных дублей:
function removeDuplicatePhrases() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const data = sheet.getDataRange().getValues();
// Создаем объект для хранения фраз и их частотностей
const phrasesMap = {};
// Проходим по всем строкам и собираем фразы
for (let i = 0; i < data.length; i++) {
const phrase = data[i][0]; // Столбец A
const frequency = data[i][1]; // Столбец B
if (!phrase || !frequency) continue;
// Нормализуем фразу для сравнения (сортируем слова по алфавиту)
const normalized = normalizePhrase(phrase);
// Если такой вариант уже есть, сравниваем частотность
if (phrasesMap[normalized]) {
if (frequency > phrasesMap[normalized].frequency) {
// Заменяем на вариант с большей частотностью
phrasesMap[normalized] = {
original: phrase,
frequency: frequency,
row: i + 1 // Нумерация строк начинается с 1
};
}
} else {
phrasesMap[normalized] = {
original: phrase,
frequency: frequency,
row: i + 1
};
}
}
// Находим строки для удаления (все, кроме сохраненных в phrasesMap)
const rowsToKeep = new Set();
for (const key in phrasesMap) {
rowsToKeep.add(phrasesMap[key].row);
}
const rowsToDelete = [];
for (let i = 1; i <= data.length; i++) {
if (!rowsToKeep.has(i)) {
rowsToDelete.push(i);
}
}
// Удаляем строки снизу вверх, чтобы не сбить нумерацию
rowsToDelete.sort((a, b) => b - a);
for (const row of rowsToDelete) {
sheet.deleteRow(row);
}
SpreadsheetApp.getUi().alert(`Удалено ${rowsToDelete.length} дубликатов.`);
}
function normalizePhrase(phrase) {
// Удаляем лишние пробелы и приводим к нижнему регистру
const cleaned = phrase.toString().trim().toLowerCase();
// Разбиваем на слова, сортируем и собираем обратно
const words = cleaned.split(/\s+/).filter(word => word.length > 0);
words.sort();
return words.join(' ');
}
Автоматизация работы при помощи кастомных скриптов
Эта задача – не единственная, которую мы решаем при помощи автоматизации. Часть полезных скриптов мы публикуем в нашем блоге в открытом доступе. Некоторые решения мы не можем показать открыто, оставляя эти наработки только для внутреннего пользования.
Если вы в своей работе сталкиваетесь с рутинными задачами в Google Таблицах, вы можете заказать у нас кастомный скрипт для автоматизации этих задач и экономии своего времени. Для этого свяжитесь с нами любым удобным способом: ссылка на все наши контакты.