Общие наборы и конфликты минус-слов

С помощью минус-слов можно предотвратить показ объявлений по нерелевантным поисковым запросам. Однако неверно подобранный тип соответствия для минус-слов может привести к тому, что они не будут показываться по некоторым релевантным запросам, и эффективность кампании снизится.

С помощью исключенных мест размещения вы можете ограничить показ медийной рекламы на ресурсах с определенным типом контента, на отдельных сайтах, в приложениях, в роликах и на каналах YouTube.

В этом руководстве мы расскажем о том:

  • как автоматизировать удаление конфликтующих минус-слов с помощью AdWords API;
  • как применять общие наборы для управления минус-словами и местами размещения;
  • как использовать собственные критерии для исключения отдельных мест размещения во всех кампаниях аккаунта.

Пример

Представьте, что вы владеете магазином мужской одежды и пытаетесь привлечь посетителей на свой сайт с помощью рекламы зимних аксессуаров. Недавно вы загрузили свежий отчет по поисковым запросам, из которого узнали, что ваша реклама мужских аксессуаров также показывается и по запросам о женских шелковых шарфах.

Так произошло потому, что в вашей кампании были применены ключевые слова с широким соответствием, такие как "шелковые галстуки", "шерстяные шарфы" и "подарки для мужчин". Поэтому вы решаете добавить "шелковые шарфы" в список минус-слов, однако не знаете, какой тип соответствия выбрать.

В таблице ниже показано, как выбор типа соответствия повлияет на показ объявлений по некоторым поисковым запросам.

Поисковый запрос Минус-слово
-silk scarves
(минус-слово с широким соответствием)
-"silk scarves"
(минус-слово с фразовым соответствием)
-[silk scarves]
(минус-слово с точным соответствием)
мужские шарфы
мужские галстуки
шарфы шелковые Перечеркнутый круг
шелковые галстуки
шелковые подарочные шарфы Перечеркнутый круг
шелковые шарфы Перечеркнутый круг Перечеркнутый круг Перечеркнутый круг
шелковые шарфы в подарок Перечеркнутый круг Перечеркнутый круг
шелковые галстуки шерстяные шарфы Перечеркнутый круг
женские шелковые шарфы Перечеркнутый круг Перечеркнутый круг
шерстяные шарфы

Обратите внимание, что минус-слово -шелковые шарфы с широким соответствием блокирует показ рекламы по таким релевантным запросам, как "шелковые галстуки шерстяные шарфы".

Автоматическое выявление конфликтующих минус-слов

Если в настройках вашей компании использовано всего несколько минус-слов, вам не составит труда самостоятельно выявить возможные конфликты с ключевыми словами. Но когда в аккаунте применяются сотни минус-слов и тысячи обычных, то без специальных инструментов не обойтись. Рассмотрим, как автоматизировать выявление конфликтов с помощью AdWords API.

Для простоты примера предположим, что все ключевые слова применяются на уровне групп объявлений, а все минус-слова – на уровне кампании.

Получение списка минус-слов

Минус-слова, применяемые на уровне кампании, можно получить с помощью отчета по эффективности минус-слов на уровне кампании, как это показано в примере ниже.

def retrieve_negative_keywords(report_utils)
  report_definition = {
    :selector => {
      :fields => ['CampaignId', 'Id', 'KeywordMatchType', 'KeywordText']
    },
    :report_name => 'Negative campaign keywords',
    :report_type => 'CAMPAIGN_NEGATIVE_KEYWORDS_PERFORMANCE_REPORT',
    :download_format => 'CSV',
    :date_range_type => 'TODAY',
    :include_zero_impressions => true
  }

  campaigns = {}

  report = report_utils.download_report(report_definition)
  # Slice off the first row (report name).
  report.slice!(0..report.index("\n"))

  CSV.parse(report, { :headers => true }) do |row|
    campaign_id = row['Campaign ID']

    # Ignore totals row.
    if row[0] != 'Total'
      campaigns[campaign_id] ||= Campaign.new(campaign_id)
      negative = Negative.from_csv_row(row)
      campaigns[campaign_id].negatives << negative
    end
  end

  return campaigns
