Яндекс Директ отдает много инфы и статистики о расходах, показах, площадках, настройках и вот этом всём в интерфейсе или через API.
Но не отдает информацию о том, когда останавливаются кампании, когда им не хватает бюджета.

Эту инфу можно доставать из почты, так как директ отправляет письма, каждый раз, когда кампания останавливается.

Воспользуемся этим. Будем парсить почту.

screenshot результата работы парсинга
результат работы скрипта

Как запустить:

Самые свежие исходники скрипта на GitHub’e

  1. копируем этот код;
  2. создаем новую гугл таблицу;
  3. открываем скрипт эдитор screenshot как открыть скрипт эдитор

  4. называем проект как угодно, но желательно так, чтобы через время вы поняли, что это. Удаляем имеющийся код
    screenshot переименовываем проект и удаляем всё

  5. заполняем projname (если нужно собрать остановки, только по 1 аккаунту). Можно оставить пустым, тогда соберется по всем аккаунтам screenshot заполняем проект
    название аккаунта, берем из письма
    screenshot где взять название аккаунта

  6. жмем на плей, нажимаем review и со всем соглашаемся screenshot запуска

  7. увидим error. Всё ок, нажимем сохранить и запускаем еще раз screenshot ошибки

  8. ждём. когда вот это исчезнет
    screenshot загрузка

  9. success — в таблице появились данные

Когда-то допилю, ну или вы помогите:

  1. cделать чтобы грузилось больше 500 строк (сейчас это ограничение метода GmailApp.search)
  2. сделать, чтобы скрипт запускался автоматически каждый день и дописывал остановки за вчера

Код скрипта:

var projname ='';        // название аккаунта, берем из письма http://joxi.ru/4AkkOWnIy4qpgA
var ss = SpreadsheetApp.getActiveSpreadsheet();    
var sheet = ss.getSheets()[0];
var header = [["Логин", "Дата","Время","Кампания","ID кампании"]]  //названия колонок
sheet.getRange('A:E').clearContent();  //очищаем лист , на самом деле только колонки A:E
sheet.getRange("A1:E1").setValues(header); //записываем шапку таблицы

function get_threads_from_yandex(projname_arg) {
  return GmailApp.search('(яндекс.директ/показы ) and (приостановлены по дневному ограничению бюджета) and ('+ projname_arg +')')
};

var threads = get_threads_from_yandex(projname);
var i=0;

for (thread in threads)
{
  var datetime = threads[i].getLastMessageDate(); // дата из даты письма
  var messages = threads[i].getMessages();        //вытаскиваем все сообщения в ветке
  var message = messages[0].getPlainBody();       //вытаскиваем текст первого сообщения
  var q = message.split('\n', 3)                  //разбиваем письмо на строки (берем всего 4, там вся нужная инфа)
  // ↓ пишем инфу в таблицу
  sheet.getRange("A"+(i+2)).setValue(q[0].match(RegExp("Здравствуйте, (.*)!"))[1]); //accname
    sheet.getRange("B"+(i+2)).setValue(datetime.getFullYear()+'-'+ (datetime.getMonth()< 9 ? '0' : '') + (1+datetime.getMonth()) + '-' + (datetime.getDate()< 10 ? '0' : '') + datetime.getDate()); //date
  sheet.getRange("C"+(i+2)).setValue(q[2].match(RegExp("\\s[0-9:]*\\s")).toString().replace(" ","")); //time
  sheet.getRange("D"+(i+2)).setValue(q[2].match(RegExp("\\((.*)\\)\\s"))[1]); //campaignname
  sheet.getRange("E"+(i+2)).setValue(q[2].match(RegExp("N[0-9]*")).toString().replace("N","")); //campaignid 
  i+=1
}