Agenda de contagem regressiva da venda

O script de contagem regressiva para venda mostra como atualizar seus parâmetros de anúncio a cada hora fornecendo uma contagem regressiva até um evento de venda que você gostaria de promover. A agenda de contagem regressiva estende esse conceito para vários eventos integrando uma agenda ao script e usando personalizadores de anúncios.

Visão geral

Suponha que você tenha uma loja de utensílios para cozinha que trabalhe com várias marcas de batedeiras, para duas das quais você configurou campanhas do Google AdWords.

Nome do produto Nome da campanha
Batedeira ProWhip prowhip
Batedeira WhipMaster whipmaster

Suponha que você tenha duas promoções a serem lançadas para essas batedeiras:

Nome do produto Data de início Data de término
Batedeira ProWhip 23 dez 2014 26 dez 2014
Batedeira WhipMaster 23 dez 2014 29 dez 2014

Quando uma pessoa pesquisar produtos no Google.com.br durante o período de vendas (digamos 24 dez 2014), será interessante que ela veja os anúncios a seguir:

Produto pesquisado Anúncio exibido
Batedeira ProWhip
Batedeira WhipMaster

Este script lê uma lista de eventos de uma agenda, configura uma origem do personalizador de anúncios usando esses dados, encontra a campanha específica para cada evento e aplica o item do personalizador de anúncios correto a cada uma dessas campanhas.

Configuração das campanhas

Você precisa configurar seus anúncios para usar a função COUNTDOWN dos personalizadores de anúncios. Para esse exemplo, os anúncios teriam esta configuração:

Nome da campanha Exemplo de anúncio
prowhip Batedeira ProWhip
www.example.com
Batedeira de 4,5L.
US$ 199 - a oferta termina em {=COUNTDOWN(SalesCountdown.EndDate)}.
Batedeira WhipMaster Batedeira WhipMaster Pro
www.example.com
Batedeira de 5,5L com cabeça móvel.
US$ 219 - a oferta termina em {=COUNTDOWN(SalesCountdown.EndDate)}.

Configuração de uma agenda de contagem regressiva

A configuração de uma agenda com contagem regressiva envolve três etapas:

1. Crie uma agenda de contagem regressiva

Você precisa criar uma Google agenda. Para isso, abra o menu suspenso ao lado de Minhas agendas e selecione a opção Criar nova agenda.

Em seguida, insira o nome da agenda e clique em no botão Criar agenda para criar a nova agenda.

2. Consiga seu ID de agenda

Abra a página "Configurações da agenda" abrindo o menu suspenso ao lado da agenda de contagem regressiva para a venda e selecione Configurações da agenda.

Navegue até o final da página e copie o ID da agenda. Você precisará desse número posteriormente para configurar seu script.

3. Crie entradas da agenda

Você precisa criar uma entrada da agenda para cada evento de contagem regressiva. Para fazer isso, clique em qualquer lugar da grade da agenda. Isso abre a página para criar uma nova entrada da agenda.

Tenha os elementos a seguir em mente ao criar seu evento:

  • Desmarque a opção Dia inteiro e escolha os horários de início e de término adequados ao criar seu evento.
  • Certifique-se de que o evento seja criado na agenda certa.
  • Certifique-se de atribuir um título significativo ao evento da agenda. O script usa esse valor para identificar um evento de venda.
  • No campo de descrição, insira Campaign=CAMPAIGN_NAME, onde CAMPAIGN_NAME é a campanha promocional associada ao seu evento de venda.

Clique no botão "Salvar" para criar seu evento.

Como o script funciona?

O script começa lendo todos os eventos da agenda usando a Google Calendar API.

