Skip navigation

Don't overspend on google ads

The google script, which can be set up daily, weekly, monthly to stop and start campaign when they pass threshold.


/** Copyright (c) by Iviju.com

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. **/
DEBUG = 1;


function main() {
Logger.log("");
currentSetting = new Object();
currentSetting.scope = "Campaign"; // Account, Campaign, ad group, keyword
currentSetting.maxCost = getFloat("5.51"); // Budget amount campaign to be paused
currentSetting.budgetPeriod = "Daily"; // Budget Period values: "Daily", "Weekly Sun-Sat", "Weekly Mon-Sun", "Monthly"
currentSetting.labelName = "Iviju"; // Campaign Label from dashboard
currentSetting.labelToAdd = "stopped by budget script";
currentSetting.email = "your-email@email-address.com"; // Email address to send notification
currentSetting.pauseItems = "yes";
currentSetting.reEnableItems = "yes";

currentSetting.logText = "";

currentSetting.currencyCode = AdWordsApp.currentAccount().getCurrencyCode();

switch (currentSetting.reEnableItems.toLowerCase()) {
case "no":
currentSetting.reEnableAtStartOfNewPeriod = 0;
break;
case "yes":
currentSetting.reEnableAtStartOfNewPeriod = 1;
break;
}

switch (currentSetting.pauseItems.toLowerCase()) {
case "no":
currentSetting.pauseWhenExceeds = 0;
break;
case "yes":
currentSetting.pauseWhenExceeds = 1;
break;
}

switch (currentSetting.budgetPeriod) {
case "Daily":
//Logger.log("daily");
currentSetting.dateRange = "TODAY";
break;
case "Weekly Sun-Sat":
//Logger.log("weekly sun");
currentSetting.dateRange = "THIS_WEEK_SUN_TODAY";
break;
case "Weekly Mon-Sun":
//Logger.log("weekly mon");
currentSetting.dateRange = "THIS_WEEK_MON_TODAY";
break;
case "Monthly":
//Logger.log("monthly");
currentSetting.dateRange = "THIS_MONTH";
break;
}



var thenAction = "Pause"; // Alert
var condition1 = "Cost > " + currentSetting.maxCost;
var labelCondition = "Status = ENABLED";
if (currentSetting.labelName) {
labelCondition = "LabelNames CONTAINS_ANY ['" + currentSetting.labelName + "']";
}
if (DEBUG == 1) Logger.log("labelCondition: " + labelCondition);

currentSetting.enabledCounter = 0;
currentSetting.deletedCounter = 0;
currentSetting.pausedCounter = 0;
currentSetting.enabledList = new Array();
currentSetting.pausedList = new Array();
currentSetting.deletedList = new Array();


// Set up labels
var labelToAddText = currentSetting.labelToAdd + " (" + currentSetting.budgetPeriod + ")";
Logger.log("labelToAddText: " + labelToAddText);
currentSetting.labelToAdd = labelToAddText;
if (currentSetting.labelToAdd) {
createLabel(currentSetting.labelToAdd, "This label is used by an account automation. Its name should not be changed.");
}


if (currentSetting.reEnableAtStartOfNewPeriod) {
// Check current date, day and time
currentSetting.thisAccountTime = getTimeInThisAccount();
var currentHour = currentSetting.thisAccountTime.HH;
//Logger.log("currentHour: " + currentHour);
var dayOfWeek = currentSetting.thisAccountTime.dayOfWeek;
//Logger.log("dayOfWeek: " + dayOfWeek);
var dd = currentSetting.thisAccountTime.dd;
//Logger.log("dd: " + dd);

//Re-activate paused items when start of a new period
var pluralText = "";
if (currentSetting.budgetPeriod.toLowerCase().indexOf("daily") != -1) {
if (currentHour == 0) {
reEnable();
var emailType = "Notification";
var body = 'Resetting daily budgets';
if (currentSetting.enabledList.length > 0) {
body += "
";
body += "Re-Enabled Because We Started a New Daily Budget Period:
    ";

    for (var itemCounter = 0; itemCounter < currentSetting.enabledList.length; itemCounter++) {
    var item = currentSetting.enabledList[itemCounter];
    body += "
  • " + item + "
  • ";
    }
    body += "
";
}
sendEmailNotifications(currentSetting.email, "Daily Budgets Reset", body, emailType);
if (currentSetting.enabledList.length > 1) pluralText = "s";
currentSetting.logText += currentSetting.enabledList.length + " " + currentSetting.scope + pluralText + " enabled. ";
}
} else if (currentSetting.budgetPeriod.toLowerCase().indexOf("weekly sun-mon") != -1) {
if (dayOfWeek == 7 && currentHour == 0) {
reEnable();
var emailType = "Notification";
var body = 'Resetting weekly budgets
';
if (currentSetting.enabledList.length > 0) {
body += "
";
body += "Re-Enabled Because We Started a New Weekly Budget Period:
    ";

    for (var itemCounter = 0; itemCounter < currentSetting.enabledList.length; itemCounter++) {
    var item = currentSetting.enabledList[itemCounter];
    body += "
  • " + item + "
  • ";;
    }
    body += "
";
}
sendEmailNotifications(currentSetting.email, "Weekly Budgets Reset", body, emailType);
if (currentSetting.enabledList.length > 1) pluralText = "s";
currentSetting.logText += currentSetting.enabledList.length + " " + currentSetting.scope + pluralText + " enabled. ";
}
} else if (currentSetting.budgetPeriod.toLowerCase().indexOf("weekly mon-sun") != -1) {
if (dayOfWeek == 1 && currentHour == 0) {
reEnable();
var emailType = "Notification";
var body = 'Resetting weekly budgets
';
if (currentSetting.enabledList.length > 0) {
body += "
";
body += "Re-Enabled Because We Started a New Weekly Budget Period:
    ";

    for (var itemCounter = 0; itemCounter < currentSetting.enabledList.length; itemCounter++) {
    var item = currentSetting.enabledList[itemCounter];
    body += "
  • " + item + "
  • ";;
    }
    body += "
";
}
sendEmailNotifications(currentSetting.email, "Weekly Budgets Reset", body, emailType);
if (currentSetting.enabledList.length > 1) pluralText = "s";
currentSetting.logText += currentSetting.enabledList.length + " " + currentSetting.scope + pluralText + " enabled. ";
}
} else if (currentSetting.budgetPeriod.toLowerCase().indexOf("monthly") != -1) {
if (dd == 1 && currentHour == 0) {
reEnable();
var emailType = "Notification";
var body = 'Resetting monthly budgets on the ' + dd + 'st of the month at ' + currentHour + "h
";
if (currentSetting.enabledList.length > 0) {
body += "
";
body += "Re-Enabled Because We Started a New Monthly Budget Period:
    ";

    for (var itemCounter = 0; itemCounter < currentSetting.enabledList.length; itemCounter++) {
    var item = currentSetting.enabledList[itemCounter];
    body += "
  • " + item + "
  • ";;
    }
    body += "
";
}
sendEmailNotifications(currentSetting.email, "Monthly Budgets Reset", body, emailType);
if (currentSetting.enabledList.length > 1) pluralText = "s";
currentSetting.logText += currentSetting.enabledList.length + " " + currentSetting.scope + pluralText + " enabled. ";
}
}
}

// ------------------------------
// CHECK IF BUDGETS HAVE EXCEEDED
// ------------------------------

// Account
if (currentSetting.scope.toLowerCase().indexOf("account") != -1) {
var fields = "Cost";
var reportIterator = AdWordsApp.report('SELECT ' + fields +
' FROM ACCOUNT_PERFORMANCE_REPORT DURING ' + currentSetting.dateRange).rows();

while (reportIterator.hasNext()) {
var row = reportIterator.next();
var cost = getFloat(row["Cost"]).toFixed(2);
if (DEBUG == 1) Logger.log("Cost: " + cost + " currentSetting.maxCost: " + currentSetting.maxCost);
}
if (cost > currentSetting.maxCost) {
// check if all campaigns are paused
var campaignIterator = AdWordsApp.campaigns()
.withCondition("Status = ENABLED")
.get();

var numActiveCampaigns = campaignIterator.totalNumEntities();

if (numActiveCampaigns > 0) {
var body = "The total cost for the account '" + AdWordsApp.currentAccount().getName() + "' (" + AdWordsApp.currentAccount().getCustomerId() + ") was " + currentSetting.currencyCode + " " + cost +
" as of the time of this email. The maximum allowed cost is " + currentSetting.currencyCode + " " + currentSetting.maxCost.toFixed(2) + " " + currentSetting.budgetPeriod + "." +
"

The account will continue to accrue more cost unless you take action like pausing all campaigns.";
var emailType = "warning";
sendEmailNotifications(currentSetting.email, "Account Budget Exceeded", body, emailType);
//Logger.log("email sent");
currentSetting.logText = "Account cost of " + currentSetting.currencyCode + " " + cost + " exceeds the maximum " + currentSetting.budgetPeriod + " cost of " + currentSetting.currencyCode + " " + currentSetting.maxCost.toFixed(2);

if (currentSetting.pauseWhenExceeds) {
while (campaignIterator.hasNext()) {
var campaign = campaignIterator.next();
var name = campaign.getName();
campaign.pause();
campaign.applyLabel(currentSetting.labelToAdd);
currentSetting.pausedCounter++;
currentSetting.pausedList.push(name);
}
}
}
} else {
Logger.log("Account cost is currently " + currentSetting.currencyCode + cost + " and this does not exceed the allowed budget for the account.");
}
}

// Campaigns
else if (currentSetting.scope.toLowerCase().indexOf("campaign") != -1) {

if (currentSetting.labelName != "") {
var isLabelUsed = checkIfLabelIsUsed(currentSetting.scope, currentSetting.labelName);
}


if (DEBUG == 1) Logger.log(condition1);
if (DEBUG == 1) Logger.log(labelCondition);
if (DEBUG == 1) Logger.log(currentSetting.dateRange);

// SEARCH AND DISPLAY CAMPAIGNS
var iterator = AdWordsApp.campaigns()
.withCondition(condition1)
.withCondition("Status = ENABLED")
.withCondition(labelCondition)
.forDateRange(currentSetting.dateRange)
.get();

while (iterator.hasNext()) {
var item = iterator.next();
var name = item.getName();
var cost = item.getStatsFor(currentSetting.dateRange).getCost();
item.applyLabel(currentSetting.labelToAdd);
Logger.log("Match found: '" + name + "' cost: " + currentSetting.currencyCode + " " + cost);
if (currentSetting.pauseWhenExceeds) item.pause();
currentSetting.pausedCounter++;
currentSetting.pausedList.push(name + " cost: " + currentSetting.currencyCode + " " + cost);
}



if (currentSetting.pausedCounter == 0) {
Logger.log("No campaigns exceeded their allowed budgets for the budget period.");
} else {
//Logger.log("something else");
}


} else


// Ad Groups
if (currentSetting.scope.toLowerCase().indexOf("ad group") != -1) {

if (currentSetting.labelName != "") {
var isLabelUsed = checkIfLabelIsUsed(currentSetting.scope, currentSetting.labelName);
}

// SEARCH AND DISPLAY CAMPAIGNS
var iterator = AdWordsApp.adGroups()
.withCondition(condition1)
.withCondition("Status = ENABLED")
.withCondition(labelCondition)
.forDateRange(currentSetting.dateRange)
.get();

while (iterator.hasNext()) {
var item = iterator.next();
var name = item.getName();
var cost = item.getStatsFor(currentSetting.dateRange).getCost();
var campaignName = item.getCampaign().getName();
Logger.log("Match found: " + "campaign: '" + campaignName + "' ad group: '" + name + "' cost: " + currentSetting.currencyCode + " " + cost);
item.applyLabel(currentSetting.labelToAdd);
if (currentSetting.pauseWhenExceeds) item.pause();
currentSetting.pausedCounter++;
currentSetting.pausedList.push("campaign: '" + campaignName + "' ad group: '" + name + "'" + " cost: " + currentSetting.currencyCode + " " + cost);
}



if (currentSetting.pausedCounter == 0) {
Logger.log("No ad groups exceeded their allowed budgets for the budget period.");
}


// Ads
} else if (currentSetting.scope.toLowerCase().indexOf("ad text") != -1) {

if (currentSetting.labelName != "") {
var isLabelUsed = checkIfLabelIsUsed(currentSetting.scope, currentSetting.labelName);
}

var adIterator = AdWordsApp.ads()
.withCondition(condition1)
.withCondition("Status = ENABLED")
.withCondition(labelCondition)
.forDateRange(currentSetting.dateRange)
.get();


while (adIterator.hasNext()) {

var ad = adIterator.next();
var adHeadline = ad.getHeadline();
var description1 = ad.getDescription1();
var description2 = ad.getDescription2();
var displayUrl = ad.getDisplayUrl();
var cost = ad.getStatsFor(currentSetting.dateRange).getCost();
ad.applyLabel(currentSetting.labelToAdd);

Logger.log("Match found: " + adHeadline + " " + description1 + " " + description2 + " " + displayUrl + " -- cost: " + currentSetting.currencyCode + " " + cost);
var fullAdText = adHeadline + " " + description1 + " " + description2 + " " + displayUrl;
if (currentSetting.pauseWhenExceeds) ad.pause();
currentSetting.pausedCounter++;
currentSetting.pausedList.push(fullAdText + " -- cost: " + currentSetting.currencyCode + " " + cost);
} // while(adIterator.hasNext())

if (currentSetting.pausedCounter == 0) {
Logger.log("No ads exceeded their allowed budgets for the budget period.");
}


// Keywords
} else if (currentSetting.scope.toLowerCase().indexOf("keyword") != -1) {

if (currentSetting.labelName != "") {
var isLabelUsed = checkIfLabelIsUsed(currentSetting.scope, currentSetting.labelName);
}

var iterator = AdWordsApp.keywords()
.withCondition(condition1)
.withCondition("Status = ENABLED")
.withCondition(labelCondition)
.forDateRange(currentSetting.dateRange)
.get();

while (iterator.hasNext()) {
var item = iterator.next();
var name = item.getText();
var cost = item.getStatsFor(currentSetting.dateRange).getCost();
var campaignName = item.getCampaign().getName();
var adGroupName = item.getAdGroup().getName();
Logger.log("Match found: " + "campaign: '" + campaignName + "' ad group: '" + adGroupName + "' kw: '" + name + "' cost: " + currentSetting.currencyCode + " " + cost);
item.applyLabel(currentSetting.labelToAdd);
if (currentSetting.pauseWhenExceeds) item.pause();
currentSetting.pausedList.push("campaign: '" + campaignName + "' ad group: '" + adGroupName + "' kw: '" + name + "'" + " cost: " + currentSetting.currencyCode + " " + cost);
currentSetting.pausedCounter++;
} // while iterator hasnext

if (currentSetting.pausedCounter == 0) {
Logger.log("No keywords exceeded their allowed budgets for the budget period.");
}


} // if scope == keyword


currentSetting.pausedList.sort();
if (currentSetting.pausedCounter > 1) {
var pluralText = "s";
} else {
var pluralText = "";
}
var body = currentSetting.pausedCounter + " " + currentSetting.scope + pluralText + " exceeded the " + currentSetting.budgetPeriod + " maximum cost of " + currentSetting.currencyCode + " " + currentSetting.maxCost.toFixed(2) + ". ";
if (currentSetting.pauseWhenExceeds) body += "They were paused by the script.";
body += "
    ";

    if (DEBUG == 1) Logger.log("currentSetting.email: " + currentSetting.email + " currentSetting.pausedCounter: " + currentSetting.pausedCounter);
    if (currentSetting.email && currentSetting.pausedCounter > 0) {

    var changesMadeOrSuggestedText = "suggested";
    if (currentSetting.pauseWhenExceeds) changesMadeOrSuggestedText = "made";

    var pausedOrSuggestedText = "exceeded budget";
    if (currentSetting.pauseWhenExceeds) pausedOrSuggestedText = "paused";

    var subject = "Automated Rules for " + AdWordsApp.currentAccount().getName() + ": " + currentSetting.pausedCounter + " change" + pluralText + " " + changesMadeOrSuggestedText;
    currentSetting.logText += currentSetting.pausedCounter + " " + currentSetting.scope + pluralText + " " + pausedOrSuggestedText;
    for (var itemCounter = 0; itemCounter < currentSetting.pausedList.length; itemCounter++) {
    var item = currentSetting.pausedList[itemCounter];
    body += "
  • " + item + "
  • ";
    }
    body += "

";
body += "These items were labeled '" + currentSetting.labelToAdd + "' for easy identification.

";
body += "Thanks for using a free Iviju.com script. Try our Enhanced Scripts for AdWords which have several benefits:
  • automatically updated when AdWords changes
";
body += "Get a 2 week free trial at iviju.com";


var emailType = "notification";
if (DEBUG == 1) Logger.log("sending email...");
sendEmailNotifications(currentSetting.email, subject, body, emailType)
}
}