end

Получение списка ключевых слов

Создайте отчет по эффективности ключевых слов. С помощью параметра allowed_values вы сможете отфильтровать кампании, группы объявлений и ключевые слова, которые нужно учитывать, по их статусу (параметр может принимать значения PAUSED и REMOVED).

def retrieve_positive_keyword_report(report_utils, allowed_values)
  report_definition = {
    :selector => {
      :fields => ['CampaignId', 'CampaignName', 'AdGroupId', 'Id',
                  'KeywordMatchType', 'KeywordText'],
      :predicates => [
        {
          :field => 'CampaignStatus',
          :operator => 'IN',
          :values => allowed_values
        },
        {
          :field => 'AdGroupStatus',
          :operator => 'IN',
          :values => allowed_values
        },
        {
          :field => 'Status',
          :operator => 'IN',
          :values => allowed_values
        },
        {
          :field => 'IsNegative',
          :operator => 'IN',
          :values => ['false']
        }
      ]
    },
    :report_name => 'Ad group keywords',
    :report_type => 'KEYWORDS_PERFORMANCE_REPORT',
    :download_format => 'CSV',
    :date_range_type => 'TODAY',
    :include_zero_impressions => true
  }

  report = report_utils.download_report(report_definition)
  # Slice off the first row (report name).
  report.slice!(0..report.index("\n"))

  return report
end

Выявление конфликтующих минус-слов

Минус-слова блокируют показ объявлений в соответствии со следующей логикой:

  • Минус-слово с более строгим, чем у поискового запроса, типом соответствия не заблокирует показ по такому запросу. Например, минус-слово -[silk scarves] заблокирует показ по запросу "шелковые шарфы", но не по запросу "красные шелковые шарфы".
  • Минус-слова с широким соответствием блокируют показ объявления, если поисковый запрос содержит ВСЕ слова из минус-слова. Например, минус-слово -шелковые шарфы заблокирует показ по запросу "шарфы в подарок шелковые", но не по запросу "шерстяные шарфы".
  • Минус-слова с фразовым соответствием блокируют показ объявления, если поисковый запрос содержит все слова в том порядке, в котором они присутствуют в минус-слове. Например, минус-слово -"шелковые шарфы" заблокирует показ по запросу "шелковые шарфы в подарок", но не по запросу "шарфы в подарок шелковые".
  • Минус-слова с точным соответствием блокируют показ по запросам, которые точно соответствуют этому минус-слову. Например, минус-слово -[шелковые шарфы] заблокирует показ по запросу "шелковые шарфы", но не запросу "красные шелковые шарфы".
  • Минус-слова нечувствительны к регистру.
  • Минус-слова не влияют на показ близких вариантов ключевых слов. Например, минус-слово -шелковые шарфы не заблокирует показ объявления по запросу "шелковый шарф", хотя последний представляет собой один из возможных грамматических вариантов минус-слова.

Описанную логику реализует метод, приведенный ниже.

