Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function main() {
- var WARNING_PERCENTAGE_CAP = 95;
- //Ustaw procent budżetu, którego przekroczenie zatrzyma kampenie
- // -1 for all values including 0
- // The percentage of a campaign's budget that needs to have been spent for
- // the tool to consider that campaign over cap and warn about it.
- var EMAILS = ['name@example.com'];
- // The email address you want the hourly update to be sent to.
- // If you'd like to send to multiple addresses then have them separated by commas,
- // for example ["aa@example.com", "bb@example.com"]
- var CAMPAIGN_NAME_CONTAINS = [];
- //Bierz pod uwagę tylko kampanie o okreśłonych nazwach
- // Use this if you only want to look at some campaigns.
- // For example ["Generic"] would only look at campaigns with 'generic' in the name,
- // while ["Generic", "Competitor"] would only look at campaigns with either
- // 'generic' or 'competitor' in the name.
- // Leave as [] to include all campaigns.
- var CAMPAIGN_NAME_EXCLUDES = [];
- //Wyklucz kampanie o okreśłonych nazwach
- // Use this if you want to exclude some campaigns.
- // For example ["Brand"] would ignore any campaigns with 'brand' in the name,
- // while ["Brand", "Key Terms"] would ignore any campaigns with 'brand' or
- // 'key terms' in the name.
- // Leave as [] to not exclude any campaigns.
- //This is a helper function to create the label if it does not already exist
- try {
- var campaigns = getCampaigns(CAMPAIGN_NAME_CONTAINS, CAMPAIGN_NAME_EXCLUDES);
- var overCap = getOverCap(WARNING_PERCENTAGE_CAP, campaigns);
- if(overCap.length > 0) {
- alert(overCap, EMAILS);
- }
- } catch(e) {
- alertError(e, EMAILS);
- }
- }
- function getCampaigns(campNameContains, campNameExcludes) {
- var campaigns = {};
- var whereStatementsArray = buildWhereStatements(campNameContains, campNameExcludes);
- for (var i = 0; i < whereStatementsArray.length; i++) {
- var query = "SELECT CampaignId, Date, Cost, Amount, CampaignName, CampaignStatus" +
- " FROM CAMPAIGN_PERFORMANCE_REPORT " +
- whereStatementsArray[i] +
- "DURING TODAY";
- var rows = AdWordsApp.report(query).rows();
- while (rows.hasNext()) {
- var campaign = campaignFromRow(rows.next());
- campaigns[campaign.id] = campaign;
- }
- }
- return campaigns;
- }
- function buildWhereStatements(campNameContains, campNameExlcudes) {
- var whereStatement = "WHERE CampaignStatus IN ['ENABLED'] "; //['ENABLED','PAUSED']
- for (var i = 0; i < campNameExlcudes.length; i++) {
- whereStatement += "AND CampaignName DOES_NOT_CONTAIN_IGNORE_CASE '"
- + campNameExlcudes[i].replace(/"/g,'\\\"') + "' ";
- }
- var whereStatementsArray = [];
- if (campNameContains.length == 0) {
- whereStatementsArray = [whereStatement];
- } else {
- for (var i = 0; i < campNameContains.length; i++) {
- whereStatementsArray.push(whereStatement + 'AND CampaignName CONTAINS_IGNORE_CASE "'
- + campNameContains[i].replace(/"/g,'\\\"') + '" ');
- }
- }
- return whereStatementsArray;
- }
- function campaignFromRow(reportRow) {
- var obj = {};
- obj.id = reportRow["CampaignId"];
- obj.name = reportRow["CampaignName"];
- obj.budget = reportRow["Amount"];
- obj.spend = reportRow["Cost"];
- if(reportRow["CampaignStatus"] == 'enabled') {
- obj.status = 'Włączona';
- } else {
- obj.status = 'Zatrzymana';
- }
- obj.spent = function() {
- return 100 * (1 - (obj.budget - obj.spend)/obj.budget);
- }
- obj.overSpendCap = function(cap) {
- return obj.spent() > cap;
- }
- return obj;
- }
- function createLabelIfNeeded(labelName) {
- if(!AdsApp.labels().withCondition('Name = "' + labelName + '"').get().hasNext()) {
- AdsApp.createLabel(labelName);
- Logger.log('Etykieta dodana.');
- } else {
- Logger.log('Etykieta już istnieje.');
- }
- }
- function applyLabelAndPause(campaignId) {
- var label = 'Przekroczony budżet';
- createLabelIfNeeded(label);
- // Retrieve a campaign, and apply a label to it. Applying labels to other
- // object types are similar.
- var campaignIterator = AdsApp.campaigns()
- .withIds([campaignId])
- .get();
- if (campaignIterator.hasNext()) {
- var campaign = campaignIterator.next();
- campaign.applyLabel(label);
- campaign.pause();
- Logger.log('dodano etykietę do kampanii ' + campaignId);
- } else {
- Logger.log('Nie znalazł kampanii po ID ' + campaignId);
- }
- }
- function getOverCap(cap, campaigns) {
- var overCap = [];
- for (var campaignId in campaigns) {
- var campaign = campaigns[campaignId];
- if (campaign.overSpendCap(cap)) {
- //add label and pause the campaign
- applyLabelAndPause(campaign.id);
- //change status for campaign object
- campaign.status = 'Zatrzymana do 00:00';
- overCap.push(campaign);
- }
- }
- return overCap;
- }
- function alert(campaigns, EMAILS) {
- var subject = AdWordsApp.currentAccount().getName() + " - dzienny raport wydatków";
- var message = buildTable(campaigns);
- MailApp.sendEmail({
- to: EMAILS.join(','),
- subject: subject,
- htmlBody: message
- });
- }
- function buildTable(campaigns) {
- var table = "<table border=1 style='border: 1px solid black; border-collapse: collapse;'>";
- table += "<tr><th>ID</th><th>Kampania</th><th>Budżet</th><th>Wydatki</th><th>Wydatki %</th><th>Status</th></tr>";
- for (var campaignId in campaigns) {
- var campaign = campaigns[campaignId];
- table += "<tr><td>" + campaign.id + "</td>";
- table += "<td>" + campaign.name + "</td>";
- table += "<td>" + campaign.budget + "zł</td>";
- table += "<td>" + campaign.spend + "zł</td>";
- table += "<td>" + campaign.spent().toFixed(2) + "%</td>";
- table += "<td>" + campaign.status + "</td>";
- table += "</tr>";
- }
- table += "</table>";
- return table;
- }
- function alertError(error, emails) {
- MailApp.sendEmail(
- emails.join(','),
- 'Budget Script - Error',
- error);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement