977 anunciantes en línea
977 anunciantes en línea
¿Eres nuevo o estas pensando en comenzar a utilizar AdWords? Aprende a configurar una campaña, evalúa la inversión que realizas y descubre la mejor forma de llevar el manejo de tu cuenta.
Guiame
favorite_border
Responder

Script AdWords Alerta Presupuesto + Tarea + Evento Calendar

[ Editado ]
Usuario Destacado
# 1
Usuario Destacado

Buenas amig@s, el otro día estuve haciendo unas pruebas con las API Avanzadas y he programado un pequeño script el cual quiero compartir con todos vosotros.

 

Este script sirve para enviar una notificación por correo electrónico cuando las campañas que nosotros seleccionemos lleguen a un coste especifico. 


También calculara cuantos días de presupuesto queda y creara un evento en el calendario. Por otro lado creara una tarea para controlar las notificaciones a posterior base el estado de la tarea.

 

A continuación dejo el código, asi como un enlace para su descarga y un pequeño tutorial de instalación y uso.

 

Script AdWords

 

[ Descargar Script AdWords ]

 

 /* 
 
 SCRIPT ADWORDS DE ALERTA DE PRESUPUESTO

author: Marcelo Fernandez
web: www.marcelofernandez.es <-.-> www.soporte-web.es
v.82
`www´
(0 0)
---oOO-- (_) --oOO---
╔═══════════════════════╗
║ By: MaRcElo FeRnAnDeZ ║
╚═══════════════════════╝
-------------------
|__|__|
|| ||
ooO Ooo

*/

function main() {

var alerta = 5500; // Definir Alerta
var presupuesto = 6000; // Definir Presupuesto
var fecha = ('20150601'); // Definir Fecha de Ingreso - yyyyMMdd
var correo = ('correo@para_notificaciones.es'); // Definir Correo Notificacion
var nombre_alerta = ('Alerta Presupuesto AdWords'); // Definir Mensaje para Tarea, Calendario y Asunto Correo


if (alerta < presupuesto){

Presupuesto(alerta, presupuesto, fecha, correo, nombre_alerta);

}else{

Logger.log ('ERROR DE CONFIGURACION \n\nEl importe de la alerta debe ser inferior al del presupuesto');

}

}

//FUNCION DE PRESUPUESTO
function Presupuesto(alerta, presupuesto, fecha, correo, nombre_alerta) {

var hoy = ControlFecha(0); // Fecha Comparacion ('yyyyMMdd');

var selector_busqueda = AdWordsApp.campaigns()
.withCondition('Name = "Busqueda"') // Definir Nombre de Campaña
.get();

var busqueda = selector_busqueda.next();
var stats_busqueda = busqueda.getStatsFor(fecha, hoy);

var selector_remarketing = AdWordsApp.campaigns()
.withCondition('Name = "Remarketing"') // Definir Nombre de Campaña
.get();

var remarketing = selector_remarketing.next();
var stats_remarketing = remarketing.getStatsFor(fecha, hoy);


var consumido = (stats_busqueda.getCost() + stats_remarketing.getCost());
var total = presupuesto - consumido
total = total.toFixed(2);

var porciento = (consumido * 100) / presupuesto;
porciento = Math.round(porciento);

// Fijar Alerta en Cosumido >= o Total <=
if (consumido >= alerta) {

var imagenEmpresaUrl = ('https://www.google.com/partners/images/partners-badge.png'); // Definir URL Logo Empresa
var imagenEmpresa = UrlFetchApp.fetch(imagenEmpresaUrl).getBlob().setName('imagenEmpresaUrl');

var lista_tarea = '@default';
var tarea = Tasks.Tasks.list(lista_tarea);

for (var i = 0; i < tarea.items.length; i++) {

if(tarea.items[i].title == nombre_alerta){

var estado = tarea.items[i].status;

if(estado == 'completed'){

Logger.log('TAREA COMPLETADA PERO NO REALIZADA\n');

MailApp.sendEmail({to: correo, subject: nombre_alerta,
htmlBody:'<img src="cid:logo" /><br />' +
'<p>Le recordamos que todavia no esta reiniciado el presupuesto. Ha consumido <b>' + consumido + '€</b> de ' + presupuesto + '€, le quedan ' + total + '€.</p>' +
'<p style="color:#ff0000;"><i>No responda a este mensaje, ha sido generado automaticamente.</i></p>',

inlineImages:{logo: imagenEmpresa}
});

Logger.log('Correo de Alerta Enviado. Consumido: ' + consumido + '€ = ' + porciento + '%');
break;

}else if (estado == 'needsAction'){

Logger.log('TAREA PENDIENTE');
break;

}else{};

}

Logger.log('ALERTA ACTIVADA\n');

MailApp.sendEmail({to: correo, subject: nombre_alerta,
htmlBody:'<img src="cid:logo" /><br />' +
'<p>El presupuesto ha llegado a <b>' + consumido + '€</b> (' + porciento + '%) de ' + presupuesto + '€, le quedan ' + total + '€.</p>' +

'<b>Estadisticas</b><hr>' +

'<table><tr><td>' + busqueda.getName() + ' </td> <td> Coste: ' + stats_busqueda.getCost() + '€ </td> <td> Clics: ' + stats_busqueda.getClicks() + ' </td>' +
'<td> Impresiones: ' + stats_busqueda.getImpressions() + ' </td></tr>' +

'<tr><td>' + remarketing.getName() + ' </td> <td> Coste: ' + stats_remarketing.getCost() + '€ </td> <td> Clics: ' + stats_remarketing.getClicks() + ' </td>' +
'<td> Impresiones: ' + stats_remarketing.getImpressions() +' <td></tr></table>' +

'<p style="color:#ff0000;"><i>No responda a este mensaje, ha sido generado automaticamente.</i></p>',


inlineImages:{logo: imagenEmpresa}
});

Logger.log('Correo de Alerta Enviado');

CrearTarea(presupuesto, consumido, total, nombre_alerta);

var yyyy = fecha.substring(0, 4);
var mm = fecha.substring(6, 4);
var dd = fecha.substring(8, 6);

var fecha = CambiarFecha(yyyy + '-'+ mm + '-' + dd ,"yyyy-mm-dd","-");

CalcularMedia(fecha, new Date(), presupuesto, consumido, total, correo, nombre_alerta);

Logger.log('\nTODO CORRECTO :-)');

}

}else{

Logger.log('SIN NOVEDAD. Consumido: ' + consumido + '€ = ' + porciento + '%\nTODO CORRECTO :-)');

}

}

//FUNCION CALCULAR DIAS Y MEDIA
function CalcularMedia(fecha, hoy, presupuesto, consumido, total, correo, nombre_alerta) {

var difference = (hoy - fecha);

var years = Math.floor(difference / (1000 * 60 * 60 * 24 * 365));
difference -= years * (1000 * 60 * 60 * 24 * 365);
var months = Math.floor(difference / (1000 * 60 * 60 * 24 * 30.4375));
var day = Math.floor(difference / (1000 * 60 * 60 * 24));

var dif = '';
if (years > 0)
dif = years;

if (months > 0) {
if (years > 0) dif;
dif += day;
}else {
dif = day;
}


Logger.log('\nConsumido ' + consumido + '€ en ' + dif + ' dias');

var resultado = (total * dif) / consumido;
resultado = Math.round(resultado);
var resultado_final = resultado.toFixed();

Logger.log('Queda un total de ' + total + '€, aproximadamente ' + resultado_final + ' dias' );

EventoCalendar(presupuesto, consumido, total, correo, nombre_alerta, resultado_final);

}

//FUNCION NECESARIA PARA EVENTO CALENDAR - API REQUERIDA
function EventoCalendar(presupuesto, consumido, total, correo, nombre_alerta, resultado_final) {

var calendario = 'primary';
var inicio = new Date();
var cortesia = ('-' + resultado_final);
var fin = new Date();
fin.setDate(fin.getDate() - cortesia);

var evento = {
summary: nombre_alerta,
description: 'El presupuesto ha llegado a ' + consumido + '€ de ' + presupuesto + '€ le queda ' + total + ' €',

start: {
dateTime: inicio.toISOString()
},
end: {
dateTime: fin.toISOString()
},
attendees: [{email: correo}],
colorId: 10
};

evento = Calendar.Events.insert(evento, calendario);
Logger.log('Alerta Creada en Calendario ID: ' + evento.getId());

}

