Automatisiert menschliche Fehler aufdecken lassen: Rechtschreibung, Keyword-Optionen und Werbeaktionen

Share on facebook
Facebook
Share on twitter
Twitter
Share on linkedin
LinkedIn
Share on xing
XING

Menschen machen Fehler – das gibt unsere stolze Spezies zwar ungern zu, aber selbst den besten unterläuft ab und an ein Fehler.

Auch vor Google Ads macht diese Regel keinen Halt: Rechtschreibfehler, falsche Keyword-Optionen oder nicht mehr aktuelle Werbeaktionen.

Diese menschlichen Fehler kannst Du mit dem untenstehenden Google Ads Skript in Deinem Konto aufspüren.

Lass mich aber zuerst einen kurzen Blick auf die psychologischen Auswirkungen von Rechtschreibung werfen:

Negative Auswirkung von Schreibfehlern

Gerade Rechtschreibfehler haben das Potential das Markenbild negativ zu beeinflussen. Denn wenn ein Konsument entscheidet, ob er auf eine Werbung eingehen soll oder nicht, spielt Glaubwürdigkeit eine wichtige Rolle.

Dass den meisten Menschen korrekte Rechtschreibung wichtig ist, zeigen Umfragen wie z. B. diejenige der Dating-Website bildkontakte.de, bei welcher 53% der befragten Frauen angaben, dass korrekte Rechtschreibung und Grammatik für sie ein absolutes Muss bei der Online-Partnersuche seien. Weiterhin belegt wird dies von einer Untersuchung vom amerikanischen Dating-Portal OkCupid, das 500.000 Nachrichten zur ersten Kontaktaufnahme analysierte. Schon kleine Fehler, wenn beispielsweise „cant“ statt „can’t“ geschrieben wird, reduzieren die Antwortquote um satte 75% – von durchschnittlich 32% auf nur noch 8%.

Korrekte Rechtschreibung ist aber nicht nur sexy, sondern auch wichtig für Marken:

Disruptive Communications befragte 1.003 Konsumenten welche Faktoren in den sozialen Medien am wahrscheinlichsten dem Bild einer Marke schaden würde. Mit großem Abstand gaben 42,5% der Befragten schlechte Rechtschreibung und Grammatik an.

Nach einer Studie von Global Lingo würden 59% von 1029 Befragten laut eigener Aussage kein Produkt und keine Dienstleistungen eines Unternehmens in Anspruch nehmen, dessen Website offensichtliche Grammatik- oder Rechtschreibfehler enthält.

Ein Bericht der BBC mit dem Titel Spelling Mistakes ‚Cost Millions‘ in lost online sales zitiert den Unternehmer Charles Duncombe:

„an analysis of website figures shows a single spelling mistake can cut online sales in half.“

Und dann ist da noch der Einfluss der Texte, die nicht nur von einem selbst, sondern auch von den Nutzern geschrieben werden. Die an der NYU forschenden Professoren Ghose, Ipeirotis und Li fanden heraus, dass die Nachfrage nach einem Hotel auf Tripadvisor anstieg, wenn die Hotelbewertungen frei von Schreib- und Grammatikfehlern waren.

Nun existieren noch keine Untersuchungen zum Effekt von Rechtschreibfehlern bei Google Ads (und nein, ich möchte auch keine Case Study anfertigen, indem ich absichtlich Rechtschreibfehler A/B-Tests für meine Klienten erstelle), wir können aber davon ausgehen, dass allgemein ein negativer Effekt auf Klickraten und Conversion Raten zu beobachten wäre.

Um zur Perfektion zurückzukehren, gibt es glücklicherweise folgendes Skript, welches Anzeigen auf die häufigsten Rechtschreib- und Tippfehler durchsucht, sowie nicht mehr aktuelle Werbeaktionen und falsche Keyword Optionen aufspürt.

Wie funktioniert es?

