Este es un script de AdWords que le permite optimizar las ofertas cada hora del día.

El columnista Daniel Gilbert comparte la secuencia de comandos de AdWords de Brainlabs que le permite establecer 24 multiplicadores de ofertas diferentes por hora, los 7 días de la semana.

Capture2

Optimizar las ofertas de las palabras clave y del grupo de anuncios para maximizar el rendimiento puede resultar complicado. Establecer un cronograma para administrar sus ofertas es una excelente manera de asegurarse de que no está gastando demasiado en los momentos equivocados y, lo que es más importante, de que el tráfico valioso lo recibe en el momento adecuado.

Herramienta integrada de AdWords para modificar ofertas según la hora del día: programación de anuncios – solo le permite hasta seis ventanas de licitación por día.

Para las cuentas a gran escala que exigen un enfoque más granular, con ofertas que deben cambiarse cada hora, las limitaciones anteriores simplemente no sirven. Por ejemplo, las tasas de conversión de Dominó varían drásticamente durante diferentes franjas horarias en diferentes días; la empresa no quiere ofertar en los mismos niveles a las 7:00 pm, 9:00 pm y 11:00 pm los miércoles y sábados.

Entonces, los especialistas en marketing matemático de Brainlabs (mi empresa) escribió una secuencia de comandos de AdWords, publicada en su totalidad a continuación, que le permite controlar sus ofertas para cada hora del día. Si nunca ha utilizado secuencias de comandos, puede leer nuestra serie reciente sobre secuencias de comandos de AdWords o simplemente copiar y pegar el código en su cuenta para comenzar.

La secuencia de comandos funciona alterando el modificador de ofertas de la programación de anuncios haciendo referencia a una hoja de cálculo de administración central. Su primer trabajo será configurar una hoja de cálculo correcta. Copia y pega esto programación de anuncios genérica en un documento de Google propio. Asegúrese de cambiar el nombre de la hoja al nombre de la cuenta real desde la que ejecutará el script.

A continuación, ingrese sus propios valores de modificadores de ofertas en la tabla. Ingresar el 100% dejará la oferta como está, mientras que el 150% será un multiplicador de 1.5.

Tome nota de la URL de su hoja de cálculo porque la necesitará para la siguiente sección.

El siguiente paso es copiar y pegar el guión al final del artículo en su cuenta. Hay algunas opciones para configurar. Eche un vistazo a la parte inicial del guión etiquetada Opciones.

  • Selecciona el primer intento variable a cierto; como es la primera vez que se ejecuta el script, hay un procedimiento de inicialización.
  • Introduzca la URL de la hoja de Google que utilizó anteriormente para spreadsheetUrl, reemplazando el valor que existe actualmente.
  • excludeCampaignNameContains excluirá todas las campañas que tengan esto en su nombre. Déjelo en blanco para no excluir ninguna campaña.
  • includeCampaignNameContains solo incluirá campañas que tengan esto en su nombre. Déjelo en blanco para incluir todas las campañas.

Una vez que se hayan ingresado las configuraciones opcionales, ejecute el script manualmente una vez, luego cambie el primer intento variable a falso.

Ahora está listo para configurar una programación para el guión. Le recomendamos que ejecute el script cada hora. Si no está seguro de cuáles son sus tasas de conversión en diferentes momentos, seguiremos con otro artículo sobre cómo calcular los multiplicadores de ofertas por hora.

Nota: Para todas las campañas afectadas, esta secuencia de comandos eliminará todas las programaciones de anuncios existentes.

/**
*
* Advanced ad scheduling
*
* This script will apply ad schedules and set the bid modifier for the schedule
* at each hour according to a multiplier timetable in a Google sheet.
*
* Version: 1.0
* brainlabsdigital.com
*
**/