//FUNCION NECESARIA PARA CREAR TAREA GOOGLE - API REQUERIDA
function CrearTarea(presupuesto, consumido, total, nombre_alerta) {

var lista_tarea = '@default';
var tarea = Tasks.newTask();
tarea.title = nombre_alerta;
tarea.notes = 'El presupuesto ha llegado a ' + consumido + '€ de ' + presupuesto + '€ le queda ' + total + ' €';

var tarea_tiempo = new Date();
tarea_tiempo.setDate(tarea_tiempo.getDate() + 5);
tarea.due = tarea_tiempo.toISOString();

var tarea_insert = Tasks.Tasks.insert(tarea, lista_tarea);
Logger.log('Tarea Creada ID: ' + tarea_insert.id);

}

//FUNCION CAMBIAR FORMA FECHA
function CambiarFecha(_dia, _formato, _separador)
{

var formatLowerCase = _formato.toLowerCase();
var formatItems = formatLowerCase.split(_separador);
var dateItems = _dia.split(_separador);
var monthIndex = formatItems.indexOf("mm");
var dayIndex = formatItems.indexOf("dd");
var yearIndex = formatItems.indexOf("yyyy");
var month = parseInt(dateItems[monthIndex]);
month-=1;

var formatedDate = new Date(dateItems[yearIndex],month,dateItems[dayIndex]);
return formatedDate;

}

//FUNCION CONTROL FECHA
function ControlFecha(dias) {

var hoy = new Date();
hoy.setDate(hoy.getDate() - dias);

return Utilities.formatDate(hoy, "PST", "yyyyMMdd");

}

 

[ Descargar Script AdWords ]

 

 

 

 Tutorial de Instalación

 

1. - Preparando el Entorno
2. - Configuración
3. - Resultados 

4.-  Errores

5.-  Anexo

 

 

 

1) PREPARANDO EL ENTORNO

 

 

Antes de comenzar debemos autorizar la secuencia de comandos y activar las API Avanzadas para poder utilizar Google Calendar y Task. Adjuntos imagenes.

 

Vamos a Operaciones en  Bloque -> Secuencia de Comandos y le damos a Nueva Secuencia de Comandos.

 

script-alerta-adwords-2.jpg

 

Escribimos un nombre y autorizamos.

 

script-alerta-adwords-3.jpg

 

script-alerta-adwords-4.jpg

 

Clic en el botón de API Avanzadas.

 

script-alerta-adwords-5.jpg

 

Seleccionar Calendar y Task, No olvideis hacer clic en Google Developers Console.

 

script-alerta-adwords-6.jpg

 

En la nueva ventana que hemos abierto buscamos Calendar y Task.

 

script-alerta-adwords-7.jpg

 

script-alerta-adwords-8.jpg

 

Hacemos clic y habilitamos el API.

 

script-alerta-adwords-9.jpg

 

 

script-alerta-adwords-10.jpg

 

 

script-alerta-adwords-11.jpg

 

Volvemos a Google AdWords, Pegamos el Script y Guardamos.

 

script-alerta-adwords-12.jpg

 

Autorizar las nuevas funciones del script.

 

¡Ya esta el entorno preparado!

 

 

 

2) CONFIGURACIÓN

 

 

La configuracion es bastante simple:

 

 Debemos definir el presupuesto, rango de alerta, correo para las notificaciones, nombre identificativo de la alerta y fecha del ingreso o incio del presupuesto.

 

Ejemplo: Un anunciante ingresa 6000€ el 1 de junio, y quiere recibir un correo de alerta cuando las campañas A y B lleguen a un consumo de 5500€.

 

 var alerta = 5500; // Definir Alerta
var presupuesto = 6000; // Definir Presupuesto
var fecha = ('20150601'); // Definir Fecha de Ingreso - yyyyMMdd
var correo = ('correo@para_notificaciones.es'); // Definir Correo Notificacion
var nombre_alerta = ('Alerta Presupuesto AdWords'); // Definir Mensaje para Tarea, Calendario y Asunto Correo

 

