Report Trending Search Terms
Thu Aug 27 2020 18:21:39 GMT+0000 (Coordinated Universal Time)
Saved by @moakdesigns #javascript
/**
*
* Report Trending Search Terms
*
* Creates a Google Sheets report containing two sheets:
*
* 1. Sheet with trending search terms for Last Week versus Week Before last Week
* 2. Sheet with trending search terms for Last Week versus Same Week Last Year
*
* @author: Nils Rooijmans
*
* contact nils@nilsrooijmans.com for questions and a High Performance MCC version of the script
*/
/*** ADD YOUR CONFIGURATION HERE ***/
var SPREADSHEET_URL = ""; //insert a new blank spreadsheet url between quotes
var EMAIL_ADDRESSES = ""; //insert your email between quotes
var EMAIL_SUBJECT = "Search Terms Trends for Account - XYZ"; // replace XYZ with the account/client name
/*** NO NEED TO CHANGE ANYTHING BELOW THIS LINE ***/
var IMPRESSIONS_MIN = 10; //igore search terms with less impresssions last week
var IMPRESSIONS_MIN_ABS_DIFFERENCE = 50; // ignore search terms with absolute difference that is smaller then the value you set here
var IMPRESSIONS_MIN_REL_DIFFERENCE = 0.2; // ignore search terms with relative difference that is smaller then the value you set here
var DEBUG = true;
var SEND_EMAIL = true; // set to false if you do not want to send alert email
var EMAIL_BODY = "";
/*** DO NOT CHANGE ANYTHING BELOW THIS LINE ***/
function main() {
var searchtermsLastWeek = {};
var searchtermsWeekBeforeLastWeek = {};
var searchtermsLastWeekLastYear = {};
var trendingSearchterms_LastWeek_vs_WeekBefore = {};
var trendingSearchterms_LastWeek_vs_LastYear = {};
searchtermsLastWeek = getSearchterms("lastWeek");
searchtermsWeekBeforeLastWeek = getSearchterms("weekBeforeLastWeek");
searchtermsLastWeekLastYear = getSearchterms("lastWeekLastYear");
debug("Nr of searchterms last week: "+Object.keys(searchtermsLastWeek).length);
debug("Nr of searchterms week before last week: "+Object.keys(searchtermsWeekBeforeLastWeek).length);
debug("Nr of searchterms week last week last year: "+Object.keys(searchtermsLastWeekLastYear).length);
trendingSearchterms_LastWeek_vs_WeekBefore = getTrendingSearchterms(searchtermsLastWeek, searchtermsWeekBeforeLastWeek);
trendingSearchterms_LastWeek_vs_LastYear = getTrendingSearchterms(searchtermsLastWeek, searchtermsLastWeekLastYear);
debug("Nr of trending searchterms LastWeek_vs_WeekBefore: "+Object.keys(trendingSearchterms_LastWeek_vs_WeekBefore).length);
debug("Nr of trending searchterms LastWeek_vs_LastYear: "+Object.keys(trendingSearchterms_LastWeek_vs_LastYear).length);
generateReport(trendingSearchterms_LastWeek_vs_WeekBefore, trendingSearchterms_LastWeek_vs_LastYear);
// send email
if (SEND_EMAIL) {
var emailBody =
"\nNumber of trending search terms: " + ( Object.keys(trendingSearchterms_LastWeek_vs_WeekBefore).length + Object.keys(trendingSearchterms_LastWeek_vs_LastYear).length ) + "\n" +
"See details: "+ SPREADSHEET_URL+ "\n---\n\n" + EMAIL_BODY + "\n"+
"For more FREE Google Ads Scripts to improve your results and make your working day feel like a breeze, visit https://nilsrooijmans.com \n" +
"---\n" +
"This email is generated by a copy of the free Google Ads Script - Trending Search Terms, (C) Nils Rooijmans \n" +
"---\n";
MailApp.sendEmail(EMAIL_ADDRESSES, EMAIL_SUBJECT, emailBody);
debug("Report email sent");
}
}
function generateReport(trendingSearchterms_LastWeek_vs_WeekBefore, trendingSearchterms_LastWeek_vs_LastYear) {
var rowsThisYear = getReportRows(trendingSearchterms_LastWeek_vs_WeekBefore);
var rowsLastYear = getReportRows(trendingSearchterms_LastWeek_vs_LastYear);
var spreadsheet = SpreadsheetApp.openByUrl(SPREADSHEET_URL) ;
if (!spreadsheet) {
Logger.log("Cannot open new reporting spreadsheet") ;
return ;
}
// First, generate the sheet for this year's data
var sheet=spreadsheet.getSheetByName('LastWeek_vs_WeekBefore');
if (!sheet) {
Logger.log("Cannot open exisiting reporting sheet 'LastWeek_vs_WeekBefore', creating new one") ;
spreadsheet.insertSheet('LastWeek_vs_WeekBefore');
var sheet=spreadsheet.getSheetByName('LastWeek_vs_WeekBefore');
}
generateReportSheet(sheet, rowsThisYear);
debug("-> Generated report sheet: "+sheet.getName());
// Second, generate the sheet for this year's data
var sheet=spreadsheet.getSheetByName('LastWeek_vs_LastYear');
if (!sheet) {
Logger.log("Cannot open exisiting reporting sheet 'LastWeek_vs_LastYear' , creating new one") ;
spreadsheet.insertSheet('LastWeek_vs_LastYear');
var sheet=spreadsheet.getSheetByName('LastWeek_vs_LastYear');
}
generateReportSheet(sheet, rowsLastYear);
debug("-> Generated report sheet: "+sheet.getName());
}
function generateReportSheet(sheet, rows) {
debug("--> Generating report sheet: "+sheet.getName());
if (sheet.getName()=='LastWeek_vs_WeekBefore') {
var header = [
"Searchterm",
"Impressions Last Week",
"Impressions week Before Last Week",
"Diff",
"Relative Diff (%)"
];
} else if (sheet.getName()=='LastWeek_vs_LastYear') {
var header = [
"Searchterm",
"Impressions Last Week",
"Impressions Last Week Last Year",
"Diff",
"Relative Diff (%)"
];
} else {
Logger.log("### ERROR: name of sheet not recognized");
}
sheet.clear();
sheet.clearConditionalFormatRules();
sheet.appendRow(header);
var range = sheet.getRange(1,1,1,header.length);
range.setFontWeight("bold");
var rules = sheet.getConditionalFormatRules();
if ( !(rows.length < 1) ) { range = sheet.getRange(2,1,rows.length,5); var diffRange = [sheet.getRange("E2:E"+ (2+rows.length))]; var rule = SpreadsheetApp.newConditionalFormatRule().whenNumberGreaterThan(100).setFontColor("#32CD32").setRanges(diffRange).build(); rules.push(rule); var rule = SpreadsheetApp.newConditionalFormatRule().whenNumberLessThan(-50).setFontColor("#FF8C00").setRanges(diffRange).build(); rules.push(rule); sheet.setConditionalFormatRules(rules); range.setValues(rows); range.sort([{column: 4, ascending: false}]); } else { debug("ZERO trending search terms"); } } function getReportRows(trendingSearchTermObject) { var rows = []; for (var searchterm in trendingSearchTermObject) { var impressions_period1 = trendingSearchTermObject[searchterm].impressions_1; var impressions_period2 = trendingSearchTermObject[searchterm].impressions_2; var absoluteDiff = impressions_period1-impressions_period2; var relativeDiff = (((impressions_period1-impressions_period2)/impressions_period2)*100).toFixed(0); rows.push([searchterm, impressions_period1, impressions_period2, absoluteDiff, relativeDiff]); } return rows; } function getTrendingSearchterms(searchtermsPeriod_1,searchtermsPeriod_2) { var trendingSearchTerms = {}; for (var searchterm in searchtermsPeriod_1) { if (searchtermsPeriod_1.hasOwnProperty(searchterm)) { var impressions1 = searchtermsPeriod_1[searchterm]; if (searchtermsPeriod_2.hasOwnProperty(searchterm)) { var impressions2 = searchtermsPeriod_2[searchterm]; } else { var impressions2 = 0; } if (Math.abs(impressions1-impressions2) > IMPRESSIONS_MIN_ABS_DIFFERENCE &&
Math.abs((impressions1-impressions2)/impressions2) > IMPRESSIONS_MIN_REL_DIFFERENCE ) {
var searchTermObject = {};
searchTermObject.impressions_1 = impressions1;
searchTermObject.impressions_2 = impressions2;
trendingSearchTerms[searchterm] = searchTermObject;
}
}
}
// now add searchterms that were not present in data from period_1
for (var searchterm in searchtermsPeriod_2) {
if (searchtermsPeriod_2.hasOwnProperty(searchterm)) {
var impressions2 = searchtermsPeriod_2[searchterm];
if (!searchtermsPeriod_1.hasOwnProperty(searchterm)) { // searchterm not present in data from period_1
var impressions1 = 0;
if (Math.abs(impressions1-impressions2) > IMPRESSIONS_MIN_ABS_DIFFERENCE &&
Math.abs((impressions1-impressions2)/impressions2) > IMPRESSIONS_MIN_REL_DIFFERENCE ) {
var searchTermObject = {};
searchTermObject.impressions_1 = impressions1;
searchTermObject.impressions_2 = impressions2;
trendingSearchTerms[searchterm] = searchTermObject;
}
}
}
}
return trendingSearchTerms;
}
function getSearchterms(period) {
var searchtermObject = {};
var periodString;
switch(period) {
case "today" :
periodString = "TODAY";
break;
case "yesterday" :
periodString = "YESTERDAY";
break;
case "dayBeforeYesterday" :
periodString = dates(2) + "," + dates(2);
break;
case "lastWeek" :
periodString = dates(7) + "," + dates(1);
break;
case "weekBeforeLastWeek" :
periodString = dates(14) + "," + dates(8);
break;
case "lastWeekLastYear" :
periodString = dates(372) + "," + dates(366);
break;
default :
Logger.log("### ERROR: Could not recognize the period for which to add search terms");
}
var awqlQuery="SELECT Query, Impressions FROM SEARCH_QUERY_PERFORMANCE_REPORT WHERE Impressions > "+IMPRESSIONS_MIN+" DURING "+periodString;
debug("awqlQuery: "+awqlQuery);
var rows=AdWordsApp.report(awqlQuery).rows();
while (rows.hasNext()) {
var row = rows.next();
var searchterm = row['Query'];
var impressions = numericalize(row['Impressions']);
if (searchtermObject.hasOwnProperty(searchterm)) {
searchtermObject[searchterm] += impressions;
} else {
searchtermObject[searchterm] = impressions;
}
}
return searchtermObject;
}
function numericalize(string){
return parseFloat(string.toString().replace(/\,/g, ''));
}
function debug(string) {
if (DEBUG == true) {
Logger.log(string);
}
}
// return date x days before today
function dates(x){
var MILLIS_PER_DAY = 1000 * 60 * 60 * 24;
var now = new Date();
var date = new Date(now.getTime() - x * MILLIS_PER_DAY);
var timeZone = AdWordsApp.currentAccount().getTimeZone();
var output = Utilities.formatDate(date, timeZone, 'yyyyMMdd')
return output;
}



Comments