def compare_keywords(negatives, positive)
  negatives.each do |negative|
    match_type = negative.match_type.downcase
    negative_text = negative.text.downcase
    positive_text = positive.text.downcase

    match = false

    # If the negative keyword is more strict than the positive one, it cannot
    # match.
    # E.g. a negative exact "cool shoe" will not prevent positive phrase
    # "cool shoe shine".
    positive_match_type = positive.match_type.downcase
    next if positive_match_type == 'broad' && match_type != 'broad'
    next if positive_match_type == 'phrase' && match_type == 'exact'

    # Exact matching with negative keywords triggers only when the full text of
    # the keywords is exactly the same.
    # E.g. a negative "silk scarves" will only match "silk scarves", not
    # "red silk scarves".
    if match_type == 'exact'
      match = (negative_text == positive_text)
    end

    # Phrase matching with negative keywords triggers when the negative phrase
    # is present in the target, completely unmodified.
    # E.g. a negative "silk scarves" will match "gift silk scarves", but not
    # "silk gift scarves".
    if match_type == 'phrase'
      negative_tokens = negative_text.split(' ')
      positive_tokens = positive_text.split(' ')

      positive_tokens.each_with_index do |positive_token, positive_index|
        # Iterate until the current token matches the first token in the
        # negative keyword.
        if positive_token == negative_tokens.first
          candidate_match = true
          # Do all of the subsequent tokens also match?
          negative_tokens[1..-1].each_with_index do |token, index|
            if token != positive_tokens[positive_index + index + 1]
              candidate_match = false
              break
            end
          end

          match = candidate_match
        end
      end
    end

    # Broad matching with negative keywords triggers when all of the words are
    # present and exactly the same.
    # E.g. a negative "silk scarves" will match "silk gift scarves", but not
    # "wool scarves".
    if match_type == 'broad'
      negative_tokens = negative_text.split(' ')
      positive_tokens = positive_text.split(' ')

      candidate_match = true

      negative_tokens.each do |token|
        if !positive_tokens.include?(token)
          candidate_match = false
          break
        end
      end

      match = candidate_match
    end

    negative.add_blocked(positive) if match
  end
end

Удаление конфликтующих минус-слов

Выявив конфликтующие минус-слова, вы можете сделать следующее:

  • удалить их с помощью сервиса CampaignCriterionService;
  • создать отчет с минус-словами, а затем удалить их вручную.

Регулярное применение описанного выше процесса поможет вам избежать конфликтов, вызванных изменениями в списках ключевых или минус-слов.

Полный пример кода

Приведенные выше полные примеры кода можно найти в клиентской библиотеке AdWords API для Ruby.

Общие наборы

Если вы хотите применить одинаковые минус-слова или исключенные места размещения сразу к нескольким кампаниям, создайте общий набор – единый список минус-слов и мест размещения, который удобно добавлять в любые кампании AdWords. Эта функция называется общими наборами.

Применение общих наборов избавит вас от необходимости копирования минус-слов и исключенных мест размещения внутри аккаунта AdWords, а следовательно, сделает управление этими критериями более эффективным.

Поддержка создания общих наборов в управляющих аккаунтах была добавлена в версии v201710. Если вы работаете с более ранней версией API AdWords, вы можете создать общий набор в управляющем аккаунте через пользовательский интерфейс, а затем управлять его критериями и связями с кампаниями с помощью API AdWords.

Тип общего набора Тип аккаунта SharedSetService SharedCriterionService CampaignSharedSetService
Минус-слова Клиент Флажок Флажок Флажок
Минус-слова Менеджер Начиная с версии v201710 Флажок Флажок
Исключенные места размещения Клиент Флажок Флажок Флажок
Исключенные места размещения Менеджер Перечеркнутый круг Перечеркнутый круг Перечеркнутый круг

В этом разделе мы расскажем, как применять AdWords API для создания общих наборов и работы с ними. В примере ниже мы рассматриваем минус-слова. Чтобы создать общие наборы с исключенными местами размещения для клиентских аккаунтов, используйте аналогичную последовательность действий.

В примерах ниже представлен код из библиотеки AdWords API для Java. Примеры кода для других библиотек можно найти по этой ссылке.

Создание общих наборов

Для начала вам потребуется создать новый общий набор, а затем заполнить его ключевыми словами, которые вы хотите исключить.

Ниже приведен фрагмент для создания общего набора минус-слов с помощью сервиса SharedSetService.


// Create the operation.
SharedSetOperation operation = new SharedSetOperation();
operation.setOperator(Operator.ADD);

// Create the shared set.
SharedSet sharedSet = new SharedSet();
sharedSet.setName("API Negative keyword list for demo");

// Set the type of the shared set. This may be negative keywords or placements.
sharedSet.setType(SharedSetType.NEGATIVE_KEYWORDS);
operation.setOperand(sharedSet);

SharedSetReturnValue retval = sharedSetService.mutate(
    new SharedSetOperation[] {operation});
for (SharedSet set : retval.getValue()) {
  System.out.println("Shared set with id = " + set.getSharedSetId() + ", name = " +
      set.getName() + ", type = " + set.getType() + ", status = " + set.getStatus() +
      "was created.");
}