function main() {

  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
  //Options
  
  //Be sure to set firstRun to false after running the script for the first time
  var firstRun = true;
  
  //The google sheet to use
  //The default value is the example sheet linked to in the article
  var spreadsheetUrl = "https://docs.google.com/a/brainlabsdigital.com/spreadsheets/d/1JDGBPs2qyGdHd94BRZw9lE9JFtoTaB2AmlL7xcmLx2g/edit#gid=0";
  
  //Optional parameters for filtering campaign names. 
  //Leave blank to use filters. The matching is case insensitive.
  var excludeCampaignNameContains = ""; //Select which campaigns to exclude. Leave blank to not exclude any campaigns.
  var includeCampaignNameContains = ""; //Select which campaigns to include. Leave blank to include all campaigns.
  
  //When you want to stop running the ad scheduling for good, set
  //the lastRun variable to true to remove all ad schedules.
  var lastRun = false;
  
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
  
  //Retrieving up hourly data
  var scheduleRange = "B2:H25";
  var accountName = AdWordsApp.currentAccount().getName();
  var spreadsheet = SpreadsheetApp.openByUrl(spreadsheetUrl);
  var sheet = spreadsheet.getSheetByName(accountName);
  var data = sheet.getRange(scheduleRange).getValues();
  
  var timeZone = AdWordsApp.currentAccount().getTimeZone();
  var date = new Date();
  var dayOfWeek = parseInt(Utilities.formatDate(date, timeZone, "uu")) - 1;
  var hour = parseInt(Utilities.formatDate(date, timeZone, "HH"));
  
  //This hour's bid multiplier.
  var thisHourMultiplier = data[hour][dayOfWeek];
  var lastHourCell = "I2";
  sheet.getRange(lastHourCell).setValue(thisHourMultiplier);
  
  //Initialise for use later.
  var weekDays = ["MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY"];
  var adScheduleCodes = [];
  
  //Dummy name to exclude
  if(excludeCampaignNameContains === ""){
    excludeCampaignNameContains += "#@%" + date + "~};";
  }
  
  var campaignIds = [];
  
  //Pull a list of all relevant campaign IDs in the account.
  var campaignIterator = AdWordsApp.campaigns()
  .withCondition('Name DOES_NOT_CONTAIN_IGNORE_CASE "' + excludeCampaignNameContains + '"')
  .withCondition('Name CONTAINS_IGNORE_CASE "' + includeCampaignNameContains + '"')
  .get();
  while(campaignIterator.hasNext()){
    var campaign = campaignIterator.next();
    var campaignId = campaign.getId();
    campaignIds.push(campaignId);
  }
  
  //Return if there are no campaigns.
  if(campaignIds.length === 0){
    Logger.log("There are no campaigns matching your criteria.");
    return;
  }
  
  //Remove all ad scheduling for the last run.
  if(lastRun){
    RemoveAdSchedules(campaignIds);
    return;
  }
  
  //Remove all existing ad scheduling and add new schedules for the first run.
  if(firstRun){
    RemoveAdSchedules(campaignIds);
    AddAdSchedules(campaignIds, weekDays);
	Logger.log("Set the firstRun variable to false");
  }
  
  //Populate the adScheduleCodes array with the ad schedule ID corresponding to the weekDays array. 
  var campaignIterator = AdWordsApp.campaigns()
  .withIds(campaignIds)
  .withLimit(1)
  .get();
  while(campaignIterator.hasNext()){
    var campaign = campaignIterator.next();
    var adSchedules = campaign.targeting().adSchedules().get();
	if(adSchedules.totalNumEntities() === 0) {
      Logger.log("Some campaigns do not have ad scheduling, please re-do the first run");
      return;
    }
    while(adSchedules.hasNext()){
      var adSchedule = adSchedules.next();
      var adScheduleDay = adSchedule.getDayOfWeek();
      var adScheduleId = adSchedule.getId();
      adScheduleCodes[weekDays.indexOf(adScheduleDay)] = adScheduleId;
    }
  }
  
  var adScheduleCode = adScheduleCodes[dayOfWeek];
  
  //Apply the ad schedule bid modifier
  ModifyAdSchedule(campaignIds, adScheduleCode, thisHourMultiplier);
  
  //Set yesterday's ad schedule to a 0% bid modifier
  if(hour === 1){
    var yesterdayIndex = dayOfWeek - 1;
    if(yesterdayIndex === -1 ) yesterdayIndex = 6;
    var yesterdayAdScheduleCode = adScheduleCodes[yesterdayIndex];
    ModifyAdSchedule(campaignIds, yesterdayAdScheduleCode, 1);
  }
  
}