function reEnable() {
// Campaigns or Account
if (currentSetting.scope.toLowerCase().indexOf("campaign") != -1 || currentSetting.scope.toLowerCase().indexOf("account") != -1) {
var iterator = AdWordsApp.campaigns()
.withCondition("LabelNames CONTAINS_ANY ['" + currentSetting.labelToAdd + "']")
.get();

while (iterator.hasNext()) {
var item = iterator.next();
var name = item.getName();
item.removeLabel(currentSetting.labelToAdd)
Logger.log("Enabling campaign: " + name);
item.enable();
currentSetting.enabledCounter++;
currentSetting.enabledList.push(name);
}

// SHOPPING CAMPAIGNS
var iterator = AdWordsApp.shoppingCampaigns()
.withCondition("LabelNames CONTAINS_ANY ['" + currentSetting.labelToAdd + "']")
.get();

while (iterator.hasNext()) {
var item = iterator.next();
var name = item.getName();
item.removeLabel(currentSetting.labelToAdd)
Logger.log("Enabling campaign: " + name);
item.enable();
currentSetting.enabledCounter++;
currentSetting.enabledList.push(name);
}

} else


// Ad Groups
if (currentSetting.scope.toLowerCase().indexOf("ad group") != -1) {

var iterator = AdWordsApp.adGroups()
.withCondition("LabelNames CONTAINS_ANY ['" + currentSetting.labelToAdd + "']")
.get();

while (iterator.hasNext()) {
var item = iterator.next();
var name = item.getName();
var campaignName = item.getCampaign().getName();
Logger.log("Enabling campaign: '" + campaignName + "' ad group: '" + name + "'");
item.removeLabel(currentSetting.labelToAdd);

item.enable();
currentSetting.enabledCounter++;
currentSetting.enabledList.push("campaign: '" + campaignName + "' ad group: '" + name + "'");
}

// SHOPPING AD GROUPS
var iterator = AdWordsApp.shoppingAdGroups()
.withCondition("LabelNames CONTAINS_ANY ['" + currentSetting.labelToAdd + "']")
.get();

while (iterator.hasNext()) {
var item = iterator.next();
var name = item.getName();
var campaignName = item.getCampaign().getName();
Logger.log("Enabling campaign: '" + campaignName + "' ad group: '" + name + "'");
item.removeLabel(currentSetting.labelToAdd);

item.enable();
currentSetting.enabledCounter++;
currentSetting.enabledList.push("campaign: '" + campaignName + "' ad group: '" + name + "'");
}




// Ads
} else if (currentSetting.scope.toLowerCase().indexOf("ad text") != -1) {

var adIterator = AdWordsApp.ads()
.withCondition("LabelNames CONTAINS_ANY ['" + currentSetting.labelToAdd + "']")
.get();


while (adIterator.hasNext()) {

var ad = adIterator.next();
var adHeadline = ad.getHeadline();
var description1 = ad.getDescription1();
var description2 = ad.getDescription2();
var displayUrl = ad.getDisplayUrl();
ad.removeLabel(currentSetting.labelToAdd);

Logger.log("Enabling ad: " + adHeadline + " " + description1 + " " + description2 + " " + displayUrl);
var fullAdText = adHeadline + " " + description1 + " " + description2 + " " + displayUrl;


ad.enable();
currentSetting.enabledCounter++;
currentSetting.enabledList.push(fullAdText);

} // while(adIterator.hasNext())



// Keywords
} else if (currentSetting.scope.toLowerCase().indexOf("keyword") != -1) {

var iterator = AdWordsApp.keywords()
.withCondition("LabelNames CONTAINS_ANY ['" + currentSetting.labelToAdd + "']")
.get();


while (iterator.hasNext()) {
var item = iterator.next();
var name = item.getText();
var campaignName = item.getCampaign().getName();
var adGroupName = item.getAdGroup().getName();
Logger.log("Enabling campaign: '" + campaignName + "' ad group: '" + adGroupName + "' kw: '" + name + "'");
item.removeLabel(currentSetting.labelToAdd);


item.enable();
currentSetting.enabledCounter++;
currentSetting.enabledList.push("campaign: '" + campaignName + "' ad group: '" + adGroupName + "' kw: '" + name + "'");

} // while iterator hasnext
} // if scope == keyword
}

