Relatório da consulta da pesquisa: conta única

This script is for a single account. For operating on multiple accounts in a Manager Account, use the Manager Account version of the script.

Uma boa origem de palavras-chave negativas e positivas é o Relatório de consulta de pesquisa. Esse relatório mostra as consultas de pesquisa reais que acionaram seus anúncios. Por exemplo, se sua palavra-chave de correspondência ampla for "pet shop", seus anúncios poderão ser exibidos quando os usuários procurarem "pet shop ruim". Não convém anunciar nesse tipo de pesquisa negativa. Com as palavras-chave exatas negativas, você pode excluir consultas de pesquisa indesejadas. Ao observar o desempenho de diversos termos de pesquisa, você pode escolher quais termos de pesquisa excluir.

O script usa o Relatório de desempenho da consulta da pesquisa para encontrar termos de pesquisa indesejados e adicioná-los como palavras-chave exatas negativas (ou positivas).

Como funciona

Solicitar um relatório com AWQL

Você pode solicitar um relatório usando AWQL desta maneira:

var report = AdWordsApp.report(
   "SELECT Query,Clicks,Cost,Ctr,ClickConversionRate,CostPerConvertedClick,ConvertedClicks,CampaignId,AdGroupId " +
   " FROM SEARCH_QUERY_PERFORMANCE_REPORT " +
   " WHERE " +
       " ConvertedClicks > 0" +
       " AND Impressions > " + IMPRESSIONS_THRESHOLD +
       " AND AverageCpc > " + AVERAGE_CPC_THRESHOLD +
   " DURING LAST_7_DAYS");
var rows = report.rows();

Quando você começar a fazer iterações nas linhas do relatório, os servidores de scripts do Google AdWords farão o download dos dados correspondentes no relatório solicitado e os armazenarão temporariamente. À medida que você faz iterações nas linhas, mais informações são enviadas para seu script.

Na AWQL acima, estamos solicitando o Relatório de desempenho da consulta da pesquisa (SEARCH_QUERY_PERFORMANCE_REPORT) e alguns campos de desempenho com dados relacionados aos últimos sete dias.

Como tomar decisões com dados do relatório

Em seguida, o script precisa fazer iterações nas linhas do relatório e decidir o que fazer com os dados do relatório:

while(rows.hasNext()) {
  var row = rows.next();
  if (parseFloat(row['Ctr']) < CTR_THRESHOLD) {
    addToMultiMap(negativeKeywords, row['AdGroupId'], row['Query']);
    allAdGroupIds[row['AdGroupId']] = true;
  } else if (parseFloat(row['CostPerConvertedClick']) < COST_PER_CONVERTED_CLICK_THRESHOLD) {
    addToMultiMap(positiveKeywords, row['AdGroupId'], row['Query']);
    allAdGroupIds[row['AdGroupId']] = true;
  }
}

Cada linha no relatório é um objeto JavaScript: uma matriz associativa em que a chave é o nome do campo solicitado e o valor é uma representação em string do valor do campo. Em seguida, o script analisa o valor do campo (que sempre será uma string) em um número e o compara com o CTR_THRESHOLD. Se a CTR (taxa de cliques) da palavra-chave estiver abaixo do limite, a palavra-chave será considerada insuficiente e adicionada à lista de palavras-chave negativas (a ser criada posteriormente). Também registramos o AdGroupId em um objeto diferente para permitir o envio de grupos de anúncios em massa.

Também acompanhamos palavras-chave acima do nosso limite de CTR e que têm um CostPerConversion razoável, e elas são adicionadas como palavras-chave positivas.

Como carregar grupos de anúncios em massa

Usando os AdGroupIds que registramos anteriormente, podemos carregar todos os grupos de anúncios em uma única solicitação:

var adGroupIdList = [];
for (var adGroupId in allAdGroupIds) {
  adGroupIdList.push(adGroupId);
}

var adGroups = AdWordsApp.adGroups().withIds(adGroupIdList).get();

Isso é muito mais eficiente do que carregá-los individualmente, porque vemos uma palavra-chave a ser adicionada. É altamente recomendável usar códigos para carregar objetos em um lote durante o trabalho com relatórios.

Como adicionar palavras-chave a grupos de anúncios

Em seguida, fazemos iterações em todos os grupos de anúncios (que carregamos em massa) e adicionamos as palavras-chave apropriadas:

if (negativeKeywords[adGroup.getId()]) {
  for (var i = 0; i < negativeKeywords[adGroup.getId()].length; i++) {
    adGroup.createNegativeKeyword('[' + negativeKeywords[adGroup.getId()][i] + ']');
  }
}