/**
 * Function to add ad schedules for all campaigns in the account. The scheduling will be 
 * added as a whole-day period for every day specified in the passed parameter array and will
 * be added with a bid modifier of 0%.
 *
 * @param array days the array of days for which to add ad scheduling
 * @return void
 */
function AddAdSchedules(campaignIds, days){
  
  var campaignIterator = AdWordsApp.campaigns()
  .withIds(campaignIds)
  .get();
  while(campaignIterator.hasNext()){
    var campaign = campaignIterator.next();
    for(var i = 0; i < days.length; i++){
      campaign.addAdSchedule({
        dayOfWeek: days[i],
        startHour: 0,
        startMinute: 0,
        endHour: 24,
        endMinute: 0,
        bidModifier: 1
      });
    }
  }
}

/**
 * Function to remove all ad schedules from all campaigns refernced in the passed array.
 *
 * @param array campaignIds array of campaign IDs to remove ad scheduling from
 * @return void
 */
function RemoveAdSchedules(campaignIds) {
  
  var adScheduleIds = [];
  
  var report = AdWordsApp.report(
    'SELECT CampaignId, Id ' + 
    'FROM CAMPAIGN_AD_SCHEDULE_TARGET_REPORT ' +
    'WHERE CampaignId IN ["' + campaignIds.join('","')  + '"] ' +
    'DURING YESTERDAY');
  
  var rows = report.rows();
  while(rows.hasNext()){
    var row = rows.next();
    var adScheduleId = row['Id'];
    var campaignId = row['CampaignId'];
    adScheduleIds.push([campaignId,adScheduleId]);
  }
  
  var chunkedArray = [];
  var chunkSize = 50000;
  
  for(var i = 0; i < adScheduleIds.length; i += chunkSize){
    chunkedArray.push(adScheduleIds.slice(i, i + chunkSize));
  }
  
  for(var i = 0; i < chunkedArray.length; i++){
    
    var adScheduleArray = [];
    
    var adScheduleIterator = AdWordsApp.targeting()
    .adSchedules()
    .withIds(chunkedArray[i])
    .get();
    while (adScheduleIterator.hasNext()) {
      var adSchedule = adScheduleIterator.next();
      adScheduleArray.push(adSchedule);
    }
    
    for(var j = 0; j < adScheduleArray.length; j++){
      adScheduleArray[j].remove();
    }
  }
  
}

/**
 * Function to set the bid modifier for a specific ad schedule period for a set of campaigns.
 *
 * @param array campaignIds the array of campaign IDs to have thier ad schedules modified
 * @param int adScheduleCode the ID of the adschedule to be modified
 * @param float bidModifier the multiplicative bid modifier
 * @return void
 */
function ModifyAdSchedule(campaignIds, adScheduleCode, bidModifier){
  
  var adScheduleIds = [];
  
  for(var i = 0; i < campaignIds.length; i++){
    adScheduleIds.push([campaignIds[i],adScheduleCode]);
  }
  
  var adScheduleIterator = AdWordsApp.targeting()
  .adSchedules()
  .withIds(adScheduleIds)
  .get();
  while (adScheduleIterator.hasNext()) {
    var adSchedule = adScheduleIterator.next();
    adSchedule.setBidModifier(bidModifier);
  }
}

Las opiniones expresadas en este artículo pertenecen al autor invitado y no necesariamente a El Blog informatico. Los autores del personal se enumeran aquí.


Deja un comentario