function listAllEvents() {
  var calendarEvents = Calendar.Events.list(calendarId, {
    singleEvents: true,
    orderBy: 'startTime'
  });

  var retval = [];

  for (var i = 0; i < calendarEvents.items.length; i++) {
    var event = calendarEvents.items[i];
    if (event.start.date || event.end.date) {
      throw ('All day events are not supported. Set a start and end time.');
    }
    var startDate = parseDate(event.start.dateTime);
    var endDate = parseDate(event.end.dateTime);

    retval.push({
      'Name': event.summary,
      'Campaign': getCampaignName(event.description),
      'StartDate': startDate,
      'EndDate': endDate
    });
  }
  return retval;
}

Em seguida, ele configurará uma origem do personalizador de anúncios, se necessário.

function createAdCustomizerSource() {
  var operation = AdWordsApp.newAdCustomizerSourceBuilder()
    .addAttribute('StartDate', 'date')
    .addAttribute('EndDate', 'date')
    .addAttribute('EventName', 'text')
    .withName(CUSTOMIZER_NAME)
    .build();
  return operation.getResult();
}

Depois, será criada uma entrada no personalizador de anúncios para cada entrada da agenda:

function addCustomizerItem(adCustomizerSource, eventName, startDate, endDate,
                           campaignName) {
  var operation = adCustomizerSource.adCustomizerItemBuilder()
    .withAttributeValue('StartDate', formatDate(startDate))
    .withAttributeValue('EndDate', formatDate(endDate))
    .withAttributeValue('EventName', eventName)
    .withTargetCampaign(campaignName)
    .build();
  return operation.getResult();
}

Se você tiver configurado corretamente o uso dos personalizadores de anúncios para suas campanhas, sua campanha começará a ser veiculada com a contagem regressiva apropriada para a venda.

Configuração do script

  • Certifique-se de ativar a Google Calendar API a partir da caixa de diálogo de APIs avançadas. Veja instruções
  • Na parte superior do script, substitua o valor da variável CALENDAR_ID pelo ID da Agenda criada anteriormente.
  • Na parte superior do script, substitua o valor das variáveis EMAIL e EMAIL_CC pelos endereços de e-mail das pessoas que devem ser notificadas quando o script da Agenda de contagem regressiva para venda sincronizar um evento da Agenda de eventos. Deixe-os em branco para pular o envio de e-mails.

Programação

Programe a execução do script por hora. Sempre que o script for executado, ele detectará qualquer mudança feita nos eventos da sua Agenda e atualizará a conta de forma apropriada.

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 Sales Countdown Calendar
 *
 * @overview The Sales Countdown Calendar script allows you to update ads in
 *     your account to count down to multiple sales events by integrating a
 *     calendar to the script, and using ad customizers. See
 *     https://developers.google.com/adwords/scripts/docs/solutions/sales-countdown-calendar
 *     for more details.
 *
 * @author AdWords Scripts Team [adwords-scripts@googlegroups.com]
 *
 * @version 1.0
 *
 * @changelog
 * - version 1.0
 *   - Released initial version.
 */

// Set this value to your calendar's ID.
var CALENDAR_ID = 'INSERT_CALENDAR_ID';

// Name of the ad customizer source created by this script. If you change this
// value, you should also change your ads to refer to the new customizer name.
var CUSTOMIZER_NAME = 'SalesCountdown';

// Set this value to receive an email whenever the script updates ad
// customizers in your account.
var EMAIL = 'email@example.com';

// Set this value to the list of users who should get updates whenever the
// script updates ad customizers in your account.
var EMAIL_CC = ['email@example.com', 'email@example.com'];

