Advertisement
Guest User

Untitled

a guest
Oct 16th, 2018
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 26.72 KB | None | 0 0
  1. DEBUG = 0;
  2.  
  3.  
  4. function main() {
  5.  
  6. Logger.log("");
  7.  
  8.  
  9. // nei settings in basso si possono cambiare le mail a cui inviare il report e il budget mensile settato (currentSetting.maxCost)
  10.  
  11. //var SETTINGS = new Object();
  12. currentSetting = new Object();
  13. currentSetting.scope = "Account";
  14. currentSetting.maxCost = getFloat("350");
  15. currentSetting.budgetPeriod = "Monthly";
  16. currentSetting.labelName = "";
  17. currentSetting.labelToAdd = "stoppata da budget alert";
  18. currentSetting.email = "mail1,mail2,mail3";
  19. currentSetting.pauseItems = "no";
  20. currentSetting.reEnableItems = "no";
  21.  
  22. currentSetting.logText = "";
  23.  
  24. currentSetting.currencyCode = AdWordsApp.currentAccount().getCurrencyCode();
  25.  
  26. switch(currentSetting.reEnableItems.toLowerCase()) {
  27. case "no":
  28. currentSetting.reEnableAtStartOfNewPeriod = 0;
  29. break;
  30. case "yes":
  31. currentSetting.reEnableAtStartOfNewPeriod = 1;
  32. break;
  33. }
  34.  
  35. switch(currentSetting.pauseItems.toLowerCase()) {
  36. case "no":
  37. currentSetting.pauseWhenExceeds = 0;
  38. break;
  39. case "yes":
  40. currentSetting.pauseWhenExceeds = 1;
  41. break;
  42. }
  43.  
  44. switch(currentSetting.budgetPeriod) {
  45. case "Daily":
  46. //Logger.log("daily");
  47. currentSetting.dateRange = "TODAY";
  48. break;
  49. case "Weekly Sun-Sat":
  50. //Logger.log("weekly sun");
  51. currentSetting.dateRange = "THIS_WEEK_SUN_TODAY";
  52. break;
  53. case "Weekly Mon-Sun":
  54. //Logger.log("weekly mon");
  55. currentSetting.dateRange = "THIS_WEEK_MON_TODAY";
  56. break;
  57. case "Monthly":
  58. //Logger.log("monthly");
  59. currentSetting.dateRange = "THIS_MONTH";
  60. break;
  61. }
  62.  
  63.  
  64.  
  65. var thenAction = "Pause"; // Alert
  66. var condition1 = "Cost > " + currentSetting.maxCost;
  67. var labelCondition = "Status = ENABLED";
  68. if(currentSetting.labelName) {
  69. labelCondition = "LabelNames CONTAINS_ANY ['" + currentSetting.labelName + "']";
  70. }
  71. if(DEBUG == 1) Logger.log("labelCondition: " + labelCondition);
  72.  
  73. currentSetting.enabledCounter = 0;
  74. currentSetting.deletedCounter = 0;
  75. currentSetting.pausedCounter = 0;
  76. currentSetting.enabledList = new Array();
  77. currentSetting.pausedList = new Array();
  78. currentSetting.deletedList = new Array();
  79.  
  80.  
  81. // Set up labels
  82. var labelToAddText = currentSetting.labelToAdd + " (" + currentSetting.budgetPeriod + ")";
  83. Logger.log("labelToAddText: " + labelToAddText);
  84. currentSetting.labelToAdd = labelToAddText;
  85. if(currentSetting.labelToAdd) {
  86. createLabel(currentSetting.labelToAdd, "Questa etichetta è stata creata per dare indicazioni sul budget. Non cambiarla/sostituirla");
  87. }
  88.  
  89.  
  90. if(currentSetting.reEnableAtStartOfNewPeriod) {
  91. // Check current date, day and time
  92. currentSetting.thisAccountTime = getTimeInThisAccount();
  93. var currentHour = currentSetting.thisAccountTime.HH;
  94. //Logger.log("currentHour: " + currentHour);
  95. var dayOfWeek = currentSetting.thisAccountTime.dayOfWeek;
  96. //Logger.log("dayOfWeek: " + dayOfWeek);
  97. var dd = currentSetting.thisAccountTime.dd;
  98. //Logger.log("dd: " + dd);
  99.  
  100. //Re-activate paused items when start of a new period
  101. var pluralText = "";
  102. if(currentSetting.budgetPeriod.toLowerCase().indexOf("daily") != -1) {
  103. if(currentHour == 0) {
  104. reEnable();
  105. var emailType = "Notification";
  106. var body = 'Resetting daily budgets';
  107. if(currentSetting.enabledList.length > 0) {
  108. body += "<br/>";
  109. body += "Re-Enabled Because We Started a New Daily Budget Period:<br/><ul>";
  110.  
  111. for(var itemCounter = 0; itemCounter < currentSetting.enabledList.length; itemCounter++) {
  112. var item = currentSetting.enabledList[itemCounter];
  113. body += "<li>" + item + "</li>";
  114. }
  115. body += "</ul>";
  116. }
  117. sendEmailNotifications(currentSetting.email, "Daily Budgets Reset", body, emailType );
  118. if(currentSetting.enabledList.length > 1) pluralText = "s";
  119. currentSetting.logText += currentSetting.enabledList.length + " " + currentSetting.scope + pluralText + " enabled. ";
  120. }
  121. } else if(currentSetting.budgetPeriod.toLowerCase().indexOf("weekly sun-mon") != -1) {
  122. if(dayOfWeek == 7 && currentHour == 0) {
  123. reEnable();
  124. var emailType = "Notification";
  125. var body = 'Resetting weekly budgets<br/>';
  126. if(currentSetting.enabledList.length > 0) {
  127. body += "<br/>";
  128. body += "Re-Enabled Because We Started a New Weekly Budget Period:<br/><ul>";
  129.  
  130. for(var itemCounter = 0; itemCounter < currentSetting.enabledList.length; itemCounter++) {
  131. var item = currentSetting.enabledList[itemCounter];
  132. body += "<li>" + item + "</li>";;
  133. }
  134. body += "</ul>";
  135. }
  136. sendEmailNotifications(currentSetting.email, "Weekly Budgets Reset", body, emailType );
  137. if(currentSetting.enabledList.length > 1) pluralText = "s";
  138. currentSetting.logText += currentSetting.enabledList.length + " " + currentSetting.scope + pluralText + " enabled. ";
  139. }
  140. } else if(currentSetting.budgetPeriod.toLowerCase().indexOf("weekly mon-sun") != -1) {
  141. if(dayOfWeek == 1 && currentHour == 0) {
  142. reEnable();
  143. var emailType = "Notification";
  144. var body = 'Resetting weekly budgets<br/>';
  145. if(currentSetting.enabledList.length > 0) {
  146. body += "<br/>";
  147. body += "Re-Enabled Because We Started a New Weekly Budget Period:<br/><ul>";
  148.  
  149. for(var itemCounter = 0; itemCounter < currentSetting.enabledList.length; itemCounter++) {
  150. var item = currentSetting.enabledList[itemCounter];
  151. body += "<li>" + item + "</li>";;
  152. }
  153. body += "</ul>";
  154. }
  155. sendEmailNotifications(currentSetting.email, "Weekly Budgets Reset", body, emailType );
  156. if(currentSetting.enabledList.length > 1) pluralText = "s";
  157. currentSetting.logText += currentSetting.enabledList.length + " " + currentSetting.scope + pluralText + " enabled. ";
  158. }
  159. } else if(currentSetting.budgetPeriod.toLowerCase().indexOf("monthly") != -1) {
  160. if(dd == 1 && currentHour == 0) {
  161. reEnable();
  162. var emailType = "Notification";
  163. var body = 'Resetting monthly budgets on the ' + dd + 'st of the month at ' + currentHour + "h<br/>";
  164. if(currentSetting.enabledList.length > 0) {
  165. body += "<br/>";
  166. body += "Re-Enabled Because We Started a New Monthly Budget Period:<br/><ul>";
  167.  
  168. for(var itemCounter = 0; itemCounter < currentSetting.enabledList.length; itemCounter++) {
  169. var item = currentSetting.enabledList[itemCounter];
  170. body += "<li>" + item + "</li>";;
  171. }
  172. body += "</ul>";
  173. }
  174. sendEmailNotifications(currentSetting.email, "Monthly Budgets Reset", body, emailType );
  175. if(currentSetting.enabledList.length > 1) pluralText = "s";
  176. currentSetting.logText += currentSetting.enabledList.length + " " + currentSetting.scope + pluralText + " enabled. ";
  177. }
  178. }
  179. }
  180.  
  181. // ------------------------------
  182. // CHECK IF BUDGETS HAVE EXCEEDED
  183. // ------------------------------
  184.  
  185. // Account
  186. if(currentSetting.scope.toLowerCase().indexOf("account") != -1) {
  187. var fields = "Cost";
  188. var reportIterator = AdWordsApp.report('SELECT ' + fields +
  189. ' FROM ACCOUNT_PERFORMANCE_REPORT DURING ' + currentSetting.dateRange).rows();
  190.  
  191. while(reportIterator.hasNext()) {
  192. var row = reportIterator.next();
  193. var cost = getFloat(row["Cost"]).toFixed(2);
  194. if(DEBUG == 1) Logger.log("Cost: " + cost + " currentSetting.maxCost: " + currentSetting.maxCost);
  195. }
  196. if(cost > currentSetting.maxCost) {
  197. // check if all campaigns are paused
  198. var campaignIterator = AdWordsApp.campaigns()
  199. .withCondition("Status = ENABLED")
  200. .get();
  201.  
  202. var numActiveCampaigns = campaignIterator.totalNumEntities();
  203.  
  204. if(numActiveCampaigns > 0) {
  205. var body = "Il costo complessivo dell'account '" + AdWordsApp.currentAccount().getName() + "' (" + AdWordsApp.currentAccount().getCustomerId() + ") è stato " + currentSetting.currencyCode + " " + cost
  206. + " al momento dell'invio della mail. Il costo massimo consentito è" + currentSetting.currencyCode + " " + currentSetting.maxCost.toFixed(2) + " " + currentSetting.budgetPeriod + "." +
  207. "<br/><br/>L'account continuerà ad essere attivo fino a che non saranno messe in pausa le campagne.";
  208. var emailType = "warning";
  209. sendEmailNotifications(currentSetting.email, "Budget Account Superato", body, emailType );
  210. //Logger.log("email sent");
  211. currentSetting.logText = "Account cost of " + currentSetting.currencyCode + " " + cost + " exceeds the maximum " + currentSetting.budgetPeriod + " cost of " + currentSetting.currencyCode + " " + currentSetting.maxCost.toFixed(2);
  212.  
  213. if(currentSetting.pauseWhenExceeds) {
  214. while (campaignIterator.hasNext()) {
  215. var campaign = campaignIterator.next();
  216. var name = campaign.getName();
  217. campaign.pause();
  218. campaign.applyLabel(currentSetting.labelToAdd);
  219. currentSetting.pausedCounter++;
  220. currentSetting.pausedList.push(name);
  221. }
  222. }
  223. }
  224. } else {
  225. var body = "Check Giornaliero su Budget Mensile - L'account '" + AdWordsApp.currentAccount().getName() + "' (" + AdWordsApp.currentAccount().getCustomerId() + ") ha speso " + currentSetting.currencyCode + " " + cost
  226. + " rimanendo sotto la soglia di " + currentSetting.currencyCode + " " + currentSetting.maxCost.toFixed(2) + " " + currentSetting.budgetPeriod + ".";
  227. var emailType = "notification";
  228. sendEmailNotifications(currentSetting.email, "Account Budget OK", body, emailType );
  229.  
  230. Logger.log("Report Mensile: l'account ha speso " + currentSetting.currencyCode + cost + " rimanendo sotto la soglia.");
  231. Logger.log("Email alert inviato");
  232.  
  233. }
  234. }
  235.  
  236. // Campaigns
  237. else if(currentSetting.scope.toLowerCase().indexOf("campaign") != -1) {
  238.  
  239. if(currentSetting.labelName != "") {
  240. var isLabelUsed = checkIfLabelIsUsed(currentSetting.scope, currentSetting.labelName);
  241. }
  242.  
  243.  
  244. if(DEBUG == 1) Logger.log(condition1);
  245. if(DEBUG == 1) Logger.log(labelCondition);
  246. if(DEBUG == 1) Logger.log(currentSetting.dateRange);
  247.  
  248. // SEARCH AND DISPLAY CAMPAIGNS
  249. var iterator = AdWordsApp.campaigns()
  250. .withCondition(condition1)
  251. .withCondition("Status = ENABLED")
  252. .withCondition(labelCondition)
  253. .forDateRange(currentSetting.dateRange)
  254. .get();
  255.  
  256. while(iterator.hasNext()){
  257. var item = iterator.next();
  258. var name = item.getName();
  259. var cost = item.getStatsFor(currentSetting.dateRange).getCost();
  260. item.applyLabel(currentSetting.labelToAdd);
  261. Logger.log("Match found: '" + name + "' cost: " + currentSetting.currencyCode + " " + cost);
  262. if(currentSetting.pauseWhenExceeds) item.pause();
  263. currentSetting.pausedCounter++;
  264. currentSetting.pausedList.push(name + " cost: " + currentSetting.currencyCode + " " + cost);
  265. }
  266.  
  267.  
  268.  
  269. if(currentSetting.pausedCounter == 0) {
  270. Logger.log("No campaigns exceeded their allowed budgets for the budget period.");
  271. } else {
  272. //Logger.log("something else");
  273. }
  274.  
  275.  
  276. } else
  277.  
  278.  
  279. // Ad Groups
  280. if(currentSetting.scope.toLowerCase().indexOf("ad group") != -1) {
  281.  
  282. if(currentSetting.labelName != "") {
  283. var isLabelUsed = checkIfLabelIsUsed(currentSetting.scope, currentSetting.labelName);
  284. }
  285.  
  286. // SEARCH AND DISPLAY CAMPAIGNS
  287. var iterator = AdWordsApp.adGroups()
  288. .withCondition(condition1)
  289. .withCondition("Status = ENABLED")
  290. .withCondition(labelCondition)
  291. .forDateRange(currentSetting.dateRange)
  292. .get();
  293.  
  294. while(iterator.hasNext()){
  295. var item = iterator.next();
  296. var name = item.getName();
  297. var cost = item.getStatsFor(currentSetting.dateRange).getCost();
  298. var campaignName = item.getCampaign().getName();
  299. Logger.log("Match found: " + "campaign: '" + campaignName + "' ad group: '" + name + "' cost: " + currentSetting.currencyCode + " " + cost);
  300. item.applyLabel(currentSetting.labelToAdd);
  301. if(currentSetting.pauseWhenExceeds) item.pause();
  302. currentSetting.pausedCounter++;
  303. currentSetting.pausedList.push("campaign: '" + campaignName + "' ad group: '" + name + "'" + " cost: " + currentSetting.currencyCode + " " + cost);
  304. }
  305.  
  306.  
  307.  
  308. if(currentSetting.pausedCounter == 0) {
  309. Logger.log("No ad groups exceeded their allowed budgets for the budget period.");
  310. }
  311.  
  312.  
  313. // Ads
  314. } else if(currentSetting.scope.toLowerCase().indexOf("ad text") != -1) {
  315.  
  316. if(currentSetting.labelName != "") {
  317. var isLabelUsed = checkIfLabelIsUsed(currentSetting.scope, currentSetting.labelName);
  318. }
  319.  
  320. var adIterator = AdWordsApp.ads()
  321. .withCondition(condition1)
  322. .withCondition("Status = ENABLED")
  323. .withCondition(labelCondition)
  324. .forDateRange(currentSetting.dateRange)
  325. .get();
  326.  
  327.  
  328. while(adIterator.hasNext()) {
  329.  
  330. var ad = adIterator.next();
  331. var adHeadline = ad.getHeadline();
  332. var description1 = ad.getDescription1();
  333. var description2 = ad.getDescription2();
  334. var displayUrl = ad.getDisplayUrl();
  335. var cost = ad.getStatsFor(currentSetting.dateRange).getCost();
  336. ad.applyLabel(currentSetting.labelToAdd);
  337.  
  338. Logger.log("Match found: " + adHeadline + " " + description1 + " " + description2 + " " + displayUrl + " -- cost: " + currentSetting.currencyCode + " " + cost);
  339. var fullAdText = adHeadline + " " + description1 + " " + description2 + " " + displayUrl;
  340. if(currentSetting.pauseWhenExceeds) ad.pause();
  341. currentSetting.pausedCounter++;
  342. currentSetting.pausedList.push(fullAdText + " -- cost: " + currentSetting.currencyCode + " " + cost);
  343. } // while(adIterator.hasNext())
  344.  
  345. if(currentSetting.pausedCounter == 0) {
  346. Logger.log("No ads exceeded their allowed budgets for the budget period.");
  347. }
  348.  
  349.  
  350. // Keywords
  351. } else if(currentSetting.scope.toLowerCase().indexOf("keyword") != -1) {
  352.  
  353. if(currentSetting.labelName != "") {
  354. var isLabelUsed = checkIfLabelIsUsed(currentSetting.scope, currentSetting.labelName);
  355. }
  356.  
  357. var iterator = AdWordsApp.keywords()
  358. .withCondition(condition1)
  359. .withCondition("Status = ENABLED")
  360. .withCondition(labelCondition)
  361. .forDateRange(currentSetting.dateRange)
  362. .get();
  363.  
  364. while(iterator.hasNext()){
  365. var item = iterator.next();
  366. var name = item.getText();
  367. var cost = item.getStatsFor(currentSetting.dateRange).getCost();
  368. var campaignName = item.getCampaign().getName();
  369. var adGroupName = item.getAdGroup().getName();
  370. Logger.log("Match found: " + "campaign: '" + campaignName + "' ad group: '" + adGroupName + "' kw: '" + name + "' cost: " + currentSetting.currencyCode + " " + cost);
  371. item.applyLabel(currentSetting.labelToAdd);
  372. if(currentSetting.pauseWhenExceeds) item.pause();
  373. currentSetting.pausedList.push("campaign: '" + campaignName + "' ad group: '" + adGroupName + "' kw: '" + name + "'" + " cost: " + currentSetting.currencyCode + " " + cost);
  374. currentSetting.pausedCounter++;
  375. } // while iterator hasnext
  376.  
  377. if(currentSetting.pausedCounter == 0) {
  378. Logger.log("No keywords exceeded their allowed budgets for the budget period.");
  379. }
  380.  
  381.  
  382. } // if scope == keyword
  383.  
  384.  
  385. currentSetting.pausedList.sort();
  386. if(currentSetting.pausedCounter > 1) {
  387. var pluralText = "s";
  388. } else {
  389. var pluralText = "";
  390. }
  391. var body = currentSetting.pausedCounter + " " + currentSetting.scope + pluralText + " exceeded the " + currentSetting.budgetPeriod + " maximum cost of " + currentSetting.currencyCode + " " + currentSetting.maxCost.toFixed(2) + ". ";
  392. if(currentSetting.pauseWhenExceeds) body += "They were paused by the script.";
  393. body += "<br/><ul>";
  394.  
  395. if(DEBUG == 1) Logger.log("currentSetting.email: " + currentSetting.email + " currentSetting.pausedCounter: " + currentSetting.pausedCounter);
  396. if(currentSetting.email && currentSetting.pausedCounter > 0) {
  397.  
  398. var changesMadeOrSuggestedText = "suggested";
  399. if(currentSetting.pauseWhenExceeds) changesMadeOrSuggestedText = "made";
  400.  
  401. var pausedOrSuggestedText = "exceeded budget";
  402. if(currentSetting.pauseWhenExceeds) pausedOrSuggestedText = "paused";
  403.  
  404. var subject = "Automated Rules for " + AdWordsApp.currentAccount().getName() + ": " + currentSetting.pausedCounter + " change" + pluralText + " " + changesMadeOrSuggestedText;
  405. currentSetting.logText += currentSetting.pausedCounter + " " + currentSetting.scope + pluralText + " " + pausedOrSuggestedText;
  406. for(var itemCounter = 0; itemCounter < currentSetting.pausedList.length; itemCounter++) {
  407. var item = currentSetting.pausedList[itemCounter];
  408. body += "<li>" + item + "</li>";
  409. }
  410. body += "</ul><br/>";
  411. body += "These items were labeled '" + currentSetting.labelToAdd + "' for easy identification.<br/><br/>";
  412. body += "Thanks for using a free Optmyzr.com script. Try our Enhanced Scripts for AdWords which have several benefits:<ul><li>automatically updated when AdWords changes</li><li>works with MCC or individual accounts</li><li>change settings without touching a single line of code</li></ul>";
  413. body += "Get a 2 week free trial at <a href='https://www.optmyzr.com?utm_campaign=free_scripts'>optmyzr.com</a>";
  414.  
  415.  
  416. var emailType = "notification";
  417. if(DEBUG == 1) Logger.log("sending email...");
  418. sendEmailNotifications(currentSetting.email, subject, body, emailType )
  419. }
  420. }
  421.  
  422.  
  423.  
  424.  
  425. function reEnable(){
  426. // Campaigns or Account
  427. if(currentSetting.scope.toLowerCase().indexOf("campaign") != -1 || currentSetting.scope.toLowerCase().indexOf("account") != -1) {
  428. var iterator = AdWordsApp.campaigns()
  429. .withCondition("LabelNames CONTAINS_ANY ['" + currentSetting.labelToAdd + "']")
  430. .get();
  431.  
  432. while(iterator.hasNext()){
  433. var item = iterator.next();
  434. var name = item.getName();
  435. item.removeLabel(currentSetting.labelToAdd)
  436. Logger.log("Enabling campaign: " + name);
  437. item.enable();
  438. currentSetting.enabledCounter++;
  439. currentSetting.enabledList.push(name);
  440. }
  441.  
  442. // SHOPPING CAMPAIGNS
  443. var iterator = AdWordsApp.shoppingCampaigns()
  444. .withCondition("LabelNames CONTAINS_ANY ['" + currentSetting.labelToAdd + "']")
  445. .get();
  446.  
  447. while(iterator.hasNext()){
  448. var item = iterator.next();
  449. var name = item.getName();
  450. item.removeLabel(currentSetting.labelToAdd)
  451. Logger.log("Enabling campaign: " + name);
  452. item.enable();
  453. currentSetting.enabledCounter++;
  454. currentSetting.enabledList.push(name);
  455. }
  456.  
  457. } else
  458.  
  459.  
  460. // Ad Groups
  461. if(currentSetting.scope.toLowerCase().indexOf("ad group") != -1) {
  462.  
  463. var iterator = AdWordsApp.adGroups()
  464. .withCondition("LabelNames CONTAINS_ANY ['" + currentSetting.labelToAdd + "']")
  465. .get();
  466.  
  467. while(iterator.hasNext()){
  468. var item = iterator.next();
  469. var name = item.getName();
  470. var campaignName = item.getCampaign().getName();
  471. Logger.log("Enabling campaign: '" + campaignName + "' ad group: '" + name + "'");
  472. item.removeLabel(currentSetting.labelToAdd);
  473.  
  474. item.enable();
  475. currentSetting.enabledCounter++;
  476. currentSetting.enabledList.push("campaign: '" + campaignName + "' ad group: '" + name + "'");
  477. }
  478.  
  479. // SHOPPING AD GROUPS
  480. var iterator = AdWordsApp.shoppingAdGroups()
  481. .withCondition("LabelNames CONTAINS_ANY ['" + currentSetting.labelToAdd + "']")
  482. .get();
  483.  
  484. while(iterator.hasNext()){
  485. var item = iterator.next();
  486. var name = item.getName();
  487. var campaignName = item.getCampaign().getName();
  488. Logger.log("Enabling campaign: '" + campaignName + "' ad group: '" + name + "'");
  489. item.removeLabel(currentSetting.labelToAdd);
  490.  
  491. item.enable();
  492. currentSetting.enabledCounter++;
  493. currentSetting.enabledList.push("campaign: '" + campaignName + "' ad group: '" + name + "'");
  494. }
  495.  
  496.  
  497.  
  498.  
  499. // Ads
  500. } else if(currentSetting.scope.toLowerCase().indexOf("ad text") != -1) {
  501.  
  502. var adIterator = AdWordsApp.ads()
  503. .withCondition("LabelNames CONTAINS_ANY ['" + currentSetting.labelToAdd + "']")
  504. .get();
  505.  
  506.  
  507. while(adIterator.hasNext()) {
  508.  
  509. var ad = adIterator.next();
  510. var adHeadline = ad.getHeadline();
  511. var description1 = ad.getDescription1();
  512. var description2 = ad.getDescription2();
  513. var displayUrl = ad.getDisplayUrl();
  514. ad.removeLabel(currentSetting.labelToAdd);
  515.  
  516. Logger.log("Enabling ad: " + adHeadline + " " + description1 + " " + description2 + " " + displayUrl);
  517. var fullAdText = adHeadline + " " + description1 + " " + description2 + " " + displayUrl;
  518.  
  519.  
  520. ad.enable();
  521. currentSetting.enabledCounter++;
  522. currentSetting.enabledList.push(fullAdText);
  523.  
  524. } // while(adIterator.hasNext())
  525.  
  526.  
  527.  
  528. // Keywords
  529. } else if(currentSetting.scope.toLowerCase().indexOf("keyword") != -1) {
  530.  
  531. var iterator = AdWordsApp.keywords()
  532. .withCondition("LabelNames CONTAINS_ANY ['" + currentSetting.labelToAdd + "']")
  533. .get();
  534.  
  535.  
  536. while(iterator.hasNext()){
  537. var item = iterator.next();
  538. var name = item.getText();
  539. var campaignName = item.getCampaign().getName();
  540. var adGroupName = item.getAdGroup().getName();
  541. Logger.log("Enabling campaign: '" + campaignName + "' ad group: '" + adGroupName + "' kw: '" + name + "'");
  542. item.removeLabel(currentSetting.labelToAdd);
  543.  
  544.  
  545. item.enable();
  546. currentSetting.enabledCounter++;
  547. currentSetting.enabledList.push("campaign: '" + campaignName + "' ad group: '" + adGroupName + "' kw: '" + name + "'");
  548.  
  549. } // while iterator hasnext
  550. } // if scope == keyword
  551. }
  552.  
  553. /* getTimeInThisAccount
  554. // ----------------------
  555. // Deals with getting the current time and date in this account
  556. // using the timezone settings of the account.
  557.  
  558. // returns all values in currentSetting.thisAccountTime object
  559. */
  560. function getTimeInThisAccount() {
  561. var weekday = new Array(7);
  562. weekday[0]= "Sunday";
  563. weekday[1] = "Monday";
  564. weekday[2] = "Tuesday";
  565. weekday[3] = "Wednesday";
  566. weekday[4] = "Thursday";
  567. weekday[5] = "Friday";
  568. weekday[6] = "Saturday";
  569.  
  570. var timeZone = AdWordsApp.currentAccount().getTimeZone();
  571. //Logger.log("time zone: " + timeZone);
  572. var date = new Date();
  573.  
  574. var thisAccountTime = new Object();
  575. thisAccountTime.dayOfWeek = parseInt(Utilities.formatDate(date, timeZone, "uu"));
  576. thisAccountTime.dd =parseInt(Utilities.formatDate(date, timeZone, "dd"));
  577. thisAccountTime.weekday = weekday[thisAccountTime.dayOfWeek];
  578. thisAccountTime.HH = parseInt(Utilities.formatDate(date, timeZone, "HH"));
  579. thisAccountTime.timeZone = timeZone;
  580.  
  581.  
  582. return(thisAccountTime);
  583. }
  584.  
  585. /* createLabel(name, description, backgroundColor)
  586. // ------------
  587. // Makes sure the label doesn't already exists before creating it
  588. //
  589. */
  590. function createLabel(name, description, backgroundColor) {
  591.  
  592. var labelIterator = AdWordsApp.labels()
  593. .withCondition("Name CONTAINS '" + name + "'")
  594. .get();
  595.  
  596. if(labelIterator.hasNext()) {
  597. Logger.log("Label already exists");
  598. } else {
  599. Logger.log("Label needs to be created: " + name + " desc: " + description + " color: " + backgroundColor);
  600. if(description && backgroundColor) {
  601. AdWordsApp.createLabel(name, description, backgroundColor);
  602. Logger.log("Label created");
  603. } else if (description) {
  604. AdWordsApp.createLabel(name, description);
  605. Logger.log("Label created");
  606. } else {
  607. AdWordsApp.createLabel(name);
  608. Logger.log("Label created");
  609. }
  610. }
  611. }
  612. /* checkIfLabelIsUsed(scope, labelName)
  613. // --------------------------------------
  614. // Check is a label that will be used to search for entities is actually used by at
  615. // least 1 of those entities.
  616. //
  617. // This prevents weird cases where the script fails without error due to a missing label
  618. //
  619. */
  620. function checkIfLabelIsUsed(scope, labelName) {
  621. var entitiesWithLabel = 0;
  622. var labelIterator = AdWordsApp.labels()
  623. .withCondition('Name = "' + labelName + '"')
  624. .get();
  625. if (labelIterator.hasNext()) {
  626. var label = labelIterator.next();
  627. if(scope.toLowerCase().indexOf("campaign") != -1) entitiesWithLabel = label.campaigns().get().totalNumEntities();
  628. if(scope.toLowerCase().indexOf("ad group") != -1) entitiesWithLabel = label.adGroups().get().totalNumEntities();
  629. if(scope.toLowerCase().indexOf("ad text") != -1) entitiesWithLabel = label.ads().get().totalNumEntities();
  630. if(scope.toLowerCase().indexOf("keyword") != -1) entitiesWithLabel = label.keywords().get().totalNumEntities();
  631. return(entitiesWithLabel);
  632. }
  633.  
  634. if(!entitiesWithLabel) {
  635. Logger.log("No campaigns use the label '" + currentSetting.labelName + "' so this script won't do anything. Update your settings on optmyzr.com with the name of a label that is used for at least 1 campaign.");
  636. }
  637. }
  638.  
  639. /*
  640. // emailType can be: notification or warning
  641. */
  642. function sendEmailNotifications(emailAddresses, subject, body, emailType ) {
  643.  
  644. if(emailType.toLowerCase().indexOf("warning") != -1) {
  645. var finalSubject = "[Warning] " + subject + " - " + AdWordsApp.currentAccount().getName() + " (" + AdWordsApp.currentAccount().getCustomerId() + ")"
  646. } else if(emailType.toLowerCase().indexOf("notification") != -1) {
  647. var finalSubject = "[Notification] " + subject + " - " + AdWordsApp.currentAccount().getName() + " (" + AdWordsApp.currentAccount().getCustomerId() + ")"
  648. }
  649.  
  650. if(AdWordsApp.getExecutionInfo().isPreview()) {
  651. var finalBody = "<b>This script ran in preview mode. No changes were made to your account.</b><br/>" + body;
  652. } else {
  653. var finalBody = body;
  654. }
  655.  
  656. MailApp.sendEmail({
  657. to:emailAddresses,
  658. subject: finalSubject,
  659. htmlBody: finalBody
  660. });
  661.  
  662. if(DEBUG == 1) Logger.log("email sent to " + emailAddresses + ": " + finalSubject);
  663.  
  664. }
  665.  
  666. function getFloat (input) {
  667. if(!input || input == "" || typeof(input) === 'undefined') var input = "0.0";
  668. input = input.toString();
  669. var output = parseFloat(input.replace(/,/g, ""));
  670. return output;
  671. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement