AdWords to teraz Google Ads. Nowa nazwa oddaje pełny zakres usług reklamowych, jakie oferujemy m.in. w wyszukiwarce, sieci reklamowej i YouTube.. Więcej informacji

Obecnie 93 forumowiczów jest online
Obecnie 93 forumowiczów jest online
Dla pytań związanych z funkcjami remarketingu, strategii stawek, Edytor AdWords i skryptów Google Ads.
Poprowadź mnie
star_border
Odpowiedz

[Nowy skrypt] Sprawdza czy grupy reklam prowadzą do jednego URL

[ Edytowane ]
Wszechwiedzący ✭

Cześć,

 

Przyszedł mi do głowy pomysł na skrypt :-)

 

Jest u mnie regułą, że każda grupa reklam powinna prowadzić tylko do jednego adresu docelowego.

Nie wiem czy też tak macie?

 

Zauważyłem, że można się czasami w tym zakresie pomylić.

Szczególnie podczas dodawania nowych elementów do kampanii (i robienia kilku rzeczy na raz) oraz używania funkcji znajdź i zastąp w edytorze.

 

Zastanawiałem się nad sposobem, który pozwoli mi sprawdzić czy mam takie błędy na kontach.

 

Wydaje mi się, że ten skrypt całkiem dobrze daje sobie z tym radę.

 

Co robi?

Sprawdza czy masz grupy reklam, w których słowa kluczowe* lub reklamy prowadzą do różnych stron docelowych.

 

*Osobiście zawsze dodaje końcowy URL do słowa kluczowego. 

 

Na jakie dane patrzy?

Zaczyna od wybrania grup reklam, które miały przynajmniej jedno kliknięcie w przeciągu 30 dni.

Sprawdzając słowa kluczowe wybiera te, które miały przynajmniej jedno wyświetlenie w przeciągu 30 dni.

 

Musiałem zastosować powyższe ograniczenia ponieważ skrypty mogą być uruchomione maksymalnie przez 30 minut.

Próby sprawdzenia wszystkich danych dostępnych (nawet na średnich kontach) kończą się przekroczeniem limitu czasowego.

  

Jak często uruchamiać?

Raz na jakiś czas. Miesiąc lub dłużej. 

 

Można tez stosować na kontach nowych klientów np. przed pierwszą rozmową.

Następnie delikatnie wspomnieć o tym, że są pewne elementy, które będziecie ulepszać po poprzednikach.

Oczywiście nie sugeruję wytykania błędów.

 

 

Konfiguracja:

Wstaw email, na który chcesz otrzymywać powiadomienia 

 

Opcjonalnie:

Na dużych kontach ustaw checkKewordURL = false; i uruchom skrypt.

Później zmień ustaw checkAdURL = false checkKewordURL = true;

 

 

W ten sposób najpierw sprawdzisz tylko adresy reklam, a później słów kluczowych.

To na wypadek gdyby 30 minut nie wystarczyło na oba procesy.

Na średnim koncie całość powinna się zmieścić w 30 minutach.

 

Jeśli pojawią się jakieś pytania lub problemy to chętnie pomogę.

 

Pozdrawiam,

Krzysiek

 

//Konfiguracja wymagana:
var emails = ['TUTAJ WSTAW EMAIL'];

//Konfiguracja opcjonalna:
var checkAdURL = true; // sprawdzac URL reklam?
var checkKewordURL = true; // sprawdzac URL słów kluczowych?
//Koniec konfiguracji

var badAds = [];
var badKeywords = [];


function main() {
isEmailOk(emails);
  
  if (isSearchActive()) {
    if (checkAdURL){
      Logger.log("Rozpoczęto sprawdzanie reklam...");
      checkAds();
    }
    if (checkKewordURL) {
      Logger.log("Rozpoczęto sprawdzanie słow kluczowych...");
      checkKeywords();
    }
  } else {
       Logger.log("Nie masz aktywnych kampanii.")
  }
sendEmails();           
}

