Automatizar tareas Adwords – reportes

Los que trabajamos habitualmente con Adwords «perdemos» mucho tiempo con tareas recurrentes que se pueden automatizar gracias a la tecnología Adwords Scripts.

Gracias a estos scripts podemos interactuar con el API de Google Adwords, podemos crear reportes, básicos o completos de cuentas, campañas, anuncios etc…, podemos detectar errores en la cuenta, problemas de URL, automaitzar pujas  y un sin fin de cosas más.

Vamos a ver un ejemplo de como crear un reporte general de la cuneta en una hoja de cálculo de Google.

El primer paso es acceder a esta plantilla y crear una copia en nuestro Gogole Drive. Si queremos recibir o enviar el reporte por email debemos cambiar el email del ejemplo.

A continuación accedemos a Adwords y nos dirigmos a Operaciones en Bloque -> Secuencias de comandos y añadimos una nueva con el sigueinte codigo:

[code language=»javascript»]
var SPREADSHEET_URL = ‘YOUR_SPREADSHEET_URL’;

function main() {
var spreadsheet = SpreadsheetApp.openByUrl(SPREADSHEET_URL);
spreadsheet.getRangeByName(‘account_id_report’).setValue(
AdWordsApp.currentAccount().getCustomerId());

var yesterday = getYesterday();
var last_check = spreadsheet.getRangeByName(‘last_check’).getValue();
// Checks every day from last day checked to yesterday inclusive. If there
// isn’t a last date checked, checks yesterday.
var date;
if (last_check.length == 0) {
date = new Date(yesterday);
} else {
date = new Date(last_check);
date.setDate(date.getDate() + 1);
}

var rows = [];

while (date.getTime() <= yesterday.getTime()) {
var row = getReportRowForDate(date);
rows.push([new Date(date), row[‘Cost’], row[‘AverageCpc’], row[‘Ctr’],
row[‘AveragePosition’], row[‘Impressions’], row[‘Clicks’]]);
date.setDate(date.getDate() + 1);
}

if (rows.length > 0) {
var access = new SpreadsheetAccess(SPREADSHEET_URL, ‘Report’);
var emptyRow = access.findEmptyRow(6, 2);
if (emptyRow < 0) {
access.addRows(rows.length);
emptyRow = access.findEmptyRow(6, 2);
}
access.writeRows(rows, emptyRow, 2);

var last_check = spreadsheet.getRangeByName(‘last_check’).
setValue(yesterday);
var email = spreadsheet.getRangeByName(‘email’).getValue();

if (email) {
sendEmail(email);
}
}
}

function sendEmail(email) {
var day = getYesterday();
var yesterdayRow = getReportRowForDate(day);
day.setDate(day.getDate() – 1);
var twoDaysAgoRow = getReportRowForDate(day);
day.setDate(day.getDate() – 5);
var weekAgoRow = getReportRowForDate(day);

var html = [];
html.push(
‘<html>’,
‘<body>’,
‘<table width=800 cellpadding=0 border=0 cellspacing=0>’,
‘<tr>’,
‘<td colspan=2 align=right>’,
"<div style=’font: italic normal 10pt Times New Roman, serif; " +
"margin: 0; color: #666; padding-right: 5px;’>" +
‘Powered by AdWords Scripts</div>’,
‘</td>’,
‘</tr>’,
"<tr bgcolor=’#3c78d8′>",
‘<td width=500>’,
"<div style=’font: normal 18pt verdana, sans-serif; " +
"padding: 3px 10px; color: white’>Account Summary report</div>",
‘</td>’,
‘<td align=right>’,
"<div style=’font: normal 18pt verdana, sans-serif; " +
"padding: 3px 10px; color: white’>",
AdWordsApp.currentAccount().getCustomerId(), ‘</h1>’,
‘</td>’,
‘</tr>’,
‘</table>’,
‘<table width=800 cellpadding=0 border=0 cellspacing=0>’,
"<tr bgcolor=’#ddd’>",
‘<td></td>’,
"<td style=’font: 12pt verdana, sans-serif; " +
‘padding: 5px 0px 5px 5px; background-color: #ddd; ‘ +
"text-align: left’>Yesterday</td>",
"<td style=’font: 12pt verdana, sans-serif; " +
‘padding: 5px 0px 5px 5px; background-color: #ddd; ‘ +
"text-align: left’>Two Days Ago</td>",
"<td style=’font: 12pt verdana, sans-serif; " +
‘padding: 5px 0px 5x 5px; background-color: #ddd; ‘ +
"text-align: left’>A week ago</td>",
‘</tr>’,
emailRow(‘Cost’, ‘Cost’, yesterdayRow, twoDaysAgoRow, weekAgoRow),
emailRow(‘Average Cpc’, ‘AverageCpc’, yesterdayRow, twoDaysAgoRow,
weekAgoRow),
emailRow(‘Ctr’, ‘Ctr’, yesterdayRow, twoDaysAgoRow, weekAgoRow),
emailRow(‘Average Position’, ‘AveragePosition’, yesterdayRow,
twoDaysAgoRow, weekAgoRow),
emailRow(‘Impressions’, ‘Impressions’, yesterdayRow, twoDaysAgoRow,
weekAgoRow),
emailRow(‘Clicks’, ‘Clicks’, yesterdayRow, twoDaysAgoRow,
weekAgoRow),
‘</table>’,
‘</body>’,
‘</html>’);
MailApp.sendEmail(email, ‘AdWords Account ‘ +
AdWordsApp.currentAccount().getCustomerId() + ‘ Summary Report’, »,
{htmlBody: html.join(‘n’)});
}

