Была необходимость автоматизировать некоторые действия в Google Ads. Так как это были не рутинные задачи а действия по определенному алгоритму, использовать уже кем-то написанный скрипт не представляется возможным.
Почему Google Ads scripts?
Оптимально, было бы работать с API Google Ads, но так как для получения идентификатора разработчика нужно прилично заморочаться (подробнее в документации), выбор пал на скрипты в Google Ads. По сути, ключевые преимущества, на которые «клюнули»:
- Отличная документация и комьюнити.
- Масса готовых решений почти под любую задачу.
- Возможность работы с Google Spreadsheets, уведомлениями по почте и в аккаунте Google Ads, и другими сервисами Google.
- Сложности с получением доступа к Google Ads Api.
Интересные моменты, по работе со скриптами записал ниже. Особо их не выделял, возможно когда-то структурирую. Пока это просто список:
Отчеты
Для получения данных использовали отчеты в Google Ads Api. Именно в них нашли метрики из Google Analytics и такие показатели как SearchImpressionShare для кампаний и объявлений.
Чтобы получить данные из отчета, строим запрос на языке AWQL:
var ad_group_report = AdsApp.report( "SELECT AdGroupName, AdGroupId, Clicks, Impressions, Ctr, AveragePosition, AverageCpc, Cost, SearchImpressionShare, CpcBid, BounceRate, AveragePageviews, AverageTimeOnSite " + "FROM ADGROUP_PERFORMANCE_REPORT " + "WHERE CampaignId = '" + campaign_id + "' " + "DURING LAST_7_DAYS");
Синтаксис очень похож на SQL, но есть ряд ограничений (документация).
Результат запроса можно сохранить в переменную:
var ad_rows = ad_group_report.rows();
Данные отчета перебираем в цикле:
while (ad_rows.hasNext()) { var ad_row = ad_rows.next(); var ad_name = ad_row["AdGroupName"]; }
Переменная ad_name будет содержать название группы объявлений. Аналогичным образом можно получить любые данные, которые нужны.
Даты и периоды
Google Ads Scripts поддерживает следующие варианты для ограничения периода дат (DateRange):
- Системные: TODAY, YESTERDAY, LAST_7_DAYS, THIS_WEEK_SUN_TODAY, THIS_WEEK_MON_TODAY, LAST_WEEK, LAST_14_DAYS, LAST_30_DAYS, LAST_WEEK, LAST_BUSINESS_WEEK, LAST_WEEK_SUN_SAT, THIS_MONTH, LAST_MONTH.
- Произвольные форматы дат (CUSTOM_DATE), для которых нужно указывать начало и конец.
В примере выше используется системный вариант (LAST_7_DAYS). Для того, чтобы сравнить значения предыдущих 7 дней (t1) с предшествующими им (t0), пришлось самим просчитывать даты:
var today = new Date(); var yesterday = new Date(today.getTime() - 1 * 24 * 60 * 60 * 1000); var oneWeekAgo = new Date(today.getTime() - 8 * 24 * 60 * 60 * 1000); var startDate = date_to_format(oneWeekAgo, '-'); var endDate = date_to_format(yesterday, '-');
В примере выше используется функция date_to_format, при помощи которой превращаю объект Date в string нужного формата:
function date_to_format(date, delimeter){ delimeter = typeof delimeter !== 'undefined' ? delimeter : ""; var dd = date.getDate(); var mm = date.getMonth()+1; var yyyy = date.getFullYear(); if(dd<10) { dd = '0'+dd } if(mm<10) { mm = '0'+mm } return yyyy + delimeter + mm + delimeter + dd; }
delimeter — разделитель. Вынес его в параметр, так как в AWQL указываем:
DURING 20180801,20180808
а при работе с расширенным API (конкретно с Analytics.Data.Ga) такой же период будет выглядеть следующим образом:
var report = Analytics.Data.Ga.get(tableId, 2018-08-01, 2018-08-08, metric, options);
Работа с Google таблицами
Таблицы — наверное самый распространенный вариант отображения данных из Google Ads Scripts. Официальная документация по работе с таблицами из Ads Scripts: https://developers.google.com/apps-script/reference/spreadsheet/sheet.
Можно создавать новые таблицы или изменять существующие. Пример кода для второго варианта:
var SPREADSHEET_URL = 'URL_GOOGLE_ТАБЛИЦЫ'; // Указываем название листа, с которым будем работать. Он обязательно должен быть создан. var SHEET_NAME = 'ОТЧЕТ'; var ss = SpreadsheetApp.openByUrl(SPREADSHEET_URL); //В переменной sheet теперь содержиться лист, в котором будем изменять данные. var sheet = ss.getSheetByName(SHEET_NAME); // Очищаем содержимое листа, сохраняя при этом форматирование sheet.clearContents(); // Записываем строку в файл sheet.appendRow(['Колонка 1', 'Колонка 2', 'Колонка 3']); // Получаем последнюю строку lastRow = sheet.getDataRange().getNumRows(); // Определяем диапазон для изменения range = sheet.getRange(lastRow, 1, 1, 19); // Для изменения форматирования у диапазонов можем использовать методы: https://developers.google.com/apps-script/reference/spreadsheet/range. Например: range.setBackgroundRGB(210, 180, 140);
Полный список доступных методов смотрим в документации.