function main() {
  var events = listAllEvents();
  var now = new Date();
  var customizer = getAdCustomizerSource();
  if (!customizer) {
    customizer = createAdCustomizerSource();
  }

  var logs = [];

  for (var i = 0; i < events.length; i++) {
    var event = events[i];
    if (event.Campaign) {
      var customizerItem = getCustomizerItem(customizer, event.Name);

      if (customizerItem) {
        if (event.EndDate > now) {
          if (customizerItem.getAttributeValue('EndDate') !=
              formatDate(event.EndDate) ||
              customizerItem.getTargetCampaignName() != event.Campaign) {
            setCustomizerItem(customizerItem, event.StartDate,
                              event.EndDate, event.Campaign);

            logs.push(Utilities.formatString('Updated countdown entry ' +
                'for %s. New end date: %s, associated campaign: %s.',
                event.Name, event.EndDate, event.Campaign));
          }
        } else {
          removeCustomizerItem(customizerItem);
          logs.push(Utilities.formatString('Removed countdown entry for ' +
              'expired event: %s.', event.Name));
        }
      } else {
        if (event.EndDate > now) {
          addCustomizerItem(customizer, event.Name, event.StartDate,
              event.EndDate, event.Campaign);
          logs.push(Utilities.formatString('Added countdown entry for %s. ' +
                    'End date: %s, associated campaign: %s.', event.Name,
                    event.EndDate, event.Campaign));
        }
      }
    }
  }

  if (logs.length > 0) {
    var htmlBody = [];
    htmlBody.push('The Sales countdown calendar script made the following ' +
                  'changes to Customer ID: ' +
                  AdWordsApp.currentAccount().getCustomerId() +
                  '<br>');
    htmlBody.push('<ul>');
    for (var i = 0; i < logs.length; i++) {
      htmlBody.push('<li>' + logs[i] + '</li>' + '<br>');
    }
    htmlBody.push('</ul>');
    MailApp.sendEmail({
      to: EMAIL,
      cc: EMAIL_CC.join(','),
      subject: 'Sales countdown calendar',
      htmlBody: htmlBody.join('\n')
    });
  }
}

/**
 * Gets the campaign name associated with an event.
 *
 * @param {string} eventDescription The event description.
 *
 * @return {?(string )} Name of the campaign associated with this event,
 *     or null if the event description doesn't specify one.
 */
function getCampaignName(eventDescription) {
  var parts = eventDescription.split('\n');
  for (var i = 0; i < parts.length; i++) {
    var subparts = parts[i].split('=');
    if (subparts.length == 2 && subparts[0].toLowerCase() == 'campaign') {
      return subparts[1];
    }
  }
  return null;
}

/**
 * Removes an ad customizer item.
 *
 * @param {AdCustomizerItem} customizerItem The item to be removed.
 */
function removeCustomizerItem(customizerItem) {
  customizerItem.remove();
}

/**
 * Retrieves an ad customizer item by its event name.
 *
 * @param {AdCustomizerSource} adCustomizerSource The ad customizer source to
 *     search for the item.
 * @param {string} eventName The event name.
 *
 * @return {?(AdCustomizerItem )} The ad customizer item if it exists,
 *     null otherwise.
 */
function getCustomizerItem(adCustomizerSource, eventName) {
  var items = adCustomizerSource.items().get();

  while (items.hasNext()) {
    var item = items.next();
    if (item.getAttributeValue('EventName') == eventName) {
      return item;
    }
  }
  return null;
}

/**
 * Updates an ad customizer item with new event details.
 *
 * @param {AdCustomizerItem} customizerItem The ad customizer item to
 *     be updated.
 * @param {Date} startDate The event start date.
 * @param {Date} endDate The event end date.
 * @param {string} campaignName The name of the campaign this event is
 *     associated with.
 */
function setCustomizerItem(customizerItem, startDate, endDate, campaignName) {
  customizerItem.setAttributeValue('StartDate', formatDate(startDate));
  customizerItem.setAttributeValue('EndDate', formatDate(endDate));
  customizerItem.setTargetCampaign(campaignName);
}

/**
 * Adds an ad customizer item.
 *
 * @param {AdCustomizerSource} adCustomizerSource The ad customizer source to
 *     which the new item is added.
 * @param {string} eventName The event name.
 * @param {Date} startDate The event start date.
 * @param {Date} endDate The event end date.
 * @param {string} campaignName The name of the campaign this event is
 *     associated with.
 *
 * @return {AdCustomizerItem} The ad customizer item.
 */