SharedCriterionService можно использовать также для добавления минус-слов к созданному набору. Ниже представлен фрагмент кода, с помощью которого в общий набор добавляется два таких слова.

String[] keywordTexts = new String[] {"mars cruise", "mars hotels"};

List operations = new ArrayList();
for (String keywordText: keywordTexts) {
  // Create the shared criterion.
  Keyword keyword = new Keyword();
  keyword.setText(keywordText);
  keyword.setMatchType(KeywordMatchType.BROAD);

  SharedCriterion sharedCriterion = new SharedCriterion();
  sharedCriterion.setCriterion(keyword);
  sharedCriterion.setNegative(true);
  sharedCriterion.setSharedSetId(sharedSetId);

  SharedCriterionOperation operation = new SharedCriterionOperation();
  operation.setOperator(Operator.ADD);
  operation.setOperand(sharedCriterion);
  operations.add(operation);
}

SharedCriterionReturnValue retval = sharedCriterionService.mutate(operations.toArray(
    new SharedCriterionOperation[operations.size()]));
for (SharedCriterion sharedCriterion : retval.getValue()) {
  Keyword keyword = (Keyword) sharedCriterion.getCriterion();
  System.out.println("Added keyword with id = " + keyword.getId() + ", text = " +
      keyword.getText() + ", matchtype = " + keyword.getMatchType() + " to shared " +
      "set with id = " + sharedSetId + ".");
}

Определить количество минус-слов или мест размещения в общем наборе можно с помощью поля memberCount. А в поле referenceCount приведена информация о том, со сколькими кампаниями этот общий набор связан.

Применение общих наборов к кампаниям

С помощью сервиса CampaignSharedSetService общие наборы можно добавлять в разные кампании. Ниже приведен пример кода для этого.

// Create the campaign shared set
CampaignSharedSet campaignSharedSet = new CampaignSharedSet();
campaignSharedSet.setCampaignId(campaignId);
campaignSharedSet.setSharedSetId(sharedSetId);

CampaignSharedSetOperation operation = new CampaignSharedSetOperation();
operation.setOperator(Operator.ADD);
operation.setOperand(campaignSharedSet);

CampaignSharedSetReturnValue retval = campaignSharedSetService.mutate(
    new CampaignSharedSetOperation[] {operation});
for (CampaignSharedSet attachedCampaignSharedSet : retval.value) {
  System.out.println("Attached shared set with id = " +
      attachedCampaignSharedSet.getSharedSetId() + " to campaign id " +
      attachedCampaignSharedSet.getCampaignId() + ".");
}

В примере ниже показано, как с помощью метода CampaignSharedSetService.get() получить список кампаний, к которым был применен определенный общий набор.

// Create the selector.
Selector selector = new Selector();
selector.setFields(new String[] {"SharedSetId", "CampaignId", "SharedSetName",
   "SharedSetType", "Status"});

// Filter your results by specific campaign id.
Predicate predicate = new Predicate();
predicate.setField("CampaignId");
predicate.setOperator(PredicateOperator.EQUALS);
predicate.setValues(new String[] {campaignId.toString()});

// Filter your results by the type of shared set.
Predicate predicate1 = new Predicate();
predicate1.setField("SharedSetType");
predicate1.setOperator(PredicateOperator.IN);
predicate1.setValues(new String[] {"NEGATIVE_KEYWORDS", "NEGATIVE_PLACEMENTS"});

selector.setPredicates(new Predicate[] {predicate});

CampaignSharedSetPage page = campaignSharedSetService.get(selector);
if (page.getEntries() != null) {
  for (CampaignSharedSet campaignSharedSet : page.getEntries()) {
    System.out.println("Shared set with id = " + campaignSharedSet.getSharedSetId() +
        ", name = " + campaignSharedSet.getSharedSetName() + ", type = " +
        campaignSharedSet.getSharedSetType() + " and status = " +
        campaignSharedSet.getStatus() + " was found.");
    }
  }
}

Отчеты

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