/* getTimeInThisAccount
// ----------------------
// Deals with getting the current time and date in this account
// using the timezone settings of the account.

// returns all values in currentSetting.thisAccountTime object
*/
function getTimeInThisAccount() {
var weekday = new Array(7);
weekday[0] = "Sunday";
weekday[1] = "Monday";
weekday[2] = "Tuesday";
weekday[3] = "Wednesday";
weekday[4] = "Thursday";
weekday[5] = "Friday";
weekday[6] = "Saturday";

var timeZone = AdWordsApp.currentAccount().getTimeZone();
//Logger.log("time zone: " + timeZone);
var date = new Date();

var thisAccountTime = new Object();
thisAccountTime.dayOfWeek = parseInt(Utilities.formatDate(date, timeZone, "uu"));
thisAccountTime.dd = parseInt(Utilities.formatDate(date, timeZone, "dd"));
thisAccountTime.weekday = weekday[thisAccountTime.dayOfWeek];
thisAccountTime.HH = parseInt(Utilities.formatDate(date, timeZone, "HH"));
thisAccountTime.timeZone = timeZone;


return (thisAccountTime);
}

/* createLabel(name, description, backgroundColor)
// ------------
// Makes sure the label doesn't already exists before creating it
//
*/
function createLabel(name, description, backgroundColor) {

var labelIterator = AdWordsApp.labels()
.withCondition("Name CONTAINS '" + name + "'")
.get();

if (labelIterator.hasNext()) {
Logger.log("Label already exists");
} else {
Logger.log("Label needs to be created: " + name + " desc: " + description + " color: " + backgroundColor);
if (description && backgroundColor) {
AdWordsApp.createLabel(name, description, backgroundColor);
Logger.log("Label created");
} else if (description) {
AdWordsApp.createLabel(name, description);
Logger.log("Label created");
} else {
AdWordsApp.createLabel(name);
Logger.log("Label created");
}
}
}
/* checkIfLabelIsUsed(scope, labelName)
// --------------------------------------
// Check is a label that will be used to search for entities is actually used by at
// least 1 of those entities.
//
// This prevents weird cases where the script fails without error due to a missing label
//
*/
function checkIfLabelIsUsed(scope, labelName) {
var entitiesWithLabel = 0;
var labelIterator = AdWordsApp.labels()
.withCondition('Name = "' + labelName + '"')
.get();
if (labelIterator.hasNext()) {
var label = labelIterator.next();
if (scope.toLowerCase().indexOf("campaign") != -1) entitiesWithLabel = label.campaigns().get().totalNumEntities();
if (scope.toLowerCase().indexOf("ad group") != -1) entitiesWithLabel = label.adGroups().get().totalNumEntities();
if (scope.toLowerCase().indexOf("ad text") != -1) entitiesWithLabel = label.ads().get().totalNumEntities();
if (scope.toLowerCase().indexOf("keyword") != -1) entitiesWithLabel = label.keywords().get().totalNumEntities();
return (entitiesWithLabel);
}

if (!entitiesWithLabel) {
Logger.log("No campaigns use the label '" + currentSetting.labelName + "' so this script won't do anything.");
}
}