Dieses Skript ist ein besonders nützliches Tool für einen Account Audit und überprüft ein Konto automatisch auf die häufigsten deutschen/englischen Rechtschreibfehler und auf falsche Keyword-Optionen (genau passende mit einem Pluszeichen) oder fehlende Keyword-Optionen (weitgehend passende Keywords ohne Pluszeichen).

Auch sucht es nach nicht mehr aktuellen, peinlichen Werbeaktionen vom letzten oder vorletzten Jahr, bei denen eine Aktualisierung versäumt wurde.

Wie kann ich es verwenden?

Kopiere das untenstehende Skript in Dein Google Ads Konto und passe folgende Punkte an:

1. Die Ergebnisse werden in ein Google Tabellen Dokument ausgegeben, welches in der Variable spreadsheetUrl definiert wird. Erstelle eine leere Google Tabelle und kopiere die URL an diese Stelle.

2. Mit den Arrays campainNameDoesNotContain beziehungsweise campaignNameContains kannst Du Kampagnennamen ausschließen / hinzufügen, welche einen bestimmten Begriff enthalten. Begriffe müssen in Anführungszeichen und mit Kommata getrennt werden, z. B. [„Display“, „Shopping“].

Wenn Dein Konto sehr groß ist und das Skript die Laufzeit überschreitet, kannst Du das Skript mehrfach durch Ausschließen oder Hinzufügen einzelner Kampagnen zum Laufen bringen.

3. Wenn ignorePausedCampaigns auf „true“ gesetzt ist, bezieht das Skript nur aktivierte Kampagnen mit ein.

4. Wenn checkKeywords auf „true“ gesetzt ist, werden die Keywords auf Fehler wie fehlende Keyword-Optionen überprüft.

5. Wenn checkAdText auf „true“ gesetzt ist, werden Anzeigentexte auf die im unteren Array checkAdsFor definierten Begriffe wie „Weihnachten“, „Ostern“ oder Jahreszahlen durchsucht.

6. Wenn checkSpelling auf „true“ gesetzt ist, werden Anzeigentexte auf häufige deutsche Rechtschreib- und Tippfehler durchsucht. Standardmäßig ist das deutsche Tabellenblatt ausgewählt, Du kannst aber auch per misspellingsSheetName ein anderes Tabellenblatt wie beispielsweise das englischsprachige auswählen.

Das Skript

Um die deutsche Überprüfung auf Rechtschreib- und Tippfehler zu ermöglichen, habe ich die Daten aus dem Wikipedia-Artikel „Liste von Tippfehlern“ aufbereitet und nach intensiven Recherchen um weitere häufige deutsche Rechtschreibfehler ergänzt. Die Liste umfasst aktuell 2.510 Einträge. Danach habe ich dieses Skript von BrainLabs angepasst, sodass man es auch im deutschsprachigem Raum nutzen kann.

/**
*
* Google Ads Script for keyword and ad checking.
* Checks keyword text for punctuation suggesting the wrong match type, checks
* broad match keywords for missing BMM. Checks ad, sitelink and callout text
* for text that suggests ads are out-of-date (like previous years and seasonal
* events) and for common English spelling mistakes.
*
* Version: 2.1.1
* Updated 2018-10-04: German Version
* Google AdWords Script by brainlabsdigital.com adapted by platinumblack.de
*
**/

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
//Options

var spreadsheetUrl = „https://docs.google.com/YOUR-SPREADSHEET-URL-HERE“;
// The URL of the Google Doc the results will be put into.

var campaignNameDoesNotContain = [];
// Use this if you want to exclude some campaigns.
// For example [„Display“] would ignore any campaigns with ‚Display‘ in the name,
// while [„Display“,“Shopping“] would ignore any campaigns with ‚Display‘ or
// ‚Shopping‘ in the name.
// Leave as [] to not exclude any campaigns.

