Заметки по Google Ads scripts

Была необходимость автоматизировать некоторые действия в Google Ads. Так как это были не рутинные задачи а действия по определенному алгоритму, использовать уже кем-то написанный скрипт не представляется возможным.

Почему Google Ads scripts?

Оптимально, было бы работать с API Google Ads, но так как для получения идентификатора разработчика нужно прилично заморочаться (подробнее в документации), выбор пал на скрипты в Google Ads. По сути, ключевые преимущества, на которые «клюнули»:

  1. Отличная документация и комьюнити.
  2. Масса готовых решений почти под любую задачу.
  3. Возможность работы с Google Spreadsheets, уведомлениями по почте и в аккаунте Google Ads, и другими сервисами Google.
  4. Сложности с получением доступа к 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);

Полный список доступных методов смотрим в документации.