2º Especificamos el nombre de la Campaña A y B. Aquí se puede añadir más campañas, solo se debe replicar el selector y añadir a la variable consumido. También se puede filtrar por otras opciones si cambiamos la condición.

 

 var selector_busqueda = AdWordsApp.campaigns()
.withCondition('Name = "Busqueda"') // Definir Nombre de Campaña
.get();

var busqueda = selector_busqueda.next();
var stats_busqueda = busqueda.getStatsFor(fecha, hoy);

var selector_remarketing = AdWordsApp.campaigns()
.withCondition('Name = "Remarketing"') // Definir Nombre de Campaña
.get();

var remarketing = selector_remarketing.next();
var stats_remarketing = remarketing.getStatsFor(fecha, hoy);


var consumido = (stats_busqueda.getCost() + stats_remarketing.getCost());

 

 

Especificar imagen de Empresa o Logo.

 

var imagenEmpresaUrl = ('https://www.google.com/partners/images/partners-badge.png'); // Definir URL Logo Empresa

 

¡Ya esta todo listo para Ejecutar la secuencia de comandos!

 

 

 

3) RESULTADOS

 

 

Bien, una vez preparado el entorno y configurado el script, vamos a ejecutarlo.

 

 script-alerta-adwords-13.jpg

 

 

Los Resultados pueden ser los siguientes:

 

1.- La regla No se Cumple. En este caso el script no hace nada. 

 

script-alerta-adwords-14.jpg

 

2.- La regla se Cumple. En este caso se procede a la notificación por correo electrónico, se calcula los días que quedan de presupuesto para añadir el evento al calendario y  se crea la tarea para controlar el script.

 

 

script-alerta-adwords-15.jpg

 

- El correo que envía de notificación. 

 

 

script-alerta-adwords-16.jpg

 

- El evento del calendario.

 

script-alerta-adwords-18.jpg

 

- La Tarea que usaremos como punto de  control.

 

script-alerta-adwords-17.jpg

 

3.- La regla se Cumple. Pero la tarea tarea ya existe y esta como PENDIENTE. En este caso el script no hace nada.

 

script-alerta-adwords-19.jpg

 

4.- La regla se Cumple. La tarea tarea ya existe y esta como COMPLETADA. En este caso el script vuelve a notificar por correo que el presupuesto todavía no se ha recargado.

 

 

Bien ya solo que programar la regla para que se ejecute diariamente.

 

script-alerta-adwords-21.jpg

 

 

4) ERRORES

  

Algunos de los errores que pueden salir si no configuramos bien el script. Recordar autorizar las funciones y habilitar las API Avanzadas

 

- El importe de la alerta es superior que el presupuesto.

 

error-script-adwords.jpg

- Formato de Fecha Incorrecto. Recordar que la fecha del ingreso debe ser YYYYMMDD.

 

error-script-adwords-2.jpg

 

 

- La fecha de ingreso no puede ser posterior a la actual XD.

 

error-script-adwords-3.jpg

 

- Nombre de la campaña Incorrecto.

 

error-script-adwords-4.jpg

  

 

 

5) ANEXO

  

Si queréis Comparar Estadísticas con una fecha exacta, debeis cambiar la siguiente variable.

 

 var hoy = ControlFecha(0); // Fecha Comparacion ('yyyyMMdd');

 Por esta otra:

 

 var hoy = ('yyyyMMdd'); // Fecha Comparacion

 

 

Si queréis ejecutar el script a nivel de MCC, debeis añadir las siguientes lineas de codigo al principio de la funcion Presupuesto y especificar el ID de Cliente. Dejo un fragmento de codigo para que podais situarlo.

 

 