/*
// emailType can be: notification or warning
*/
function sendEmailNotifications(emailAddresses, subject, body, emailType) {

if (emailType.toLowerCase().indexOf("warning") != -1) {
var finalSubject = "[Warning] " + subject + " - " + AdWordsApp.currentAccount().getName() + " (" + AdWordsApp.currentAccount().getCustomerId() + ")"
} else if (emailType.toLowerCase().indexOf("notification") != -1) {
var finalSubject = "[Notification] " + subject + " - " + AdWordsApp.currentAccount().getName() + " (" + AdWordsApp.currentAccount().getCustomerId() + ")"
}

if (AdWordsApp.getExecutionInfo().isPreview()) {
var finalBody = "This script ran in preview mode. No changes were made to your account.
" + body;
} else {
var finalBody = body;
}

MailApp.sendEmail({
to: emailAddresses,
subject: finalSubject,
htmlBody: finalBody
});
if (DEBUG == 1) Logger.log("email sent to " + emailAddresses + ": " + finalSubject);
}

function getFloat(input) {
if (!input || input == "" || typeof(input) === 'undefined') var input = "0.0";
input = input.toString();
var output = parseFloat(input.replace(/,/g, ""));
return output;
}

Get in touch

Call Iviju.com Phone

818-303-6921

Email Iviju.com Email

foo@iviju.com

Contact Form

What services are you looking for?

Up to $50K

We will respond to you within 24 hours.

We'll sign an NDA if requested.

No account managers you'll be talking to tech experts and product people who are going to work with you later on.