Критерии исключения на уровне аккаунта

В AdWords API версии 201710 и выше вы можете задавать критерии исключения для медийной рекламы во всех кампаниях аккаунта с помощью функции CustomerNegativeCriterionService.

Функция поддерживает следующие типы критериев исключения:

Процесс добавления критериев исключения на уровне аккаунта аналогичен тому, что применяется для общих наборов, за исключением следующих основных отличий:

  • Критерии, созданные с помощью CustomerNegativeCriterionService, применяются ко всем кампаниям в аккаунте. При использовании общего набора критерии исключения будут применимы только к кампаниям, связанным с общим набором.

  • Чтобы исключить критерий на уровне аккаунта, достаточно добавить оператор CustomerNegativeCriterion. Однако чтобы удалить критерий из кампаний, в которых применяются общие наборы, нужно выполнить несколько действий: создать общий набор, добавить в него критерии, связать набор с одной или несколькими кампаниями.

В фрагменте кода ниже показано, как запретить показ всех объявлений из вашего аккаунта рядом с определенными типами контента или на некоторых сайтах.

Java

// Get the CustomerNegativeCriterionService.
CustomerNegativeCriterionServiceInterface customerNegativeCriterionService =
    adWordsServices.get(session, CustomerNegativeCriterionServiceInterface.class);

List<Criterion> criteria = new ArrayList<>();

// Exclude tragedy & conflict content.
ContentLabel tragedyContentLabel = new ContentLabel();
tragedyContentLabel.setContentLabelType(ContentLabelType.TRAGEDY);
criteria.add(tragedyContentLabel);

// Exclude a specific placement.
Placement placement = new Placement();
placement.setUrl("http://www.example.com");
criteria.add(placement);

// Additional criteria types are available for this service. See the types listed
// under Criterion here:
// https://developers.google.com/adwords/api/docs/reference/latest/CustomerNegativeCriterionService.Criterion

// Create operations to add each of the criteria above.
List<CustomerNegativeCriterionOperation> operations = new ArrayList<>();
for (Criterion criterion : criteria) {
  CustomerNegativeCriterion negativeCriterion = new CustomerNegativeCriterion();
  negativeCriterion.setCriterion(criterion);
  CustomerNegativeCriterionOperation operation = new CustomerNegativeCriterionOperation();
  operation.setOperator(Operator.ADD);
  operation.setOperand(negativeCriterion);
  operations.add(operation);
}

// Send the request to add the criteria.
CustomerNegativeCriterionReturnValue result =
    customerNegativeCriterionService.mutate(
        operations.toArray(new CustomerNegativeCriterionOperation[operations.size()]));

// Display the results.
for (CustomerNegativeCriterion negativeCriterion : result.getValue()) {
  System.out.printf(
      "Customer negative criterion with criterion ID %d and type '%s' was added.%n",
      negativeCriterion.getCriterion().getId(),
      negativeCriterion.getCriterion().getCriterionType());
}

CSharp

using (CustomerNegativeCriterionService customerNegativeCriterionService =
    (CustomerNegativeCriterionService) user.GetService(
        AdWordsService.v201802.CustomerNegativeCriterionService)) {

  List<Criterion> criteria = new List<Criterion>();

  // Exclude tragedy & conflict content.
  ContentLabel tragedyContentLabel = new ContentLabel();
  tragedyContentLabel.contentLabelType = ContentLabelType.TRAGEDY;
  criteria.Add(tragedyContentLabel);

  // Exclude a specific placement.
  Placement placement = new Placement();
  placement.url = "http://www.example.com";
  criteria.Add(placement);

  // Additional criteria types are available for this service. See the types listed
  // under Criterion here:
  // https://developers.google.com/adwords/api/docs/reference/latest/CustomerNegativeCriterionService.Criterion

  // Create operations to add each of the criteria above.
  List<CustomerNegativeCriterionOperation> operations =
      new List<CustomerNegativeCriterionOperation>();
  foreach (Criterion criterion in criteria) {
    CustomerNegativeCriterion negativeCriterion = new CustomerNegativeCriterion();
    negativeCriterion.criterion = criterion;
    CustomerNegativeCriterionOperation operation = new CustomerNegativeCriterionOperation();
    operation.@operator = Operator.ADD;
    operation.operand = negativeCriterion;
    operations.Add(operation);
  }

  try {
    // Send the request to add the criteria.
    CustomerNegativeCriterionReturnValue result =
        customerNegativeCriterionService.mutate(operations.ToArray());

    // Display the results.
    foreach (CustomerNegativeCriterion negativeCriterion in result.value) {
      Console.WriteLine("Customer negative criterion with criterion ID {0} and type '{1}' " +
          "was added.", negativeCriterion.criterion.id,
          negativeCriterion.criterion.type);
    }
  } catch (Exception e) {
    throw new System.ApplicationException("Failed to set customer negative criteria.", e);
  }
}