function checkAds(){
     var errCount = 0;
     var adGroups = AdWordsApp.adGroups()
   .forDateRange("LAST_30_DAYS")
   .withCondition("Clicks > 1")
   .get()
  while(adGroups.hasNext()){
    var adGroup = adGroups.next();
    errCount = 0;
    var ads = adGroup.ads()
    .forDateRange("LAST_30_DAYS")
    .withCondition('Status = ENABLED')
    .withCondition("Impressions > 0")
    .get();
    while(ads.hasNext()){
      var ad = ads.next();
      var otherAds = adGroup.ads()
      .forDateRange("LAST_30_DAYS")
      .withCondition('CreativeFinalUrls != "' + ad.urls().getFinalUrl() + '"')
      .withCondition('Status = ENABLED')
      .withCondition("Impressions > 0")
      .get();
      if(otherAds.totalNumEntities() > 0){
        errCount++
          if (errCount === 1){
        badAds.push(adGroup.getCampaign().getName() + "\\" + adGroup.getName() + ' ma reklamy z różnymi stronami docelowymi');
        Logger.log(adGroup.getCampaign().getName() + "\\" + adGroup.getName() + ' ma reklamy z różnymi stronami docelowymi');
          }
      }
    }
  }
}

function checkKeywords(){
     var errCount = 0;
     var adGroups = AdWordsApp.adGroups()
   .forDateRange("LAST_30_DAYS")
   .withCondition("Clicks > 1")
   .get()
  while(adGroups.hasNext()){
    var adGroup = adGroups.next();
    errCount = 0;
    var keywords = adGroup.keywords()
    .forDateRange("LAST_30_DAYS")
    .withCondition('Status = ENABLED')
    .withCondition("Impressions > 0")
    .get();
    while(keywords.hasNext()){
      var keyword = keywords.next();
      var otherKeywords = adGroup.keywords()
      .forDateRange("LAST_30_DAYS")
      .withCondition('FinalUrls != "' + keyword.urls().getFinalUrl() + '"')
      .withCondition('Status = ENABLED')
      .withCondition("Impressions > 0")
      .get();
      if(otherKeywords.totalNumEntities() > 0){
        errCount++
          if (errCount === 1){
        badKeywords.push(adGroup.getCampaign().getName() + "\\" + adGroup.getName() + ' ma słowa kluczowe z różnymi stronami docelowymi');
       Logger.log(adGroup.getCampaign().getName() + "\\" + adGroup.getName() + ' ma słowa kluczowe z różnymi stronami docelowymi');
          }
         }
    }
  }
}

function isSearchActive(){
  var searchCampaigns = AdWordsApp
  .campaigns()
  .withCondition("Clicks > 0")
  .forDateRange('LAST_14_DAYS')
  .get(); 
  if (searchCampaigns.totalNumEntities() > 0) {
    var theResult = true;
  } else {
    var theResult = false;
  }
  Logger.log(searchCampaigns.totalNumEntities() + " aktywnych kampanii tekstowych");
  return theResult;
}

function sendEmails(){
if (badKeywords[0] && badAds[0]) {
  MailApp.sendEmail(emails.join(','), 
                    'Masz grupy reklam z różnymi stronami docelowymi',
                      'Cześć, \n\nPoniższe grupy reklam zawierają słowa kluczwe z różnymi stronamai docelowymi: \n\n' + badKeywords.join("\n") +
                      '\n\nPoniższe grupy reklam zawierają reklamy z różnymi stronami docelowymi: \n\n' + badAds.join("\n"));
  return;
} else if (badAds[0]) {
   MailApp.sendEmail(emails.join(','), 
                     'Masz grupy reklam z różnymi stronami docelowymi',
                      'Cześć, \n\nPoniższe grupy reklam zawierają reklamy z różnymi stronamai docelowymi: \n\n' + badAds.join("\n"));
} else if (badKeywords[0]) {
   MailApp.sendEmail(emails.join(','), 
                 'Masz grupy reklam z różnymi stronami docelowymi',
                      'Cześć, \n\nPoniższe grupy reklam zawierają słowa kluczwe z różnymi stronamai docelowymi: \n\n' + badKeywords.join("\n"));
}
  }