var campaignNameContains = [];
// Use this if you only want to look at some campaigns.
// For example [„Brand“] would only look at campaigns with ‚Brand‘ in the name,
// while [„Brand“,“Generic“] would only look at campaigns with ‚Brand‘ or ‚Generic‘
// in the name.
// Leave as [] to include all campaigns.

var ignorePausedCampaigns = true;
// Set this to true to only look at currently active campaigns.
// Set to false to include campaigns that had impressions but are currently paused.

var checkKeywords = true;
// Set this to true to look at keyword text for errors like missing BMM.

var checkAdText = true;
// Set this to true to look at ad text for errors like previous years.

var checkSpelling = true;
// Set this to true to check ad text for some common spelling errors.

var checkExtensions = true;
// Set this to true to check the text of sitelinks and callouts for text and
// spelling errors (if those are enabled above).

var checkAllExtensions = false;
// Set this to true to check the text of all of your sitelinks and callouts.
// If this is false, only extensions that have had impressions with the filtered
// campaigns will be checked.

var checkAdsFor = [„2014“, „2015“, „2016“, „2017“, „Ostern“, „Weihnachten“, „Silvester“, „Frühling“, „Sommer“, „Herbst“, „Winter“];
// This is the text that the script will look for in ad copy.
// Feel free to add more!

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
// Advanced Options
var misspellingsSheetUrl = „https://docs.google.com/spreadsheets/d/10jPTO0UJkNUSGOZI9laoXWJO6A_7e3AUoiDlVfKT1kE/“;
// This spreadsheet has the list of German spelling errors, used if checkSpelling
// is true.

var misspellingsSheetName = „German“;
//This is the name of the sheet in the above spreadsheet

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
// Functions

function main() {
var spreadsheet = checkSpreadsheet(spreadsheetUrl, „the spreadsheet“);
var sheet = spreadsheet.getSheets()[0];
var campaignIds = getCampaignIds();

if (checkKeywords) {
keywordChecking(campaignIds, sheet);
Logger.log(„Finished keyword checks.“);
}

if (checkAdText) {
adTextChecking(campaignIds, sheet);
Logger.log(„Finished ad text checks.“);
}

if (checkSpelling) {
adSpellingChecking(campaignIds, sheet);
Logger.log(„Finished common misspelling checks.“);
}
}

// Check the spreadsheet URL has been entered, and that it works
function checkSpreadsheet(spreadsheetUrl, spreadsheetName) {
if (spreadsheetUrl.replace(/[AEIOU]/g,“X“) == „https://docs.google.com/YXXR-SPRXXDSHXXT-XRL-HXRX“) {
throw(„Problem with “ + spreadsheetName + “ URL: make sure you’ve replaced the default with a valid spreadsheet URL.“);
}
try {
var spreadsheet = SpreadsheetApp.openByUrl(spreadsheetUrl);

// Checks if you can edit the spreadsheet
if (spreadsheetName == „the spreadsheet“) {
var sheet = spreadsheet.getSheets()[0];
var sheetName = sheet.getName();
sheet.setName(sheetName);
}

return spreadsheet;
} catch (e) {
throw(„Problem with “ + spreadsheetName + “ URL: ‚“ + e + „‚“);
}
}