Python

customer_negative_criterion_service = client.GetService(
    'CustomerNegativeCriterionService', version='v201802')

criteria = [
    # Exclude tragedy & conflict content.
    {
        'xsi_type': 'ContentLabel',
        'contentLabelType': 'TRAGEDY'
    },
    # Exclude a specific placement.
    {
        'xsi_type': 'Placement',
        'url': 'http://www.example.com'
    }
    # Additional criteria types are available for this service. See the types
    # listed under Criterion here:
    # https://developers.google.com/adwords/api/docs/reference/latest/CustomerNegativeCriterionService.Criterion
]

# Create operations to add each of the criteria above.
operations = [{
    'operator': 'ADD',
    'operand': {
        'criterion': criterion
    }
} for criterion in criteria]

# Make the mutate request.
result = customer_negative_criterion_service.mutate(operations)

# Display the resulting campaign criteria.
for negative_criterion in result['value']:
  print ('Customer negative criterion with criterion ID "%s", and type "%s" '
         'was added.' % (negative_criterion['criterion']['id'],
                         negative_criterion['criterion']['type']))

PHP

$customerNegativeCriterionService = $adWordsServices->get(
    $session,
    CustomerNegativeCriterionService::class
);

$criteria = [];

// Exclude tragedy & conflict content.
$tragedyContentLabel = new ContentLabel();
$tragedyContentLabel->setContentLabelType(ContentLabelType::TRAGEDY);
$criteria[] = $tragedyContentLabel;

// Exclude a specific placement.
$placement = new Placement();
$placement->setUrl('http://www.example.com');
$criteria[] = $placement;

// Additional criteria types are available for this service. See the types
// listed under Criterion here:
// https://developers.google.com/adwords/api/docs/reference/latest/CustomerNegativeCriterionService.Criterion

// Create operations to add each of the criteria above.
$operations = [];
foreach ($criteria as $criterion) {
    $negativeCriterion = new CustomerNegativeCriterion();
    $negativeCriterion->setCriterion($criterion);
    $operation = new CustomerNegativeCriterionOperation();
    $operation->setOperator(Operator::ADD);
    $operation->setOperand($negativeCriterion);
    $operations[] = $operation;
}

// Add the criteria on the server and print out some information.
$result = $customerNegativeCriterionService->mutate($operations);
foreach ($result->getValue() as $negativeCriterion) {
    printf(
        "Customer negative criterion with criterion ID %d and type '%s' was added.\n",
        $negativeCriterion->getCriterion()->getId(),
        $negativeCriterion->getCriterion()->getType()
    );
}

Perl

# Get the CustomerNegativeCriterionService.
my @criteria = ();

# Exclude tragedy & conflict content.
my $tragedy_content_label = Google::Ads::AdWords::v201802::ContentLabel->new({
  contentLabelType => 'TRAGEDY'
});
push @criteria, $tragedy_content_label;

# Exclude a specific placement.
my $placement = Google::Ads::AdWords::v201802::Placement->new({
  url => 'http://www.example.com'
});
push @criteria, $placement;

# Additional criteria types are available for this service. See the types
# listed under Criterion here:
# https://developers.google.com/adwords/api/docs/reference/latest/CustomerNegativeCriterionService.Criterion

