function main() {
// Get the current date in the required format (yyyyMMdd)
var date = new Date();
var startDate = Utilities.formatDate(date, AdsApp.currentAccount().getTimeZone(), "yyyyMMdd");
// Email to send alert
var emailAddress = '
your-...@example.com'; // Update with your email address
// Get all enabled campaigns (Search, Display, Performance Max, Shopping, and Video)
var campaignIterator = AdsApp.campaigns()
.withCondition("Status = 'ENABLED'")
.get();
// Array to store alerts
var alerts = [];
// Loop through the campaigns
while (campaignIterator.hasNext()) {
var campaign = campaignIterator.next();
// Check the type of campaign and call the respective check function
if (campaign.getType() === "PERFORMANCE_MAX") {
checkPMaxCampaign(campaign, startDate, alerts);
} else if (campaign.getType() === "SHOPPING") {
checkShoppingCampaign(campaign, startDate, alerts);
} else if (campaign.getType() === "VIDEO") {
checkVideoCampaign(campaign, startDate, alerts);
} else {
checkStandardCampaign(campaign, startDate, alerts);
}
}
// Send email if there are any alerts
if (alerts.length > 0) {
var subject = "Google Ads Campaign Daily Budget Alert";
var body = "The following campaigns have reached or exceeded their daily budgets:\n\n" + alerts.join("\n\n");
MailApp.sendEmail(emailAddress, subject, body);
}
}
// Function to check standard Search/Display campaigns
function checkStandardCampaign(campaign, startDate, alerts) {
var dailyBudget = campaign.getBudget().getAmount();
var stats = campaign.getStatsFor(startDate, startDate);
var totalCost = stats.getCost();
if (totalCost >= dailyBudget) {
alerts.push("Campaign '" + campaign.getName() + "' (Type: " + campaign.getType() + ") has reached or exceeded its daily budget. Total Cost: $" + totalCost.toFixed(2) + ", Daily Budget: $" + dailyBudget.toFixed(2));
}
}
// Function to check Performance Max (PMax) campaigns
function checkPMaxCampaign(campaign, startDate, alerts) {
// Get the campaign's daily budget
var dailyBudget = campaign.getBudget().getAmount();
// Fetch the campaign's stats for today (using stats for the last 24 hours)
var stats = campaign.getStatsFor("TODAY", "TODAY");
var totalCost = stats.getCost();
if (totalCost >= dailyBudget) {
alerts.push("Campaign '" + campaign.getName() + "' (Type: Performance Max) has reached or exceeded its daily budget. Total Cost: $" + totalCost.toFixed(2) + ", Daily Budget: $" + dailyBudget.toFixed(2));
}
}
// Function to check Shopping campaigns
function checkShoppingCampaign(campaign, startDate, alerts) {
var dailyBudget = campaign.getBudget().getAmount();
var stats = campaign.getStatsFor(startDate, startDate);
var totalCost = stats.getCost();
if (totalCost >= dailyBudget) {
alerts.push("Campaign '" + campaign.getName() + "' (Type: Shopping) has reached or exceeded its daily budget. Total Cost: $" + totalCost.toFixed(2) + ", Daily Budget: $" + dailyBudget.toFixed(2));
}
}
// Function to check Video campaigns
function checkVideoCampaign(campaign, startDate, alerts) {
var dailyBudget = campaign.getBudget().getAmount();
var stats = campaign.getStatsFor(startDate, startDate);
var totalCost = stats.getCost();
if (totalCost >= dailyBudget) {
alerts.push("Campaign '" + campaign.getName() + "' (Type: Video) has reached or exceeded its daily budget. Total Cost: $" + totalCost.toFixed(2) + ", Daily Budget: $" + dailyBudget.toFixed(2));
}
}