function isEmailOk(email) {
  if (email && email[0] == 'TUTAJ WSTAW EMAIL') {
    throw new Error('Aby uruchomic skrypt podaj swoj adres email');
  }
 

 

Czy moja odpowiedź była pomocna? Jeśli tak, oznacz ją jako „najlepszą odpowiedź”
Odpowiedź eksperta 1verified_user

Dot.: [Nowy skrypt] Sprawdza czy grupy reklam prowadzą do jednego URL

[ Edytowane ]
Wszechwiedzący ✭

Hej,

 

Podrzucam poprawiony skrypt.

Okazało się, że czasami wskazywał grupy reklamy, które tak na prawdę prowadziły do tej samej strony.

Poza tym teraz sprawdza wszystkie aktywne kampanie - > grupy reklam -> slowa kluczwe / reklamy (według tej kolejności)

Zmieniłem też sposób sprawdzania czy podany email jest prawidłowy.

 

 

//Required configuration
var email = 'ENTER YOUR EMAIL HERE';

//Optional configuration
var checkAdURL = false; // Check ADS URLS?
var checkKewordURL = true; // Check KEYWORDS URLS?
//End of the configuration

var badAds = [];
var badKeywords = [];


function main() {
validateEmail(email);
  
  if (isSearchActive()) {
    if (checkAdURL){
      Logger.log("Checking the ads...");
      checkAds();
    }
    if (checkKewordURL) {
      Logger.log("Checking the keywords...");
      checkKeywords();
    }
  } else {
       Logger.log("You don't have any active campaigns!")
  }
sendEmails();           
}

function checkAds(){
     var errCount = 0;
     var adGroups = AdWordsApp.adGroups()
   .forDateRange("TODAY")
   .withCondition("Status = ENABLED")
   .withCondition("CampaignStatus = ENABLED")
   .get()
  while(adGroups.hasNext()){
    var adGroup = adGroups.next();
    errCount = 0;
    var ads = adGroup.ads()
    .forDateRange("TODAY")
    .withCondition('Status = ENABLED')
    .get();
    while(ads.hasNext()){
      var ad = ads.next();
     if (ads.urls().getFinalUrl() !== null) {
      var otherAds = adGroup.ads()
    .forDateRange("TODAY")
    .withCondition('Status = ENABLED')
      .withCondition('CreativeFinalUrls != "' + ad.urls().getFinalUrl() + '"')
      .get();
      if(otherAds.totalNumEntities() > 0){
        errCount++
          if (errCount === 1){
        badAds.push(adGroup.getCampaign().getName() + "\\" + adGroup.getName() + ' has ads with different URLs');
          }
      }
     }
    }
  }
}

function checkKeywords(){
     var errCount = 0;
     var adGroups = AdWordsApp.adGroups()
   .forDateRange("TODAY")
   .withCondition("Status = ENABLED")
   .withCondition("CampaignStatus = ENABLED")
   .get()
  while(adGroups.hasNext()){
    var adGroup = adGroups.next();
    errCount = 0;
    var keywords = adGroup.keywords()
    .forDateRange("TODAY")
    .withCondition('Status = ENABLED')
    .get();
    while(keywords.hasNext()){
      var keyword = keywords.next();
      if (keyword.urls().getFinalUrl() !== null) {
      var otherKeywords = adGroup.keywords()
      .forDateRange("TODAY")
      .withCondition('FinalUrls != "' + keyword.urls().getFinalUrl() + '"')
      .withCondition('Status = ENABLED')
      .get();
      if(otherKeywords.totalNumEntities() > 0){
        errCount++
          if (errCount === 1){
        badKeywords.push(adGroup.getCampaign().getName() + "\\" + adGroup.getName() + ' has keywords with different URLs');
          }
         }
      }
    }
  }
}

function isSearchActive(){
  var searchCampaigns = AdWordsApp
  .campaigns()
  .withCondition('AdvertisingChannelType = SEARCH AND Status = ENABLED')
  .forDateRange('TODAY')
  .get();
  if (searchCampaigns.totalNumEntities() > 0) {
    var theResult = true;
  } else {
    var theResult = false;
  }
  var activeSerach = searchCampaigns.totalNumEntities();
  Logger.log('This account has: ' + activeSerach + " active search campaigns.");
  return theResult;
}

function sendEmails(){
if (badKeywords[0] && badAds[0]) {
  MailApp.sendEmail(email, 
                      AdWordsApp.currentAccount().getName() + ' has ad groups with different URLs.',
                      'Hey, \n\nPlease, see the list of ad groups with keywords that lead to landing pages: \n\n' + badKeywords.join("\n") +
                      '\n\nAlso, the list of ad groups with ads that lead to landing pages: \n\n' + badAds.join("\n"));
  return;
} else if (badAds[0]) {
   MailApp.sendEmail(email, 
                     AdWordsApp.currentAccount().getName() + ' has ad groups with different URLs.',
                      'Hey, \n\nPlease, see the list of ad groups with ads that lead to different landing pages: \n\n' + badAds.join("\n"));
} else if (badKeywords[0]) {
   MailApp.sendEmail(email, 
                 AdWordsApp.currentAccount().getName() + ' has ad groups with different URLs.',
                      'Hey, \n\nPlease, see the list of ad groups with keywords that lead to different landing pages: \n\n' + badKeywords.join("\n"));
}
  }

function validateEmail(email) {
  var key = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
  if (key.test(email) === false) {
    throw new Error('You must eneter a valid email address to run the script!')
}
}

 

Czy moja odpowiedź była pomocna? Jeśli tak, oznacz ją jako „najlepszą odpowiedź”

[Nowy skrypt] Sprawdza czy grupy reklam prowadzą do jednego URL

Najlepszy Współtwórca

sprawdzę jutro Emotikon: Mrugający

Dominik Myślak

[Nowy skrypt] Sprawdza czy grupy reklam prowadzą do jednego URL

[ Edytowane ]
Nowicjusz ✭ ✭ ✭

Ok, czekam na feedback!

 

Ups. Nie to konto.

 

Zawsze sie myle na komorce Emotikon: Mrugający

Dot.: [Nowy skrypt] Sprawdza czy grupy reklam prowadzą do jednego URL

Wszechwiedzący ✭

Wkradł się jeszcze mały błąd - przesyłam poprawioną wersję.

 

Dzięki za testy Dominik.

 

//Required confirguration
var email = 'ENTER YOUR EMAIL HERE';

//Optional configuration
var checkAdURL = true; // Check ADS URLS?
var checkKewordURL = true; // Check KEYWORDS URLS?
//End of the configuration

var badAds = [];
var badKeywords = [];


function main() {
validateEmail(email);
  
  if (isSearchActive()) {
    if (checkAdURL){
      Logger.log("Checking the ads...");
      checkAds();
    }
    if (checkKewordURL) {
      Logger.log("Checking the keywords...");
      checkKeywords();
    }
  } else {
       Logger.log("You don't have any active campaigns!")
  }
sendEmails();           
}

function checkAds(){
     var errCount = 0;
     var adGroups = AdWordsApp.adGroups()
   .forDateRange("TODAY")
   .withCondition("Status = ENABLED")
   .withCondition("CampaignStatus = ENABLED")
   .get()
  while(adGroups.hasNext()){
    var adGroup = adGroups.next();
    errCount = 0;
    var ads = adGroup.ads()
    .forDateRange("TODAY")
    .withCondition('Status = ENABLED')
    .get();
    while(ads.hasNext()){
      var ad = ads.next();
     if (ad.urls().getFinalUrl() !== null) {
      var otherAds = adGroup.ads()
    .forDateRange("TODAY")
    .withCondition('Status = ENABLED')
      .withCondition('CreativeFinalUrls != "' + ad.urls().getFinalUrl() + '"')
      .get();
      if(otherAds.totalNumEntities() > 0){
        errCount++
          if (errCount === 1){
        badAds.push(adGroup.getCampaign().getName() + "\\" + adGroup.getName() + ' has ads with different URLs');
          }
      }
     }
    }
  }
}

function checkKeywords(){
     var errCount = 0;
     var adGroups = AdWordsApp.adGroups()
   .forDateRange("TODAY")
   .withCondition("Clicks > 5")  
   .withCondition("Status = ENABLED")
   .withCondition("CampaignStatus = ENABLED")
   .get()
  while(adGroups.hasNext()){
    var adGroup = adGroups.next();
    errCount = 0;
    var keywords = adGroup.keywords()
    .forDateRange("TODAY")
    .withCondition('Status = ENABLED')
    .get();
    while(keywords.hasNext()){
      var keyword = keywords.next();
      if (keyword.urls().getFinalUrl() !== null) {
      var otherKeywords = adGroup.keywords()
      .forDateRange("TODAY")
      .withCondition('FinalUrls != "' + keyword.urls().getFinalUrl() + '"')
      .withCondition('Status = ENABLED')
      .get();
      if(otherKeywords.totalNumEntities() > 0){
        errCount++
          if (errCount === 1){
        badKeywords.push(adGroup.getCampaign().getName() + "\\" + adGroup.getName() + ' has keywords with different URLs');
          }
         }
      }
    }
  }
}

function isSearchActive(){
  var searchCampaigns = AdWordsApp
  .campaigns()
  .withCondition('AdvertisingChannelType = SEARCH AND Status = ENABLED')
  .forDateRange('TODAY')
  .get();
  if (searchCampaigns.totalNumEntities() > 0) {
    var theResult = true;
  } else {
    var theResult = false;
  }
  var activeSerach = searchCampaigns.totalNumEntities();
  Logger.log('This account has: ' + activeSerach + " active search campaigns.");
  return theResult;
}

function sendEmails(){
if (badKeywords[0] && badAds[0]) {
  MailApp.sendEmail(email, 
                      AdWordsApp.currentAccount().getName() + ' has ad groups with different URLs.',
                      'Hey, \n\nPlease, see the list of ad groups with keywords that lead to different URLs: \n\n' + badKeywords.join("\n") +
                      '\n\nAlso, the list of ad groups with ads that lead to different URLs: \n\n' + badAds.join("\n"));
  return;
} else if (badAds[0]) {
   MailApp.sendEmail(email, 
                     AdWordsApp.currentAccount().getName() + ' has ad groups with different URLs.',
                      'Hey, \n\nPlease, see the list of ad groups with ads that lead to different URLs: \n\n' + badAds.join("\n"));
} else if (badKeywords[0]) {
   MailApp.sendEmail(email, 
                 AdWordsApp.currentAccount().getName() + ' has ad groups with different URLs.',
                      'Hey, \n\nPlease, see the list of ad groups with keywords that lead to different URLs: \n\n' + badKeywords.join("\n"));
} else {
  Logger.log("All Good! URLs in ad groups lead to one landing page.")
  }
}

function validateEmail(email) {
  var key = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
  if (key.test(email) === false) {
    throw new Error('You must eneter a valid email address to run the script!')
}
}
Czy moja odpowiedź była pomocna? Jeśli tak, oznacz ją jako „najlepszą odpowiedź”