// Get the IDs of campaigns which match the given options
function getCampaignIds() {
var whereStatement = „WHERE „;
var whereStatementsArray = [];
var campaignIds = [];

if (ignorePausedCampaigns) {
whereStatement += „CampaignStatus = ENABLED „;
} else {
whereStatement += „CampaignStatus IN [‚ENABLED‘,’PAUSED‘] „;
}

for (var i=0; i<campaignNameDoesNotContain.length; i++) {
whereStatement += „AND CampaignName DOES_NOT_CONTAIN_IGNORE_CASE ‚“ + campaignNameDoesNotContain[i].replace(/“/g,’\\\“‚) + „‚ „;
}

if (campaignNameContains.length == 0) {
whereStatementsArray = [whereStatement];
} else {
for (var i=0; i<campaignNameContains.length; i++) {
whereStatementsArray.push(whereStatement + ‚AND CampaignName CONTAINS_IGNORE_CASE „‚ + campaignNameContains[i].replace(/“/g,’\\\“‚) + ‚“ ‚);
}
}

for (var i=0; i<whereStatementsArray.length; i++) {
var adTextReport = AdWordsApp.report(
„SELECT CampaignId “ +
„FROM CAMPAIGN_PERFORMANCE_REPORT “ +
whereStatementsArray[i] +
„DURING LAST_30_DAYS“);

var rows = adTextReport.rows();
while (rows.hasNext()) {
var row = rows.next();
campaignIds.push(row[‚CampaignId‘]);
}
}

if (campaignIds.length == 0) {
throw(„No campaigns found with the given settings.“);
}

Logger.log(campaignIds.length + “ campaigns found“);
return campaignIds;
}

// Prints an array of rows into the spreadsheet
function printRows(sheet, title, headers, rows) {
try {
var printArray = [];

sheet.getRange(„R“ + (sheet.getLastRow()+2) + „C1“).setValue(title);
if (rows.length == 0) {
sheet.appendRow([„No issues found“]);
Logger.log(„Nothing to output for ‚“ + title + „‚“);
return;
}

sheet.appendRow(headers);

for (var i=0; i < rows.length; i++) {
printArray.push(rows[i]);
}

var lastRow = sheet.getLastRow();
sheet.getRange(„R“ + (lastRow + 1) + „C1:R“ + (lastRow+printArray.length)
+ „C“ + (printArray[0].length) ).setValues(printArray);

Logger.log(„Printed “ + rows.length + “ rows for ‚“ + title + „‚“);

} catch (e) {
Logger.log(„Printing rows ‚“ + title + „‚ failed: “ + e);
}
}

function keywordChecking(campaignIds, sheet) {
try {

var broadMissingPlusses = [];
var nonBroadWithPlusses = [];
var nonExactWithBrackets = [];
var nonPhraseWithQuotes = [];

var keywordMatchReport = AdWordsApp.report(
„SELECT CampaignName, AdGroupName, Criteria, KeywordMatchType “ +
„FROM KEYWORDS_PERFORMANCE_REPORT “ +
„WHERE AdGroupStatus = ENABLED AND Status = ENABLED AND IsNegative = FALSE “ +
„AND CampaignId IN [“ + campaignIds.join(„,“) + „] “ +
„DURING LAST_30_DAYS“);

var keywordMatchRows = keywordMatchReport.rows();

while (keywordMatchRows.hasNext()) {
var keywordMatchRow = keywordMatchRows.next();

if (keywordMatchRow[„KeywordMatchType“].toLowerCase() === „broad“) {

if(keywordMatchRow[„Criteria“].indexOf(„+“) <0) {
//if the broad KW is entirely missing +s
broadMissingPlusses.push([keywordMatchRow[„CampaignName“],keywordMatchRow[„AdGroupName“],“‚“+keywordMatchRow[„Criteria“],keywordMatchRow[„KeywordMatchType“]]);
} else {
var words = keywordMatchRow[„Criteria“].split(“ „);
var missingPlus = false;
for (var j=0; j<words.length; j++) { if (words[j].substr(0,1) != „+“) { missingPlus = true; break; } } if (missingPlus) { broadMissingPlusses.push([keywordMatchRow[„CampaignName“],keywordMatchRow[„AdGroupName“],“‚“+keywordMatchRow[„Criteria“],keywordMatchRow[„KeywordMatchType“]]); } } } else { // If the keyword is not broad if(keywordMatchRow[„Criteria“].indexOf(„+“) > -1) {
nonBroadWithPlusses.push([keywordMatchRow[„CampaignName“],keywordMatchRow[„AdGroupName“],“‚“+keywordMatchRow[„Criteria“],keywordMatchRow[„KeywordMatchType“]]);
}
}

if (keywordMatchRow[„KeywordMatchType“].toLowerCase() != „exact“) {
if(keywordMatchRow[„Criteria“].indexOf(„[„) > -1 || keywordMatchRow[„Criteria“].indexOf(„]“) > -1) {
nonExactWithBrackets.push([keywordMatchRow[„CampaignName“],keywordMatchRow[„AdGroupName“],“‚“+keywordMatchRow[„Criteria“],keywordMatchRow[„KeywordMatchType“]]);
}
}

if (keywordMatchRow[„KeywordMatchType“].toLowerCase() != „phrase“) {
if(keywordMatchRow[„Criteria“].indexOf(‚“‚) > -1) {
nonPhraseWithQuotes.push([keywordMatchRow[„CampaignName“],keywordMatchRow[„AdGroupName“],“‚“+keywordMatchRow[„Criteria“],keywordMatchRow[„KeywordMatchType“]]);
}
}
}//end while

var headers = [„Campaign“, „Ad Group“, „Keyword“, „Match“];

printRows(sheet, „Broad Match Keywords Missing +s“, headers, broadMissingPlusses);
printRows(sheet, „Non-Broad Match Keywords With +s“, headers, nonBroadWithPlusses);
printRows(sheet, „Non-Exact Match Keywords With [ or ]“, headers, nonExactWithBrackets);
printRows(sheet, ‚Non-Phrase Match Keywords With „s‘, headers, nonPhraseWithQuotes);

} catch (e) {
Logger.log(„Keyword checking failed: “ + e);
}
} // end function keywordChecking

