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 242 forumowiczów jest online
Obecnie 242 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 są dupliakty słów kluczowych

[ Edytowane ]
Wszechwiedzący ✭

Czołem,

 

Wziąłem się za sprawdzanie duplikatów słów kluczowych na kontach.

Spotkał mnie mały szok bo rekordzista miał ich prawie 5000.

 

Postanowiłem zapobiec temu na przyszłość i zrobiłem skrypt, które sprawzda czy są duplikaty na koncie.

Jeśli jakieś się pojawią to otrzymamy maila. Oczywiście tylko wtedy, gdy dane słowo kluczwe jest dokładnie takie samo i w tym samym dopasowaniu.

 

Można sobie ustawić harmonogram uruchamiania na raz dziennie i sprawa załatwiona :-)

 

Konfiguracja:

Wstaw swój emial

 

 

Jeśli ktoś ma jakieś sugestie to piszcie.

 

 

 

//Konfiguracja:
var emails = ['TUTAJ WSTAW EMAIL'];
//Koniec konfiguracji var data = { keyword:[], broadDuplicates: [], phraseDuplicates: [], exactDuplicates: [] }; function main() { getBroadKeywords(); findDuplicates(data.keyword, data.broadDuplicates); if (data.broadDuplicates.length) { Logger.log("Duplikaty słów kluczowych w dopasowaniu przybliżonym: " + data.broadDuplicates); } getPhraseKeywords(); findDuplicates(data.keyword, data.phraseDuplicates); if (data.phraseDuplicates.length) { Logger.log("Duplikaty słów kluczowych w dopasowaniu do wyrażenia: " + data.phraseDuplicates); } getExactKeywords(); findDuplicates(data.keyword, data.exactDuplicates); if (data.exactDuplicates.length) { Logger.log("Duplikaty słów kluczowych w dopasowaniu ścisłym: " + data.exactDuplicates); } if (data.broadDuplicates.length || data.phraseDuplicates.length || data.exactDuplicates.length) { isEmailOk(emails); sendEmails(); }else{ Logger.log("Nie znaleziono duplikatów słów kluczowych.") } } function findDuplicates(arrey, type) { arrey.forEach(function(item,i){ if(arrey.indexOf(item)!=i){ type.push(item); } }); } function getBroadKeywords(){ data.keyword = []; var query = 'SELECT CampaignName, AdGroupName, ' + 'Criteria, KeywordMatchType ' + 'FROM KEYWORDS_PERFORMANCE_REPORT ' + 'WHERE CampaignStatus = "ENABLED" AND AdGroupStatus = "ENABLED" AND ' + 'Status = "ENABLED" AND KeywordMatchType = "BROAD" ' + 'DURING TODAY'; var report = AdWordsApp.report(query); var rows = report.rows(); while (rows.hasNext()) { var row = rows.next(); data.keyword.push(row['Criteria']); } } function getPhraseKeywords(){ data.keyword = []; var query = 'SELECT CampaignName, AdGroupName, ' + 'Criteria, KeywordMatchType ' + 'FROM KEYWORDS_PERFORMANCE_REPORT ' + 'WHERE CampaignStatus = "ENABLED" AND AdGroupStatus = "ENABLED" AND ' + 'Status = "ENABLED" AND KeywordMatchType = "PHRASE" ' + 'DURING TODAY'; var report = AdWordsApp.report(query); var rows = report.rows(); while (rows.hasNext()) { var row = rows.next(); var kw = row['Criteria'] data.keyword.push('"' + kw + '"'); } } function getExactKeywords(){ data.keyword = []; var query = 'SELECT CampaignName, AdGroupName, ' + 'Criteria, KeywordMatchType ' + 'FROM KEYWORDS_PERFORMANCE_REPORT ' + 'WHERE CampaignStatus = "ENABLED" AND AdGroupStatus = "ENABLED" AND ' + 'Status = "ENABLED" AND KeywordMatchType = "EXACT" ' + 'DURING TODAY'; var report = AdWordsApp.report(query); var rows = report.rows(); while (rows.hasNext()) { var row = rows.next(); var kw = row['Criteria'] data.keyword.push('['+ kw + ']'); } } function sendEmails(){ var volume = (data.broadDuplicates.length + data.phraseDuplicates.length + data.exactDuplicates.length); Logger.log(volume) if (volume > 300) { MailApp.sendEmail(emails.join(','), 'Masz duplikaty słów kluczowych.', 'Cześć, \n\nNa koncie: ' + AdWordsApp.currentAccount().getName() + ' masz ponad 300 duplikatów słów kluczwych. \n\n' + '\n\nZaloguj się i sprawdź czy można to naprawić. \n\n'); } else if (volume < 300 && volume !== 0.0) { MailApp.sendEmail(emails.join(','), 'Masz duplikaty słów kluczowych.', 'Cześć, \n\nNa koncie: ' + AdWordsApp.currentAccount().getName() + ' masz duplikaty tych słów kluczwych: \n\n' + data.broadDuplicates.join("\n") + '\n\n' + data.phraseDuplicates.join("\n") + '\n\n' + data.exactDuplicates.join("\n")); } else if (volume === 0.0) { return; } } 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