Esse código verifica se temos palavras-chave negativas a serem adicionadas a esse grupo, executa loop em cada palavra e a adiciona como uma palavra-chave negativa de correspondência exata. Desse modo, não exibimos anúncios em pesquisas com esse texto exato.

Configuração

  • Crie um novo script com o código-fonte abaixo.
  • Durante a visualização, o script provavelmente será concluído na janela de visualização de 30 segundos. Caso contrário, tente alterar a condição DURING LAST_7_DAYS para DURING YESTERDAY.
  • Depois da visualização do script, você verá uma lista de palavras-chave que seriam adicionadas como negativas (e, em alguns casos, positivas).

Código-fonte

// Copyright 2015, Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

/**
 * @name Search Query Report
 *
 * @overview The Search Query Report script uses the Search Query Performance
 *     Report to find undesired search terms and add them as negative (or
 *     positive) exact keywords. See
 *     https://developers.google.com/adwords/scripts/docs/solutions/search-query
 *     for more details.
 *
 * @author AdWords Scripts Team [adwords-scripts@googlegroups.com]
 *
 * @version 1.0.1
 *
 * @changelog
 * - version 1.0.1
 *   - Upgrade to API version v201609.
 * - version 1.0
 *   - Released initial version.
 */

// Minimum number of impressions to consider "enough data"
var IMPRESSIONS_THRESHOLD = 100;
// Cost-per-click (in account currency) we consider an expensive keyword.
var AVERAGE_CPC_THRESHOLD = 1; // $1
// Threshold we use to decide if a keyword is a good performer or bad.
var CTR_THRESHOLD = 0.5; // 0.5%
// If ctr is above threshold AND our conversion cost isn’t too high,
// it’ll become a positive keyword.
var COST_PER_CONVERSION_THRESHOLD = 10; // $10
// One currency unit is one million micro amount.
var MICRO_AMOUNT_MULTIPLIER = 1000000;

/**
 * Configuration to be used for running reports.
 */
var REPORTING_OPTIONS = {
  // Comment out the following line to default to the latest reporting version.
  apiVersion: 'v201705'
};

function main() {
  var report = AdWordsApp.report(
      'SELECT Query, Clicks, Cost, Ctr, ConversionRate,' +
      ' CostPerConversion, Conversions, CampaignId, AdGroupId ' +
      ' FROM SEARCH_QUERY_PERFORMANCE_REPORT ' +
      ' WHERE ' +
          ' Conversions > 0' +
          ' AND Impressions > ' + IMPRESSIONS_THRESHOLD +
          ' AND AverageCpc > ' +
           (AVERAGE_CPC_THRESHOLD * MICRO_AMOUNT_MULTIPLIER) +
      ' DURING LAST_7_DAYS', REPORTING_OPTIONS);
  var rows = report.rows();

  var negativeKeywords = {};
  var positiveKeywords = {};
  var allAdGroupIds = {};
  // Iterate through search query and decide whether to
  // add them as positive or negative keywords (or ignore).
  while (rows.hasNext()) {
    var row = rows.next();
    if (parseFloat(row['Ctr']) < CTR_THRESHOLD) {
      addToMultiMap(negativeKeywords, row['AdGroupId'], row['Query']);
      allAdGroupIds[row['AdGroupId']] = true;
    } else if (parseFloat(row['CostPerConversion']) <
        COST_PER_CONVERSION_THRESHOLD) {
      addToMultiMap(positiveKeywords, row['AdGroupId'], row['Query']);
      allAdGroupIds[row['AdGroupId']] = true;
    }
  }

  // Copy all the adGroupIds from the object into an array.
  var adGroupIdList = [];
  for (var adGroupId in allAdGroupIds) {
    adGroupIdList.push(adGroupId);
  }

  // Add the keywords as negative or positive to the applicable ad groups.
  var adGroups = AdWordsApp.adGroups().withIds(adGroupIdList).get();
  while (adGroups.hasNext()) {
    var adGroup = adGroups.next();
    if (negativeKeywords[adGroup.getId()]) {
      for (var i = 0; i < negativeKeywords[adGroup.getId()].length; i++) {
        adGroup.createNegativeKeyword(
            '[' + negativeKeywords[adGroup.getId()][i] + ']');
      }
    }
    if (positiveKeywords[adGroup.getId()]) {
      for (var i = 0; i < positiveKeywords[adGroup.getId()].length; i++) {
        var keywordOperation = adGroup.newKeywordBuilder()
            .withText('[' + positiveKeywords[adGroup.getId()][i] + ']')
            .build();
      }
    }
  }
}

function addToMultiMap(map, key, value) {
  if (!map[key]) {
    map[key] = [];
  }
  map[key].push(value);
}

Looking for the Manager Account (MCC) version? Click here

Enviar comentários sobre…

Precisa de ajuda? Acesse nossa página de suporte.