function adTextChecking(campaignIds, sheet) {
try {
//
var adLines = [‚Headline‘, ‚Description1‘, ‚Description2‘, ‚DisplayUrl‘];
var adsWithBadText = [];
var etaLines = [‚HeadlinePart1‘, ‚HeadlinePart2‘, ‚Description‘, ‚Path1‘, ‚Path2‘];
var etasWithBadText = [];
var patterns = [];
var charactersToEscape = [„\\“, „/“, „.“, „?“, „+“, „*“, „^“, „$“, „[„, „]“, „(„, „)“, „{„, „}“];
for (var k=0; k<checkAdsFor.length; k++) {
var cleanedText = checkAdsFor[k].toLowerCase();
for (var i=0; i<charactersToEscape.length; i++) { cleanedText = cleanedText.replace(charactersToEscape[i],“\\“ + charactersToEscape[i]); } patterns.push( RegExp(„(^|\\W)“ + cleanedText + „($|\\W)“)); } var adTextReport = AdWordsApp.report( „SELECT CampaignName, AdGroupName, Headline, HeadlinePart1, HeadlinePart2, Description, Description1, Description2, DisplayUrl, Path1, Path2, AdType “ + „FROM AD_PERFORMANCE_REPORT “ + „WHERE AdGroupStatus = ENABLED AND Status = ENABLED “ + „AND AdType IN [TEXT_AD, EXPANDED_TEXT_AD] AND CombinedApprovalStatus != DISAPPROVED “ + „AND CampaignId IN [“ + campaignIds.join(„,“) + „] “ + „DURING LAST_30_DAYS“); var rows = adTextReport.rows(); while (rows.hasNext()) { var row = rows.next(); if (row[„AdType“] == „Text ad“) { var textFound = checkAd(row, adLines, patterns); if (textFound.length > 0) {
adsWithBadText.push([row[„CampaignName“], row[„AdGroupName“], row[‚Headline‘],
row[‚Description1‘], row[‚Description2‘], row[‚DisplayUrl‘],
textFound.join(„, „)]);
}
}
else
{
var textFound = checkAd(row, etaLines, patterns);

if (textFound.length > 0) {
etasWithBadText.push([row[„CampaignName“], row[„AdGroupName“], row[‚HeadlinePart1‘],
row[‚HeadlinePart2‘], row[‚Description‘], row[‚Path1‘], row[‚Path2‘],
textFound.join(„, „)]);
}
}
} // end while

var headers = [„Campaign“, „Ad Group“, ‚Headline‘, ‚Description 1‘, ‚Description 2‘,
‚Display Url‘, ‚Problematic Text‘];
var etaHeaders = [„Campaign“, „Ad Group“, ‚Headline 1‘, ‚Headline 2‘, ‚Description‘,
‚Path 1‘, ‚Path 2‘, ‚Problematic Text‘];
printRows(sheet, „Ad Copy With Problematic Text“, headers, adsWithBadText);
printRows(sheet, „ETA Ad Copy With Problematic Text“, etaHeaders, etasWithBadText);

if (checkExtensions)
{
var calloutLines = [„1“];
var sitelinkLines = [„1“, „3“, „4“, „5“];
var calloutsWithBadText = [];
var sitelinksWithBadText = [];

var extReport = AdWordsApp.report(
„SELECT AttributeValues, PlaceholderType “ +
„FROM PLACEHOLDER_FEED_ITEM_REPORT “ +
„WHERE PlaceholderType IN [1, 17] “ +
„AND Status = ENABLED “ +
(checkAllExtensions ? „“ : „AND CampaignId IN [“ + campaignIds.join(„,“) + „] „) +
„DURING LAST_30_DAYS“);

var rows = extReport.rows();
while (rows.hasNext()) {
var row = rows.next();
var values = JSON.parse(row.AttributeValues);

if (row.PlaceholderType == 17)
{
var textFound = checkAd(values, calloutLines, patterns);

if (textFound.length > 0) {
calloutsWithBadText.push([values[„1“], textFound.join(„, „)]);
}
}
else
{
var textFound = checkAd(values, sitelinkLines, patterns);

if (textFound.length > 0) {
sitelinksWithBadText.push([values[„1“], removeUndefined(values[„3“]), removeUndefined(values[„4“]),
values[„5“], textFound.join(„, „)]);
}
}
} // end while

var sitelinkHeaders = [„Sitelink“, „Description 1“, „Description 2“, „Sitelink URL“, „Problematic Text“];
var calloutHeaders = [„Callout“, „Problematic Text“];
printRows(sheet, „Sitelinks With Problematic Text“, sitelinkHeaders, sitelinksWithBadText);
printRows(sheet, „Callouts With Problematic Text“, calloutHeaders, calloutsWithBadText);
}

} catch (e) {
Logger.log(„Ad text checking failed: “ + e);
}

} // function adTextChecking