[Nowy Skrypt] Sprawdza czy są dupliakty słów kluczowych

Najlepszy Współtwórca

Warto ustalić sobie własny tryb działań na koncie i od czasu do czasu uruchomić narzędzia w Edytorze AdWords Znajdź duplikaty... Emotikon: Mrugający

 

Ale super, że skrypt sprawdzi nam to codziennie. 

Dominik Myślak

[Nowy Skrypt] Sprawdza czy są dupliakty słów kluczowych

Wszechwiedzący ✭

Jasne, pełna zgoda Dominik.
Jeśli ktoś nie przepada za automatyzacją to przynajmniej raz w miesiąc warto się tym zająć.

 

Trochę zaniedbałem tą sprawę ostatnio.
Ale teraz będzie już tip-top :-)

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

[Nowy Skrypt] Sprawdza czy są dupliakty słów kluczowych

MCS
Student ✭ ✭ ✭

Hej, to jest na zwykłe konto czy w MCK tez ruszy?

[Nowy Skrypt] Sprawdza czy są dupliakty słów kluczowych

Wszechwiedzący ✭

Tylko pojedyńcze konta.

Niestety ale skrpyty mają 30 minutowy limit czasu na uruchomienie.

Przy duży kontach zabrakło by czasu.

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

Dot.: [Nowy Skrypt] Sprawdza czy są dupliakty słów kluczowych

[ Edytowane ]
Wszechwiedzący ✭

Siema,

 

Na życzenie Dominika dorobiłem jezscze opcje wykluczenia po nazwie kampanii.

 

Przydatne jeśli mamy kampanie podzielone wedlug urządzęń - wiadomo, że będą wtedy duplikaty słów kluczowych na koncie.

Wystarczy dodać wtedy np. znaczek gwiazdki * do nazw takich kampanii a w ustawieniach skryptu zrobić tak:

var excludeCampaignsThatContain = "*"

 

Wszystkie przyszłe skrypty (o ile wpadnie mi jeszcze coś do głowy) będą już po Angielsku.

 

Pozdro.

 

var email = 'ENTER YOUR EMAIL HERE';
var excludeCampaignsThatContain = "ENTER A WORD HERE"; //You can exclude campagins that contain a letter / word / phrase. This filter is case SENSITVE

var data = {
  keyword:[],
  broadDuplicates: [],
  phraseDuplicates: [],
  exactDuplicates: []
};
function main() {
validateEmail(email);
getBroadKeywords();
findDuplicates(data.keyword, data.broadDuplicates);
  if (data.broadDuplicates.length) {
    Logger.log("Duplicate keywords in Broad Match: " + data.broadDuplicates);
  }
  
getPhraseKeywords();
findDuplicates(data.keyword, data.phraseDuplicates);
  if (data.phraseDuplicates.length) {
Logger.log("Duplicate keywords in Phrase Match: " + data.phraseDuplicates);
  } 

getExactKeywords();
findDuplicates(data.keyword, data.exactDuplicates);
  if (data.exactDuplicates.length) {
    Logger.log("Duplicate keywords in Exact Match: " + data.exactDuplicates); 
  }
  if (data.broadDuplicates.length || data.phraseDuplicates.length || data.exactDuplicates.length) {
sendEmails();
  }else{
    Logger.log("This account doesn't have duplicate keywords.")
  }
}