# Create operations to add each of the criteria above.
my @operations = ();
for my $criterion (@criteria) {
  my $negative_criterion =
    Google::Ads::AdWords::v201802::CustomerNegativeCriterion->new({
      criterion => $criterion
    });
  my $operation =
    Google::Ads::AdWords::v201802::CustomerNegativeCriterionOperation->new({
      operator => 'ADD',
      operand  => $negative_criterion
    });
  push @operations, $operation;
}

# Send the request to add the criteria.
my $result =
  $client->CustomerNegativeCriterionService()
  ->mutate({operations => \@operations});

# Display the results.
if ($result->get_value()) {
  foreach my $negative_criterion (@{$result->get_value()}) {
    printf "Campaign negative criterion with criterion ID %d and type " .
      "'%s' was added.\n",
      $negative_criterion->get_criterion()->get_id(),
      $negative_criterion->get_criterion()->get_type();
  }
}

Ruby

customer_negative_criterion_srv = adwords.service(
    :CustomerNegativeCriterionService, API_VERSION)

criteria = []

# Exclude tragedy & conflict content.
criteria << {
  :xsi_type => 'ContentLabel',
  :content_label_type => 'TRAGEDY'
}

# Exclude a specific placement.
criteria << {
  :xsi_type => 'Placement',
  :url => 'http://www.example.com'
}

# Additional criteria types are available for this service. See the types
# listed under Criterion here:
# https://developers.google.com/adwords/api/docs/reference/latest/CustomerNegativeCriterionService.Criterion

# Create operations to add each of the criteria above.
operations = criteria.map do |criterion|
  {
    :operator => 'ADD',
    :operand => {
      :criterion => criterion
    }
  }
end

# Send the request to add the criteria.
result = customer_negative_criterion_srv.mutate(operations)

# Display the results.
result[:value].each do |negative_criterion|
  puts ("Customer negative criterion with criterion ID %d and type '%s' " +
      "was added.") % [negative_criterion[:criterion][:id],
      negative_criterion[:criterion][:criterion_type]]
end

VB.NET

Using customerNegativeCriterionService As CustomerNegativeCriterionService =
    CType(user.GetService(AdWordsService.v201802.CustomerNegativeCriterionService),
        CustomerNegativeCriterionService)

  Dim criteria As New List(Of Criterion)

  ' Exclude tragedy & conflict content.
  Dim tragedyContentLabel As New ContentLabel()
  tragedyContentLabel.contentLabelType = ContentLabelType.TRAGEDY
  criteria.Add(tragedyContentLabel)

  ' Exclude a specific placement.
  Dim placement As New Placement()
  placement.url = "http://www.example.com"
  criteria.Add(placement)

  ' Additional criteria types are available for this service. See the types listed
  ' under Criterion here:
  ' https://developers.google.com/adwords/api/docs/reference/latest/CustomerNegativeCriterionService.Criterion

  ' Create operations to add each of the criteria above.
  Dim operations As New List(Of CustomerNegativeCriterionOperation)
  For Each criterion As Criterion In criteria
    Dim negativeCriterion As New CustomerNegativeCriterion()
    negativeCriterion.criterion = criterion
    Dim operation As New CustomerNegativeCriterionOperation()
    operation.operator = [Operator].ADD
    operation.operand = negativeCriterion
    operations.Add(operation)
  Next

  Try
    ' Send the request to add the criteria.
    Dim result As CustomerNegativeCriterionReturnValue =
        customerNegativeCriterionService.mutate(operations.ToArray())

    ' Display the results.
    For Each negativeCriterion As CustomerNegativeCriterion In result.value
      Console.WriteLine("Customer negative criterion with criterion ID {0} and type '{1}' " +
          "was added.", negativeCriterion.criterion.id,
          negativeCriterion.criterion.type)
    Next
  Catch e As Exception
    Throw New System.ApplicationException("Failed to set customer negative criteria.", e)
  End Try

End Using

Полный пример кода

Оставить отзыв о...

Текущей странице
Нужна помощь? Обратитесь в службу поддержки.