function Presupuesto(alerta, presupuesto, fecha, correo, nombre_alerta) {

var hoy = ControlFecha(0); // Fecha Comparacion ('yyyyMMdd');

var id_cliente = ('XXX-XXX-XXXX'); // Definir ID Cliente

var selector_cuenta = MccApp.accounts()
.withIds([id_cliente]).get().next();

MccApp.select(selector_cuenta);

var selector_busqueda = AdWordsApp.campaigns()
.withCondition('Name = "Busqueda"') // Definir Nombre de Campaña
.get();



 

Bueno compañeros espero que os guste este pequeño script. Para la próxima fase lo mejoraremos con el envío de un reporte de AdWords y Analytics. No dudeis en comentar.

 

Salu2  :-)

Marcelo Fernández
Experto Google AdWords

Expertos respondieronverified_user

Soluciones aceptadas
Marcado como solución aceptada.
Solución
Aceptado por el autor del tema MarceloFdez
marzo

Re: Script AdWords Alerta Presupuesto + Tarea + Evento Calendar

[ Editado ]
Usuario Destacado
# 21
Usuario Destacado

Nota importante, para incluir campañas de youtube y shopping se debe cambiar el selector :-)

 

  var selector_youtube = AdWordsApp.videoCampaigns()
.withCondition('Name = "Youtube"') // Definir Nombre de Campaña
.get();

var youtube = selector_youtube.next();
var stats_youtube = youtube.getStatsFor(fecha, hoy);

var selector_shopping = AdWordsApp.shoppingCampaigns()
.withCondition('Name = "shopping"') // Definir Nombre de Campaña
.get();

var shopping = selector_shopping.next();
var stats_shopping = shopping.getStatsFor(fecha, hoy);

 

Salu2

Marcelo Fernández
Experto Google AdWords

Ver la solución en mensaje original publicado


Todas las respuestas

Re: Script AdWords Alerta Presupuesto + Tarea + Evento Calendar

Colaborador Principal
# 2
Colaborador Principal
Hola Marcelo

No lo he probado todavía pero tiene muy buena pinta.
Te doy mis más sincera Enhorabuena!

Un saludo
oscar abad

Re: Script AdWords Alerta Presupuesto + Tarea + Evento Calendar

Novato ✭
# 3
Novato ✭
Hola, cómo estás Marcelo?

No se puede recuperar el siguiente objeto: iterador ha llegado al final. (Línea 31)

¿Sabes lo que podría ser?

Gracias

Alex Gallego

Re: Script AdWords Alerta Presupuesto + Tarea + Evento Calendar

[ Editado ]
Usuario Destacado
# 4
Usuario Destacado

Buenas Alex G.

Revisa que el nombre de tu campaña este bien escrito en la condición .withCondition('Name = "Busqueda"') de la linea 31.

No obstante, este error tambien puede ser ocasionado si ejecutas el script a Nivel de MCC.

 

EDITO: He actualizado el post y la descarga para que podais utilizar el script a nivel de MCC tambien.


Saludos ;-)

Marcelo Fernández
Experto Google AdWords

Re: Script AdWords Alerta Presupuesto + Tarea + Evento Calendar

Novato ✭ ✭ ✭
# 5
Novato ✭ ✭ ✭
Muchas gracias Marcelo !!

Re: Script AdWords Alerta Presupuesto + Tarea + Evento Calendar

Novato ✭
# 6
Novato ✭
Muchas gracias Marcelo

Re: Script AdWords Alerta Presupuesto + Tarea + Evento Calendar

Colaborador Principal
# 7
Colaborador Principal
muy currado, gracias por compartir!

Re: Script AdWords Alerta Presupuesto + Tarea + Evento Calendar

Colaborador Principal
# 8
Colaborador Principal
Fantástico Marcelo. Espero ver muchas más aportaciones tuyas por aquí.

Muchas gracias por tu aportación !!!!
Jorge Arias
Especialista en Google Shopping (Geotelecom)

Re: Script AdWords Alerta Presupuesto + Tarea + Evento Calendar

Graduado ✭
# 9
Graduado ✭
Enhorabuena por el artículo, gracias por la aportación.
Laura Melgar Otero

Re: Script AdWords Alerta Presupuesto + Tarea + Evento Calendar

Usuario Destacado
# 10
Usuario Destacado

Gracias a vosotros chic@s. Espero que os sea de utilidad. ;-)

Marcelo Fernández
Experto Google AdWords