function findDuplicates(arrey, type) {
arrey.forEach(function(item,i){
if(arrey.indexOf(item)!=i){
type.push(item);
}
});
}

function getBroadKeywords(){
    data.keyword = [];
    var query =
    'SELECT CampaignName, AdGroupName, ' +
    'Criteria, KeywordMatchType ' +
    'FROM KEYWORDS_PERFORMANCE_REPORT ' +
    'WHERE CampaignStatus = "ENABLED" AND AdGroupStatus = "ENABLED" AND CampaignName DOES_NOT_CONTAIN "' + excludeCampaignsThatContain + '" AND ' +
    'Status = "ENABLED" AND KeywordMatchType = "BROAD" ' +
    'DURING TODAY';
 var report = AdWordsApp.report(query); 
 var rows = report.rows();  
    while (rows.hasNext()) {
    var row = rows.next();
     data.keyword.push(row['Criteria']);
    }  
}
function getPhraseKeywords(){
    data.keyword = [];
    var query =
    'SELECT CampaignName, AdGroupName, ' +
    'Criteria, KeywordMatchType ' +
    'FROM KEYWORDS_PERFORMANCE_REPORT ' +
    'WHERE CampaignStatus = "ENABLED" AND AdGroupStatus = "ENABLED" AND CampaignName DOES_NOT_CONTAIN "' + excludeCampaignsThatContain + '" AND ' +
    'Status = "ENABLED" AND KeywordMatchType = "PHRASE" ' +
    'DURING TODAY';
 var report = AdWordsApp.report(query); 
 var rows = report.rows();  
    while (rows.hasNext()) {
    var row = rows.next();
    var kw = row['Criteria']
     data.keyword.push('"' + kw + '"');
    }  
}
function getExactKeywords(){
    data.keyword = [];
    var query =
    'SELECT CampaignName, AdGroupName, ' +
    'Criteria, KeywordMatchType ' +
    'FROM KEYWORDS_PERFORMANCE_REPORT ' +
    'WHERE CampaignStatus = "ENABLED" AND AdGroupStatus = "ENABLED" AND CampaignName DOES_NOT_CONTAIN "' + excludeCampaignsThatContain + '" AND ' +
    'Status = "ENABLED" AND KeywordMatchType = "EXACT" ' +
    'DURING TODAY';
 var report = AdWordsApp.report(query); 
 var rows = report.rows();  
    while (rows.hasNext()) {
    var row = rows.next();
    var kw = row['Criteria']
     data.keyword.push('['+ kw + ']');
    }  
}

function sendEmails(){

var volume = (data.broadDuplicates.length + data.phraseDuplicates.length + data.exactDuplicates.length);
  Logger.log(volume)
  if (volume > 300) {
  MailApp.sendEmail(email, 
                    'Your account has duplicate keywords.',
                    'Hey, \n\nThe: ' + AdWordsApp.currentAccount().getName() + ' account has more than 300 duplicate keywords. \n\n' +
                      '\n\nLogin to AdWords and try to fix it. \n\n');
} else if (volume < 300 && volume !== 0.0) {
   MailApp.sendEmail(email, 
                 'Your account has duplicate keywords.',
                     'Hey, \n\n' + AdWordsApp.currentAccount().getName() + ' account has dupliactes of these keyowrds: \n\n' + data.broadDuplicates.join("\n") + '\n\n' + data.phraseDuplicates.join("\n") + '\n\n' + data.exactDuplicates.join("\n"));
} else if (volume === 0.0) {
  return;
  }
}
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ź”