Скрипты Менеджера рекламы

Класс AdsManagerApp в скриптах Google Рекламы позволяет управлять аккаунтами, связанными с вашим управляющим аккаунтом. Вы можете управлять всеми аккаунтами рекламодателей с помощью одного скрипта, а не создавать отдельный скрипт для каждого аккаунта.

Получить список аккаунтов

Вы можете получить список аккаунтов, связанных с управляющим аккаунтом, с помощью метода accounts, например:

const accountSelector = AdsManagerApp.accounts()
    .withCondition('customer_client.descriptive_name = "My Account"');

const accountIterator = accountSelector.get();

Для аккаунтов, которые можно восстановить, действуют некоторые ограничения:

  • Если у вас многоуровневая иерархия, управляющие аккаунты получить нельзя. Можно выбрать только клиентские аккаунты.
  • По умолчанию закрытые, отмененные и заблокированные аккаунты не возвращаются. Вы можете переопределить это поведение, вызвав withCondition и указав другой фильтр для customer_client.status.

Вызов accounts по умолчанию возвращает список всех клиентских аккаунтов в иерархии управляющего аккаунта. Чтобы ограничить количество аккаунтов, которые извлекает скрипт, используйте метод withLimit класса ManagedAccountSelector. Другой вариант – выбрать аккаунты по идентификаторам клиентов с помощью метода withIds:

// Hyphens in the account ID are optional.
const accountSelector = AdsManagerApp.accounts()
    .withIds(['123-456-7890', '234-567-8901', '345-678-9012']);

Работа с клиентскими аккаунтами

После того как вы получите клиентские аккаунты, вы можете перебирать их с помощью методов итератора hasNext и next. Чтобы переключить контекст выполнения на клиентский аккаунт, используйте метод select. После выбора клиентского аккаунта все последующие вызовы API будут применяться к нему, пока вы не выберете другой аккаунт.

// Keep track of the manager account for future reference.
const managerAccount = AdsApp.currentAccount();

// Select your accounts
const accountIterator = AdsManagerApp.accounts()
// ... Write some logic here to select the accounts you want using
// withCondition or withIds

// Iterate through the list of accounts
for (const account of accountIterator) {
  // Select the client account.
  AdsManagerApp.select(account);

  // Select Search and Display campaigns under the client account
  const campaignIterator = AdsApp.campaigns().get();

  // Operate on client account
  ...
}

Параллельная работа с аккаунтами

Скрипты Google Рекламы позволяют работать с несколькими клиентскими аккаунтами параллельно, используя метод executeInParallel класса ManagedAccountSelector. Метод executeInParallel имеет следующий синтаксис:

function executeInParallel(functionName, optionalCallbackFunctionName, optionalInput);

Метод executeInParallel выполняет функцию, указанную в functionName, для каждого объекта ManagedAccount, соответствующего ManagedAccountSelector. После обработки всех аккаунтов функция обратного вызова, если она указана в optionalCallbackFunctionName, выполняется один раз, передавая список объектов ExecutionResult в качестве аргумента для дальнейшей обработки. Ниже показан пример использования:

function main() {
  const accountSelector = AdsManagerApp.accounts()
      .withLimit(50)
      .withCondition('customer_client.currency_code = "USD"');

  accountSelector.executeInParallel("processClientAccount", "afterProcessAllClientAccounts");
}

function processClientAccount() {
  const clientAccount = AdsApp.currentAccount();

  // Process your client account here.
  ...

  // optionally, return a result, as text.
  return "";
}

function afterProcessAllClientAccounts(results) {
  for (const result of results) {
    // Process the result further
    ...
  }
}

Функция, указанная в functionName, может принимать строковый аргумент (optionalInput). Этот параметр можно использовать для передачи дополнительного параметра всем параллельным методам, вызываемым executeInParallel:

function main() {
  const accountSelector = AdsManagerApp.accounts().withIds([1234567890, 3456787890]);
  const sharedParameter = "INSERT_SHARED_PARAMETER_HERE";
  accountSelector.executeInParallel("processClientAccount", null, sharedParameter);
}

function processClientAccount(sharedParameter) {
  // Process your client account here.
  ...
}

Если вы хотите передать объект конфигурации JavaScript, содержащий настройки для определенного аккаунта, сначала преобразуйте его в строку с помощью метода JSON.stringify:

function main() {
  ...
  const accountFlags = {
    '1234567890': {
       'label': 'Brand 1 campaigns',
     },
    '3456787890': {
       'label': 'Brand 2 campaigns',
     }
  };
  accountSelector.executeInParallel("processClientAccount", null,
      JSON.stringify(accountFlags));
  ...
}

function processClientAccount(sharedParameter) {
  const accountFlags = JSON.parse(sharedParameter);
  // Process your client account here.
  ...
}

Функция, указанная в functionName, также может возвращать строку вместо объекта через JSON.stringify:

function processClientAccount() {
  ...
  const jsonObj = {value: 10, list: [1,2,3,4,5,6], name: "Joe Smith"};
  return JSON.stringify(jsonObj);
}

Возвращаемые значения передаются в функцию обратного вызова в виде списка объектов ExecutionResult. Если функция возвращает строку JSON, вы можете преобразовать ее обратно в объект JavaScript с помощью метода JSON.parse:

function callbackFunctionName(results) {
  for (var i = 0; i < results.length; i++) {
    var resultObj = JSON.parse(results[i].getReturnValue());
  }
}

Метод executeInParallel работает максимум с 50 объектами accounts, поэтому вам нужно будет самостоятельно ограничить количество аккаунтов, которые извлекает скрипт. Чтобы ограничить количество аккаунтов, которые получает скрипт, используйте метод withLimit или withIds класса ManagedAccountSelector.

Сроки выполнения

Подробную информацию о лимитах на время выполнения скриптов Менеджера рекламы можно найти в документации.