function addCustomizerItem(adCustomizerSource, eventName, startDate, endDate,
                           campaignName) {
  var operation = adCustomizerSource.adCustomizerItemBuilder()
    .withAttributeValue('StartDate', formatDate(startDate))
    .withAttributeValue('EndDate', formatDate(endDate))
    .withAttributeValue('EventName', eventName)
    .withTargetCampaign(campaignName)
    .build();
  return operation.getResult();
}

/**
 * Formats a date for creating a ad customizer item.
 *
 * @param {string} date The date to be formatted.
 *
 * @return {string} The formatted date.
 */
function formatDate(date) {
  return Utilities.formatDate(date, AdWordsApp.currentAccount().getTimeZone(),
                              'yyyyMMdd HHmmss');
}

/**
 * Create a new ad customizer source for this script.
 *
 * @return {(AdCustomizerSource)} The new ad customizer source.
 */
function createAdCustomizerSource() {
  var operation = AdWordsApp.newAdCustomizerSourceBuilder()
    .addAttribute('StartDate', 'date')
    .addAttribute('EndDate', 'date')
    .addAttribute('EventName', 'text')
    .withName(CUSTOMIZER_NAME)
    .build();
  return operation.getResult();
}

/**
 * Gets the ad customizer source for this script.
 *
 * @return {?(AdCustomizerSource )} An ad customizer source,
 *     if it exists, null otherwise.
 */
function getAdCustomizerSource() {
  var customizers = AdWordsApp.adCustomizerSources().get();
  while (customizers.hasNext()) {
    var customizer = customizers.next();
    if (customizer.getName() == CUSTOMIZER_NAME) {
      return customizer;
    }
  }
  return null;
}

/**
 * Gets the calendar's timezone.
 *
 * @return {string} The calendar's timezone.
 */
function getCalendarTimezone() {
  var calendar = Calendar.Calendars.get(CALENDAR_ID);
  return calendar.timeZone;
}

/**
 * Lists all events on the calendar.
 *
 * @return {Array.<Object>} An array of event details.
 */
function listAllEvents() {
  var calendarEvents = Calendar.Events.list(CALENDAR_ID, {
    singleEvents: true,
    orderBy: 'startTime'
  });

  var retval = [];

  for (var i = 0; i < calendarEvents.items.length; i++) {
    var event = calendarEvents.items[i];
    if (event.start.date || event.end.date) {
      throw ('All day events are not supported. Set a start and end time.');
    }
    var startDate = parseDate(event.start.dateTime);
    var endDate = parseDate(event.end.dateTime);

    retval.push({
      'Name': event.summary,
      'Campaign': getCampaignName(event.description),
      'StartDate': startDate,
      'EndDate': endDate
    });
  }
  return retval;
}

/**
 * Parses a date from Google Calendar.
 *
 * @param {string} dateText The date as a string.
 *
 * @return {Date} the parsed date.
 */
function parseDate(dateText) {
  // Date format is yyyy-mm-ddTHH:mm:ss±HH:mm.
  var dateFormat = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})([+-]\d{2}):(\d{2})$/;
  var parts = dateText.match(dateFormat);

  var year = parts[1];
  var month = parts[2];
  var day = parts[3];
  var hour = parts[4];
  var minute = parts[5];
  var second = parts[6];
  var tzHour = parseInt(parts[7]);
  var tzMin = parseInt(parts[8]);

  // Change the sign of tzMin if tzHour is negative. This way, -05:30
  // is interpreted as -05:00 -00:30 instead of -05:00 -00:30
  if (tzHour < 0) {
    tzMin = -tzMin;
  }
  var tzOffset = new Date().getTimezoneOffset() + tzHour * 60 + tzMin;

  return new Date(year, month - 1, day, hour, minute - tzOffset, second, 0);
}

Enviar comentários sobre…

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