function checkAd(ad, adLines, patterns) {
var adCopy = „“;

for (var j=0; j < adLines.length; j++) {
adCopy += “ “ + ad[adLines[j]];
}
adCopy = adCopy.toLowerCase();
var textFound = [];

for (var k=0; k < checkAdsFor.length; k++) {
if (adCopy.match(patterns[k])) {
textFound.push(checkAdsFor[k]);
}
}

return textFound;
}

function removeUndefined(str) {
return (str == undefined ? „None“:str);
}

function adSpellingChecking(campaignIds, sheet) {
try {
var misspellingsSpreadsheet = checkSpreadsheet(misspellingsSheetUrl, „the misspelling spreadsheet“);
var misspellingsSheet = misspellingsSpreadsheet.getSheetByName(misspellingsSheetName);
var misspellings = misspellingsSheet.getRange(2, 1, misspellingsSheet.getLastRow()-1, 2).getValues()

for (var k=0; k<misspellings.length; k++) { misspellings[k][0] = “ “ + misspellings[k][0] + “ „; } var adLines = [‚Headline‘, ‚Description1‘, ‚Description2‘, ‚DisplayUrl‘]; var etaLines = [‚HeadlinePart1‘, ‚HeadlinePart2‘, ‚Description‘, ‚Path1‘, ‚Path2‘]; var adsWithBadText = []; var etasWithBadText = []; var adTextReport = AdWordsApp.report( „SELECT CampaignName, AdGroupName, Headline, HeadlinePart1, HeadlinePart2, Description, Description1, Description2, DisplayUrl, Path1, Path2, AdType “ + „FROM AD_PERFORMANCE_REPORT “ + „WHERE AdGroupStatus = ENABLED AND Status = ENABLED “ + „AND AdType IN [TEXT_AD, EXPANDED_TEXT_AD] AND CombinedApprovalStatus != DISAPPROVED “ + „AND CampaignId IN [“ + campaignIds.join(„,“) + „] “ + „DURING LAST_30_DAYS“); var rows = adTextReport.rows(); while (rows.hasNext()) { var row = rows.next(); if (row.AdType == „TEXT_AD“) { var [textFound, didYouMean] = spellCheck(row, adLines, misspellings); if (textFound.length > 0) {
adsWithBadText.push([row[„CampaignName“], row[„AdGroupName“], row[‚Headline‘],
row[‚Description1‘], row[‚Description2‘], row[‚DisplayUrl‘],
textFound.join(„, „), didYouMean.join(„, „)]);
}
}
else
{
var [textFound, didYouMean] = spellCheck(row, etaLines, misspellings);

if (textFound.length > 0) {
etasWithBadText.push([row[„CampaignName“], row[„AdGroupName“], row[‚HeadlinePart1‘],
row[‚HeadlinePart2‘], row[‚Description‘], row[‚Path1‘], row[‚Path2‘],
textFound.join(„, „), didYouMean.join(„, „)]);
}
}

} // end while

if (checkExtensions)
{
var calloutLines = [„1“];
var sitelinkLines = [„1“, „3“, „4“, „5“];
var calloutsWithBadText = [];
var sitelinksWithBadText = [];

var extReport = AdWordsApp.report(
„SELECT AttributeValues, PlaceholderType “ +
„FROM PLACEHOLDER_FEED_ITEM_REPORT “ +
„WHERE PlaceholderType IN [1, 17] “ +
„AND Status = ENABLED “ +
(checkAllExtensions ? „“ : „AND CampaignId IN [“ + campaignIds.join(„,“) + „] „) +
„DURING LAST_30_DAYS“);

var rows = extReport.rows();

while (rows.hasNext()) {
var row = rows.next();
var values = JSON.parse(row.AttributeValues);

if (row.PlaceholderType == 17)
{
var [textFound, didYouMean] = spellCheck(values, calloutLines, misspellings);

if (textFound.length > 0) {
calloutsWithBadText.push([values[„1“], textFound.join(„, „), didYouMean.join(„, „)]);
}
}
else
{
var [textFound, didYouMean] = spellCheck(values, sitelinkLines, misspellings);

if (textFound.length > 0) {
sitelinksWithBadText.push([values[„1“], removeUndefined(values[„3“]), removeUndefined(values[„4“]),
values[„5“], textFound.join(„, „), didYouMean.join(„, „)]);
}
}
} // end while
}

var headers = [„Campaign“, „Ad Group“, ‚Headline‘, ‚Description 1‘, ‚Description 2‘,
‚Display Url‘, ‚Possible Misspelling‘, ‚Possible Corrections‘];
var etaHeaders = [„Campaign“, „Ad Group“, ‚Headline 1‘, ‚Headline 2‘, ‚Description‘,
‚Path 1‘, ‚Path 2‘, ‚Possible Misspelling‘, ‚Possible Corrections‘];
var sitelinkHeaders = [„Sitelink“, „Description 1“, „Description 2“, ‚Possible Misspelling‘, ‚Possible Corrections‘];
var calloutHeaders = [„Callout“, ‚Possible Misspelling‘, ‚Possible Corrections‘];
printRows(sheet, „Ad Copy With Possible Misspellings“, headers, adsWithBadText);
printRows(sheet, „ETA Ad Copy With Possible Misspellings“, etaHeaders, etasWithBadText);
if (checkExtensions) {
printRows(sheet, „Sitelinks With Possible Misspellings“, sitelinkHeaders, sitelinksWithBadText);
printRows(sheet, „Callouts With Possible Misspellings“, calloutHeaders, calloutsWithBadText);
}

} catch (e) {
Logger.log(„Ad spell checking failed: “ + e);
}

} // function adSpellingChecking

