Как научиться читать скрипты Google Ads: основы JavaScript для РРС-специалистов
Большой материал от технического директора в агентстве Penguin-team Дениса Березкина поможет разобраться с тем, как пишутся и работают скрипты в Google Ads.
Скрипты могут реально сильно упростить работу РРС-специалиста: на них можно переложить часть ежедневного менеджмента, они могут делать первичный аудит для новых клиентов, помогают в оптимизации. Да, всё это можно делать и руками, но времязатраты несравнимы.
Основная сложность в том, что для использования скрипта неплохо иметь возможность разобраться в том, а что, собственно, этот скрипт делает и не будет ли каких-либо подводных камней при его использовании. Чтобы эта возможность была, надо уметь читать скрипты.
«Минуточку, но я же РРС-специалист, а не разработчик. Что теперь, еще язык программирования учить?».
Нет, конечно, весь язык программирования можно не учить. Хорошая новость в том, что чтобы читать скрипт, не надо владеть JS в совершенстве. Достаточно знать базовые понятия. И эта статья — как раз про них!
Как читать эту статью?
Давайте проясним, что за текст перед вами.
Что даст этот гайд?
Его задача — научить читать скрипты РСС-специалиста, который работает с Google Ads. Мы не учим писать скрипты. Писать скрипты — это на курсы JavaScript.
Для кого это написано?
Проще всего будет специалистам по Google Ads с базовым знанием английского, так как в коде используется много английских слов (select, get, row). Без английского тоже можно, но надо будет выучить пару конструкций.
Можно я просмотрю бегло, пойму суть и пойду?
В отличие от большинства статей, этот текст не получится просмотреть по диагонали и уловить суть. Язык — что программирования, что обычный человеческий язык коммуникации — требует последовательности. Чтобы понять язык, его изучают в определенном порядке. Если вы пропустите условный алфавит, то читать слова тоже не сможете. Не умеете читать слова — не научитесь понимать фразы.
И сколько его читать?
Один час — на вдумчивое чтение. В процессе работы, когда вы будете читать реальные скрипты, вам, вероятно, нужно будет возвращаться, чтобы вспомнить определенные понятия.
Как читать, чтобы точно понять?
Выделите свободное время. Эта статья — это ваше обучение. Между делом научиться чему-то сложновато, согласитесь. Читайте все разделы последовательно, не перескакивая через фразы. Смотрите на примеры. Если вы не поняли, как мы пришли к определенной мысли, вернитесь назад. Мы старались максимально связать между собой все объяснения, чтобы могли проследить логику и точно все понять.
А проще нельзя было?
Можно. Но мы не умеем :) Если вы знаете, как проще объяснить какое-то из понятий, напишите это в комментариях под статьей. Другим читателям наверняка пригодятся ваши знания и опыт!
P.S. Да, раздел «Вводная» тоже важен. Сначала кажется, что там все банально и слишком просто. Но в нем мы начинаем объяснять некоторые вещи, на которые будем ссылаться дальше. Прочитайте их, чтобы дальше тоже было понятно.
Вводная
Код — это не обычный текст, его нельзя написать в свободной форме:
Дорогой Скрипт!
Пишу тебе с надеждой на скорый отклик. Пришли мне, пожалуйста, 50 аккаунтов, да чтобы каждый был с меткой eCommerce и никакой другой. Искренне твой, РРСшник.
Так, конечно, не получится.
Скрипт (да и любой код) — это четко структурированная система. Каждый элемент информации в ней (запрос на получение данных, команда фильтровать данные) написан в определенном виде. Это — стандарты синтаксиса, то есть «скриптописания». Их нельзя менять — иначе система не поймет, что значат все эти символы, а скрипт не будет работать.
Чтобы система понимала, что от нее нужно, у всех элементов есть названия и значения.
Фамилия — это название данных. Иванов — это значение этих данных.
Как это работает в рамках скрипта? Вернемся к примеру выше. Нам надо, чтобы скрипт выбрал в управляющем аккаунте 50 аккаунтов с меткой eCommerce. Как будет выглядеть код?
Сначала говорим, что нам нужны аккаунты (без количества и меток).
Эта строка говорит: выбери аккаунты = аккаунты, которые привязаны к этому МСС (в который я добавил этот скрипт)
Теперь нужно сделать так, чтобы выбрались только аккаунты с определенной меткой. И не все возможные, а только 50 штук. Для этого мы задаем условие («выбери, пожалуйста, с меткой») и лимит («не все, а только 50 штук»). Если у вас есть хотя бы базовый английский, следующая часть кода будет понятна вам сразу:
А теперь еще раз — и все вместе:
Повторим!
У данных есть названия («Фамилия») и значения («Иванов»). В скрипте можно уточнять условия сбора данных (только с определенной меткой) и лимиты (только 50 штук).
Пока понятно? Тогда идем дальше.
Переменные
Есть разные скрипты. Одни ищут нерелевантные площадки в кампаниях для КМС. Другие сообщают про конфликт между ключами и минус-словами. Третьи следят за бюджетом и останавливают кампании при перерасходе. Всё это — данные, которые скрипт обрабатывает.
Площадки в КМС — это данные.
Ключевые слова — это данные.
Минус-слова — это тоже данные.
К данным относится несколько важных понятий. Два из них вы уже знаете:
- название (имя, фамилия, пол);
- значение (Ваня, Иванов, мужской);
Есть третье важное понятие — переменная. Это контейнер, такой кусочек кода, где хранятся данные. Последовательно эта цепочка в коде выглядит так:
Переменная названиеДанных = значениеДанных
К примеру:
var — это и есть обозначение переменной. Переменные «объявляют» — то есть указывают их вот таким образом в начале строки. Это нужно, чтобы система поняла, что дальше будут данные, какие данные будут, сколько места оставить для их хранения в оперативной памяти.
var — не меняется. Если разработчик хочет написать переменную, в начале строки он укажет var. Оно не изменяется ни при каких условиях. Нужна переменная — напиши в начале строки var.
Все данные в скрипте хранятся в переменных. Если хотите знать, какие данные использует скрипт, смотрите на все строки с var в начале.
Название переменной
После var стоит название переменной («Фамилия») — своего рода название данных. Данных много, а их название разработчики придумывают сами. К примеру, мы можем назвать переменную для ключевых слов:
- keywords
- kluchevye_slova
- kwords
— как хочешь, так и записывай! В хороших скриптах названия обычно прописаны понятно. Это помогает пользователю сразу понять, какие данные тут используются.
Собственно, все данные, которые существуют, как-то названы. А существует их ооооочень много. Всё в вашем аккаунте Google Ads — это данные. Ставки, бюджет, ключи, заголовки объявлений, пути, ссылки на посадочные... — это всё данные. И все они — разные. Соответственно, если вы хотите что-то сделать с любыми из этих данных, вам нужно назвать, с какими из них вы хотите работать.
- var keywords — название переменной keywords, будем работать с ключами;
- var campaign — название переменной campaign, будем работать с кампаниями;
- var period — название переменной period, будем работать с каким-то периодом времени.
Название данных разработчик придумывает и прописывает сам. Здесь есть подвох: скрипты часто не работают (или работают некорректно) из-за ошибок в названиях. К примеру, в них важен регистр: переменные accountSelector и accountselector — это две разных переменных.
Если в начале скрипта стоит переменная accountSelector (наш первый пример про 50 аккаунтов с меткой, помните?), то скрипт соберет в эту строку аккаунты, которые подходят под условия. Если потом вы захотите, к примеру, чтобы скрипт изменил в них метки, нужно, чтобы скрипт снова обратился к строке accountSelector. Если написать эту задачу с переменной accountselector, задача не будет выполнена. Потому что переменной accountselector у вас в скрипте нет. А accountSelector — есть.
Повторим!
Переменная — это контейнер, в котором хранятся данные. Строка с переменной начинается с var. У переменной есть название («Фамилия») и значение («Иванов»). К переменным можно применять условия (название метки содержит) и лимиты на сбор данных (50 штук). Самый быстрый способ понять, какие данные использует скрипт, просмотреть строки с var.
Идем дальше!
Типы переменных
Внутри переменных может быть разная информация: число, строка, массив данных... То есть это разные типы переменных.
- Объявление переменной — var в начале строки. Это постоянная формулировка, она никогда не меняется.
- Название переменной — как к ней обращаться (Фамилия, keywords). Названия мы придумываем сами.
- Значение переменной — собственно, данные (Иванов, «Пластиковые окна Москва купить»). Значения переменной (т.е. конкретные данные) аккаунт берет из того места, которое вы укажете.
- Тип переменной — что там за данные, числовые они или текстовые, а может переменная пустая. К примеру, 1 — это тип переменой число. 0 — это тоже тип переменной число, потому что 0 — это уже количество.
Тип данных нельзя придумать: есть уже существующие типы данных, которыми мы можем пользоваться. Вот какие типы данных встречаются чаще:
- number;
- string;
- boolean;
- null;
- undefined;
- объекты object.
Разберемся с ними.
number — это тип данных число (кэп!)
Такой тип переменной включает:
- непосредственно цифры;
- специальное значение Infinity (бесконечность), если происходит деление на ноль;
- специальное значение NaN (not-a-number, не-число), если происходит ошибка в математической функции (к примеру, если умножить число на бесконечность) или в строке оказывается не число, а текст.
И всё, ничего другого в этом типе данных быть не может.
Вот так выглядит этот тип данных:
var number = 100500;
Без кавычек. Это важно, потому что есть тип переменной...
string — строка
В строке обычно хранятся текстовые данные. Значение переменной («Иванов») пишется в кавычках.
Вот так выглядит этот тип данных:
var string = 'blablabla';
Важно!
var string = '100500';
— это тоже считается как тип переменной строка, а не число. То есть с var string = ‘100500’ мы не можем осуществлять никаких арифметических операций, потому что для скрипта это не цифры (var number = 100500), а текст (стопицот). Стопицот не умножается.
В тип данных строка можно вносить любые значения данных: кириллицу, латиницу, цифры.
boolean — булевый (логический)
Такой тип переменной включает всего два значения:
- true — истина (да);
- false — ложь (нет).
Обычно его используют именно для обозначения да / нет.
К примеру, есть скрипт Exact Match для кросс-минусовки в Google Ads. Если объявление показано по поисковому запросу, который соответствует ключу в точном соответствии, всё ок. Если запрос не совпадает с точным соответствием, скрипт добавит такой запрос в минус-слова или отправит вам на почту, чтобы вы отминусовали его вручную.
В самом начале есть вот такой кусочек кода:
var makeChanges = true;
То есть:
объявилиПеременную вноситьИзменения = да;
В этом случае скрипт действительно будет сам автоматически исключать поисковые запросы, которые не совпадают с точным соответствием. А можно переписать его и сделать:
var makeChanges = false;
То есть «нет, не вносить изменения». Тогда скрипт не будет сам минусовать слова. Вместо этого он будет присылать вам список таких поисковых запросов, а вы дальше уж сами исключайте их (или нет).
Или, к примеру, скрипт Google Shopping для показа рекламы по запросам в точном соответствии. В нем есть такая часть:
if (keywordWords[k].length > 4) {
words[campaignName][adGroupName][keywordWords[k]] = true;
Прочитайте ее. Просто прочитайте на английском:
Если слов ключа длина > 4
слов [тут указано, откуда брать слова] = true
То есть это условие. Нужно сделать что-то. «Если в ключе больше 4 слов» — да, делаем.
null — специальное значение
Это отдельный тип, в котором может быть только одно-единственное значение — null. Он используется, чтобы показать изначально пустое состояние переменное. null — это не 0. Ноль — это количество, результат. Четыре минус четыре равно ноль. null — это отсутствие и четырех, и минуса, и нуля.
Пример от нашего разработчика: «У вас есть корзинка для яблок, но в ней яблок еще нет, то есть их 0. А NULL в таком случае — это когда нет даже самой корзинки».
var number = null; // создали контейнер для числа, но его еще нет, оно неизвестно;
number = 0; // присвоили цифру 0, теперь у нее точно определено значение и оно равно 0.
undefined — специальное значение
Тоже включает только одно значение undefined. Используется, если значение не присвоено. К примеру, если переменную объявили, но ничего в нее не записали (т. е. у нее нет данных).
object — объекты
Объекты используются, чтобы «коллекционировать» данные. К примеру:
var bird = penguin
— это простая сущность. Птица — пингвин. И всё. Просто.
А теперь посмотрите сюда:
var bird = {name : "Penguin", age : '30', email: 'snow@arctica.com' };
— это уже более сложная сущность. Птица — это когда имя Пингвин, возраст 30, email snow@arctica.com. То есть мы сделали «коллекцию» данных: имя, возраст, email. Чтобы объединить данные в объекты (и потом использовать их сразу таким набором), используют фигурные скобки {...}.
Функции
Мы написали скрипт. Он делает много разных вещей: выгружает все кампании, показывает количество групп в кампании, количество объявлений в группе, проверяет наличие модификаторов... А потом создает новую папку на Google Диске, создает новую Google Таблицу и в ней выводит все собранные данные. Это, кстати, скрипт для аудита кампаний.
Как видите, довольно много задач. Одна задача — это как минимум пара строчек кода. К примеру, есть задача — получить Google Таблицу по URL от пользователя. Если пользователь не дал URL, тогда скрипт должен создать Google Таблицу. Вот код, который ее выполняет:
function getSheetByName(spreadsheet, newSheetName) {
var sheet = spreadsheet.getSheetByName(newSheetName);
if (sheet != null) {
sheet.clear();
} else {
sheet = spreadsheet.insertSheet(newSheetName, 0);
}
return sheet;
}
А теперь представьте, сколько строк занимает код всего скрипта. Подскажем: 566 строк. Неплохо, да? А теперь представьте, каково управлять 566 строками... Уууу...
Проведем аналогию с РРС. Когда вы настраиваете рекламу в Google Покупках, вы не запихиваете все товары в одну группу, правда? Обычно вы как-то разделяете товары, к примеру, по кампаниям. Кампания «Штаны», кампания «Футболки», кампания «Носки». Элементами проще управлять, когда они как-то гранулированы. Разделяй и властвуй!
Или, к примеру, текст. Одно дело — полотно текста без подзаголовков, сплошные абзацы. Другое дело — текст с понятными разделами: вот тут говорим про переменные, вот тут — названия, вот тут — типы.
С кодом то же самое. Чтобы поделить код на какие то понятные и завершенные блоки, используют функции. Функция — это способ показать, что весь код в ней связан, в идеале — что он делает одно действие.
Чтобы обозначить функцию, строку начинают с function:
function showMessage() {
alert( 'Привет всем присутствующим!' );
}
Функция — это готовый кусок кода, который можно использовать повторно. К примеру, разработчик может один раз написать код для исключения ключей. В первый раз он прописывает код полностью. Если дальше в коде снова нужно исключить ключи, он не пишет такой же код еще раз, а просто вызывает функцию, которую написал раньше.
То есть можно каждый раз в скрипте набирать одинаковый код. А можно написать его раз, «завернуть» в функцию и в следующий раз сразу вызвать функцию.
Основная задача функции для разработчика — избавить от необходимости дублировать код, чтобы не раздувать скрипт до 100500 строк.
Чтобы вызвать функцию, которая создана где-то в другой части кода, пишут ее название и скобки ():
А вот весь код, который входит в функцию, записан ниже. Он начинается со слова function и уже дальше идет название, по которому можно вызвать функцию в другом месте:
Кстати, весь скрипт — это ведь тоже готовый кусок кода, так? Чтобы показать это, весь скрипт от начала и до конца «заворачивается» в функцию. Она называется main — главная. То есть каждая функциональная часть скрипта начинается с таких строк:
Сущности
Вспоминаем: у нас есть кампании «Штаны», «Футболки», «Носки». В этом случае кампания — это сущность. А «Штаны», «Футболки», «Носки» — это элементы, которые относятся к этой сущности.
- элементы Боня, Шарик, Бобик — сущность Собаки;
- элементы Мурка, Тимофей, Барсик — сущность Коты;
- элементы «Межсезонные», «Черная пятница», «Праздничные» — сущность Метки;
- элементы «Максимизация конверсий», «Максимизация ценности конверсий» — сущность Стратегии биддинга.
Принцип понятен? То есть сущность — это когда несколько элементов можно объединить одним понятием.
В рамках Google Ads есть готовые сущности. Мы не можем придумать новые сущности, но можем оперировать существующими. Вот какие сущности есть в Google Ads:
- Account Labels;
- Accounts;
- Ad Customizers;
- Ad Groups;
- Ad Params;
- Ads;
- Bidding;
- Budget Orders;
- Budgets;
- Campaigns;
- Display;
- Drafts and Experiments;
- Excluded Placement Lists;
- Keywords;
- Labels;
- Negative Keyword Lists;
- Negative Keywords;
- Search Audiences;
- Shopping;
- User Lists;
- Video.
Сущности, как вы понимаете, нужны, чтобы не прописывать каждый элемент по отдельности, а объединить их в группы. То есть вместо того, чтобы вручную указывать все 100500 нужных кампаний, можно просто написать:
Итого: скрипт возьмет все кампании со статусом ENABLED.
Метод
Сначала давайте отступим на шаг назад.
Что такое функция? Функция — это завершенный кусок кода с ограниченной функциональностью. То есть если нам надо добавить метки во все кампании, мы последовательно прописываем код, который будет выполнять эту задачу. Только тогда скрипт может это сделать.
Но постойте-ка...
Функция — это когда мы сами прописываем код для выполнения действия.
Метод — это когда мы этот код не пишем. Он уже написан самим Google на стороне Google. То есть мы просто называем, что нужно сделать — и Google сам понимает, что мы хотим:
- getAvaregePosition — получить среднюю позицию
- getCampaignIds — получить ID кампаний
- getDataRange — получить диапазон данных
И так дальше. Соответственно, методы мы тоже не можем придумать сами — мы используем готовые методы, которые придумал и написал у себя Google. Они достаточно простые для понимания, потому что разработчики Google используют понятные названия, которые четко отражают задачу, которую этот метод выполняет.
Чтобы облегчить работу (разработчиков, в первую очередь, но нам это тоже на руку), Google сделал для каждой сущности готовые методы, которые оказываются нужны чаще всего. К примеру:
- getCampaignIds — получает ID кампаний из аккаунта;
- addCampaignIds — добавляет ID кампаний (к примеру, в отчет);
- orderByCampaignIds — сортирует данные по ID кампаний (в отчете).
Или вот для других сущностей:
- enable — включает (к примеру, рекламную кампанию);
- set — устанавливает значения;
- remove — удаляет значение;
- new — создает что-нибудь.
И так далее.
Селекторы
Есть методы, которые выполняют действие (получить значения заданного параметра — getValues).
Также методы используются для того, чтобы уточнить задачу. И вы это, между прочим, уже знаете!
Вспомните:
withCondition — это метод, который задает условие выполнения.
withLimit — это метод, который задает лимит на количество элементов.
Есть и другие методы для уточнения запроса. Такие методы называются селекторами. Они тоже прописаны на стороне Google — и их целый большой список:
- withCondition() — добавляет условие;
- withIds() — добавляет набор ID в качестве условия;
- orderBy() — уточняет, в каком порядке сортировать элементы;
- forDateRange() нужен, если вы сортируете информацию по какой-то статистике (по количеству показов, по CTR) и хотите ограничить диапазон данных (к примеру, сортировать по количеству показов, но выбрать только те объявлений, у которых больше 100 показов).
К примеру, вот кусок из скрипта, который делает аудит:
var campsWithConversions = AdWordsApp.campaigns() — переменная кампании с конверсиями
.withCondition(’Status = ENABLED’) — условие: статус ENABLED
.forDateRange(’LAST_7_DAYS’) — диапазон данных: за последние 7 дней
.withCondition(’Conversions > 0′) — условие: конверсий больше, чем 0
Итератор
Повторим!
- Функция — это когда мы сами написали кусок кода, который выполняет определенную задачу.
- Метод — это когда код написан на стороне Google.
- Селектор — это метод, написанный на стороне Google, который уточняет задачу: задает условия или лимиты, к примеру.
Следующий в ряду — итератор.
Когда вы запускаете скрипт и просите, к примеру, добавить метки к кампаниям, скрипту неизвестно, а сколько-то кампаний у вас в аккаунте. Сколько меток ему ставить? Десять? Сто? Одну? Когда остановиться? Тут приходит на помощь итератор.
Итератор нужен, когда на старте неизвестно количество элементов, над которыми нужно выполнить действие. Либо они в принципе неизвестны, либо список большой и его нельзя одномоментно загрузить (потому что на это нужно много памяти).
Когда скрипт работает, итератор перебирает элементы (ключи, группы, кампании, аккаунты — что в скрипте написано, то и перебирает), над которыми выполняется задача.
Есть два итератора:
- hasNext()
- next()
Вот где вы можете их встретить:
while (rows.hasNext()) {
var row = rows.next();
То есть что-то нужно выполнять, пока есть следующая строка. Вот пример в рамках целой функции:
function getReportSpreadsheet(folder, adWordsAccount) {
var accountId = adWordsAccount.getCustomerId();
var accountName = adWordsAccount.getName();
if (files.hasNext()) {
var file = files.next();
spreadsheet = SpreadsheetApp.open(file);
}
То есть нужно взять таблицу для отчета (getReportSpreadsheet), взять данные, которые указаны в переменных (ID, Name), ЕСЛИ есть следующий файл. Пока файлы есть — функция будет продолжать выполняться. Когда «следующие» закончатся (то есть все файлы будут заполнены), функция будет выполнена. Когда все функции выполнены, скрипт завершает свою работу.
Массив
Массив — это упорядоченный набор данных, его используют для хранения данных одного типа. К примеру, нам нужно собрать вместе три ID кампаний, чтобы потом делать с этими кампаниями одинаковые действия. Мы соберем их в массив такого вида:
var ids = [11111, 22222, 33333];
Тут используются данные одного типа — числового, number. И все они собран в один набор — массив.
Вот как можно использовать массив:
var keywords = adGroup.keywords().withIds(ids);
То есть в этой переменной скрипт соберет ключевые слова из группы объявлений. Чтобы собрать данные не из всех групп, а только из определенных, мы используем селектор .withIds (тот же принцип, что и withCondition, который мы упоминали на старте). Чтобы указать, какие конкретно ID нужны, мы обращаемся к массиву с названием ids:
.withIds(ids)
Это название отсылает скрипт к строчке, где прописан массив (var ids = [11111, 22222, 33333];).
FAQ
Как понять, куда в скрипте нужно внести свои данные?
Обычно строки, куда нужно вносить свою информацию, находятся в начале файле. Чаще всего они даже подписаны и содержат примечания, какую информацию и в каком формате вносить. Универсального способа быстро найти места для кастомной информации нет — надо читать весь скрипт.

Окей, но я открываю реальный скрипт — и там гораздо больше слов, чем у вас в гайде!
В Google Рекламе больше 20 сущностей, у каждой есть свой набор доступных методов; плюс элементы, функции, селекторы — список можно продолжать долго.
Хорошая новость № 1: большая часть кода основана на английском языке, часто она понятна и без знания JavaScript.
Хорошая новость № 2: у Google есть довольно подробная документация для разработчиков (опять же, на английском).
Если вы столкнулись с незнакомым выражением — скопируйте его в поиск по сайту Google для разработчиков. В начале каждой статьи есть краткое описание, что это такое и зачем оно нужно.
Почему скрипты такие разноцветные?
Чтобы с ними было удобнее работать. В коде разными цветами выделены разные части синтаксиса: функции, названия и значения переменных, методы и так далее. Так код проще читать: при беглом просмотре сразу видно, что и где написано.
Скрипт можно написать самому?
Конечно, но для этого нужны более глубокие знания языка программирования и принципов написания кода в целом.
Скриптами можно решать любую задачу?
Любую не любую, но скрипты действительно могут решить очень много задач. Другое дело, что из-за необходимой для выполнения детализации, некоторые вещи довольно сложно написать как факт (хотя все равно реально). Основная сложность в том, что для создания скрипта надо одновременно разбираться и в программировании, и в РРС. В Penguin-team скрипты пишут разработчики, которых постоянно консультируют РРС-специалисты.
Последние комментарии