Как научиться читать скрипты Google Ads: основы JavaScript для РРС-специалистов

Newser

Moderator
Команда форума
Регистрация
5 Фев 2019
Сообщения
294
Большой материал от технического директора в агентстве 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:
Сущности, как вы понимаете, нужны, чтобы не прописывать каждый элемент по отдельности, а объединить их в группы. То есть вместо того, чтобы вручную указывать все 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

Итератор

Повторим!
  1. Функция — это когда мы сами написали кусок кода, который выполняет определенную задачу.
  2. Метод — это когда код написан на стороне Google.
  3. Селектор — это метод, написанный на стороне 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

Как понять, куда в скрипте нужно внести свои данные?

Обычно строки, куда нужно вносить свою информацию, находятся в начале файле. Чаще всего они даже подписаны и содержат примечания, какую информацию и в каком формате вносить. Универсального способа быстро найти места для кастомной информации нет — надо читать весь скрипт.

Скрипт

Сразу после function main указаны строки, которые требуют нашего внимания до запуска. Иногда они содержат предустановленные значения (как здесь), которые будут использоваться, если вы не замените их на свои

Окей, но я открываю реальный скрипт — и там гораздо больше слов, чем у вас в гайде!

В Google Рекламе больше 20 сущностей, у каждой есть свой набор доступных методов; плюс элементы, функции, селекторы — список можно продолжать долго.

Хорошая новость № 1: большая часть кода основана на английском языке, часто она понятна и без знания JavaScript.

Хорошая новость № 2: у Google есть довольно подробная документация для разработчиков (опять же, на английском).

Если вы столкнулись с незнакомым выражением — скопируйте его в поиск по сайту Google для разработчиков. В начале каждой статьи есть краткое описание, что это такое и зачем оно нужно.

Что такое concat


Concat — это метод, который используется, чтобы объединять ldf и больше массива. То есть мы можем указать массив 1, массив 2, а чтобы выполнить действия над элементами из обоих массивов, использовать метод concat

Описание


Почему скрипты такие разноцветные?
Чтобы с ними было удобнее работать. В коде разными цветами выделены разные части синтаксиса: функции, названия и значения переменных, методы и так далее. Так код проще читать: при беглом просмотре сразу видно, что и где написано.

Скрипт можно написать самому?
Конечно, но для этого нужны более глубокие знания языка программирования и принципов написания кода в целом.

Скриптами можно решать любую задачу?
Любую не любую, но скрипты действительно могут решить очень много задач. Другое дело, что из-за необходимой для выполнения детализации, некоторые вещи довольно сложно написать как факт (хотя все равно реально). Основная сложность в том, что для создания скрипта надо одновременно разбираться и в программировании, и в РРС. В Penguin-team скрипты пишут разработчики, которых постоянно консультируют РРС-специалисты.

Источник
 
Сверху