function spellCheck(row, adLines, misspellings) {
var adCopy = “ „;
for (var j=0; j<adLines.length; j++) {
adCopy += “ “ + row[adLines[j]];
}
adCopy += “ „;
adCopy = adCopy.toLowerCase();
adCopy = adCopy.replace(/(_|[^\w\-‚0-9])/g,“ „);
var textFound = [];
var didYouMean = [];

for (var k=0; k<misspellings.length; k++) { if (adCopy.indexOf(misspellings[k][0]) > -1) {
textFound.push(misspellings[k][0].trim());
didYouMean.push(misspellings[k][1]);
}
}

return [textFound, didYouMean];
}

Deutsche Rechtschreibprüfung im Google Ads Editor installieren

Damit in Zukunft erst gar keine Fehler in Anzeigen auftreten, empfehle ich im Google Ads Editor eine deutschsprachige Rechtschreibprüfung zu installieren. Standardmäßig ist nämlich nur die englischsprachige vorinstalliert.

Diese Anleitung führt Dich durch die einzelnen Schritte. Kleine Zeitersparnis: Erspare Dir die Suche nach einem funktionierenden, deutschsprachigen Wörterbuch und nutze einfach dieses.

Bonus: Weitere Skripte zum Aufspüren menschlicher Fehler