function emailRow(title, column, yesterdayRow, twoDaysAgoRow, weekAgoRow) {
var html = [];
html.push(‘<tr>’,
"<td style=’padding: 5px 10px’>" + title + ‘</td>’,
"<td style=’padding: 0px 10px’>" + yesterdayRow[column] + ‘</td>’,
"<td style=’padding: 0px 10px’>" + twoDaysAgoRow[column] +
formatChangeString(yesterdayRow[column], twoDaysAgoRow[column]) +
‘</td>’,
"<td style=’padding: 0px 10px’>" + weekAgoRow[column] +
formatChangeString(yesterdayRow[column], weekAgoRow[column]) +
‘</td>’,
‘</tr>’);
return html.join(‘n’);
}

// returns noon in the timezone of the account
function getYesterday() {
var now = new Date(Utilities.formatDate(new Date(),
AdWordsApp.currentAccount().getTimeZone(), ‘MMM dd,yyyy HH:mm:ss’));
var yesterday = new Date(now.getTime() – 24 * 3600 * 1000);
yesterday.setHours(12);
return yesterday;
}

function getReportRowForDate(date) {
var accountDate = new Date(Utilities.formatDate(date,
AdWordsApp.currentAccount().getTimeZone(), ‘MMM dd,yyyy HH:mm:ss’));
var dateString = Utilities.formatDate(accountDate, ‘PST’, ‘yyyyMMdd’);
return getReportRowForDuring(dateString + ‘,’ + dateString);
}

function getReportRowForDuring(during) {
var report = AdWordsApp.report(
‘SELECT Cost, AverageCpc, Ctr, AveragePosition, Impressions, Clicks ‘ +
‘FROM ACCOUNT_PERFORMANCE_REPORT ‘ +
‘DURING ‘ + during);
return report.rows().next();
}

function formatChangeString(newValue, oldValue) {
var x = newValue.indexOf(‘%’);
if (x != -1) {
newValue = newValue.substring(0, x);
var y = oldValue.indexOf(‘%’);
oldValue = oldValue.substring(0, y);
}

var change = parseFloat(newValue – oldValue).toFixed(2);
var changeString = change;
if (x != -1) {
changeString = change + ‘%’;
}

if (change >= 0) {
return "<span style=’color: #38761d; font-size: 8pt’> (+" +
changeString + ‘)</span>’;
} else {
return "<span style=’color: #cc0000; font-size: 8pt’> (" +
changeString + ‘)</span>’;
}
}

function SpreadsheetAccess(spreadsheetUrl, sheetName) {
this.spreadsheet = SpreadsheetApp.openByUrl(spreadsheetUrl);
this.sheet = this.spreadsheet.getSheetByName(sheetName);

// what column should we be looking at to check whether the row is empty?
this.findEmptyRow = function(minRow, column) {
var values = this.sheet.getRange(minRow, column,
this.sheet.getMaxRows(), 1).getValues();
for (var i = 0; i < values.length; i++) {
if (!values[i][0]) {
return i + minRow;
}
}
return -1;
};
this.addRows = function(howMany) {
this.sheet.insertRowsAfter(this.sheet.getMaxRows(), howMany);
};
this.writeRows = function(rows, startRow, startColumn) {
this.sheet.getRange(startRow, startColumn, rows.length, rows[0].length).
setValues(rows);
};
}
[/code]

Luego lo podemos programar para que que se ejecute cada día.

Captura de pantalla 2015-03-03 a la(s) 13.18.34

Y ya tenemos un sencillo script que nos ofrece una visión general de una cuenta de Adwords:

account-summary

Información básica sobre protección de datos: Responsable: Wemcor Servicios Web, SL. Finalidad: desarrollar la actividad comercial y enviar comunicaciones comerciales a los usuarios que lo autoricen. Legitimación: Consentimiento del interesado. Destinatarios: Wemcor y proveedores legitimados externos. Derechos: Acceder, rectificar y suprimir los datos, así como otros derechos como se explica en la información adicional. También se puede instar reclamación ante la Agencia Española de Protección de Datos.

Deja un comentario

Artículo añadido al carrito.
0 artículos - 0,00