Um Dein Konto auf weitere menschliche Fehler zu überprüfen, sind auch folgende Skripte empfehlenswert:

In Konflikt stehende auszuschließende Keywords

Mithilfe des Negative Keyword Conflicts Skriptes kannst Du auszuschließende Keywords identifizieren, welche versehentlich die Ausspielung eines normalen Keywords blockieren. Dieses Problem tritt vor allem dann auf, wenn ein auszuschließendes Keyword in einer anderen Keyword-Option, etwa „weitgehend passend“, eingebucht wird. Konflikte können aber auch immer dann entstehen, wenn verschiedene Nutzer die Keywords in einem Konto ändern.

Linküberprüfung

Eine Website wird im Lauf der Zeit immer wieder umgestaltet: Es werden neue Seiten hinzugefügt und andere Seiten werden entfernt, wodurch Links ungültig werden. Aktive Anzeigen, Keywords oder Sitelinks verweisen dann eventuell auf nicht mehr vorhandene Seiten. Das Linküberprüfungs-Skript identifiziert ungültige Links und versendet im Falle eines Fehlercodes eine E-Mail-Benachrichtigung.

Ausverkaufte Artikel

Ebenso nützlich für Shop-Betreiber ist das Disable Ads and Keywords For Out of Stock Items, welches Anzeigengruppen für nicht mehr verfügbare Produkte pausiert. Dazu wird der Quellcode der Shop-Seite nach einem vorher definierten String durchsucht (beispielsweise „in_stock“:false,“) und dann die dazugehörige Anzeigengruppe pausiert.

Nun hast Du neue Werkzeuge, um menschliche Fehler in Deinem Google Ads Konten aufzuspüren. Eine Einführung zur Verwendung in Skripte findest Du in meinem Google Ads Skripts Artikel.

Bevor Du dich auf die Suche nach Rechtschreibfehlern in diesem Artikel machst und Deinen Fund stolz in den Kommentaren präsentierst, wirf einen Blick auf die Leistungen meiner Google Ads Beratung.

Share on facebook
Facebook
Share on twitter
Twitter
Share on linkedin
LinkedIn
Share on xing
XING
Hannes Hetzer
Hannes Hetzer
Mein Name ist Hannes Hetzer und ich optimiere seit 2014 Websites & Google Ads Konten.