Een veranderend aanbod in een webshop met veel producten en merken, zorgt ervoor dat je met regelmaat uitsluitingen na moet lopen in de non-branded campagnes. Gebruik dan dit script om ervoor te zorgen dat alle merken die in je shop staan, automatisch uitgesloten worden in non-branded campagnes. Het script doorloopt alle merken in de feed en controleert of deze in de lijst met uitsluitingswoorden staan. Als dat niet het geval is, wordt deze als zinsdeel toegevoegd.

Instellingen

  • LOG: Geef aan of het script de tussenstappen moet rapporteren, door de waarde aan te passen naar 'true'.
  • LIST_NAME: Definieer de naam van de lijst met uitsluitingswoorden
  • PRODUCT_FEED_URL: De URL van de productfeed. Dit betreft de XML-feed die je ook voor Google Shopping gebruikt.
Script
// Copyright 2019. Increase BV. All Rights Reserved.
//
// Created By: Tibbe van Asten
// for Increase B.V.
// 
// Created: 05-06-2019
// Last update: 18-06-2019
//
// ABOUT THE SCRIPT
// This script will check the feed, collect all brandnames and add
// them to a negative keyword list. 
//
////////////////////////////////////////////////////////////////////

var config = {
 
  LOG : true,
  
  // The name of the Negative Keyword List
  LIST_NAME : "Brands",
  
  // To make use of this script, we connect the productfeed
  PRODUCT_FEED_URL : "PRODUCT_FEED_URL.xml",

}

////////////////////////////////////////////////////////////////////

function main(){
  
  var brands = connectFeed();
  
  // Get negative keyword lists with LIST_NAME
  var negativeKeywordListIterator = AdsApp
  	.negativeKeywordLists()
  	.withCondition("Name CONTAINS '" + config.LIST_NAME + "'")
  	.get();
  
  while(negativeKeywordListIterator.hasNext()){
    var negativeKeywordList = negativeKeywordListIterator.next();
    var negativeKeywords = collectNegativeKeywords(negativeKeywordList);
    
    // Remove brackets and quotationmarks from the keywords
    // to match them to brandnames in the feed
    var negativeKeywordsStripped = [];
    
    	if(config.LOG === true){
          Logger.log("List: " + negativeKeywordList.getName());
          Logger.log("Negatives: " + negativeKeywords);
          Logger.log("Brands: " + brands);
          Logger.log(" ");
        }
    
    // Create stripped list of brandnames
    for(var x = 0;x < negativeKeywords.length;x++){      
      var negativeKeyword = negativeKeywords[x].getText().replace(/\[/g,"").replace(/\]/g,"");
      negativeKeywordsStripped.push(negativeKeyword);     
    } // negativeKeywords iterator
    
    // Add brands when not in the negative keyword list
    for(var y = 0;y < brands.length;y++){
      
      if(negativeKeywordsStripped.indexOf('"' + brands[y] + '"') < 0){
        negativeKeywordList.addNegativeKeyword('"' + brands[y] + '"'); 

        if(config.LOG === true){
          Logger.log("Added " + brands[y] + " to " + negativeKeywordList.getName());
        }
      }

    } // queryIterator 
    
    Logger.log(" ");    
    
  } // negativeKeywordListIterator  
  
} // function main

////////////////////////////////////////////////////////////////////

function connectFeed(){
  
  var brands = [];
  
    if(config.PRODUCT_FEED_URL == "PRODUCT_FEED_URL.xml"){
      throw error("Update your productfeed URL in the config");
    }
  
  // Connect to the feed with the URL from the config
  var xml = UrlFetchApp.fetch(config.PRODUCT_FEED_URL).getContentText();
  var document = XmlService.parse(xml);
  var entries = document.getRootElement().getChild('channel').getChildren('item');
  var atom = XmlService.getNamespace('http://base.google.com/ns/1.0');  
  
  for (var i = 1; i < entries.length; i++) { 
    
    // When the brandname is not in the list already, we'll add it
	if(brands.indexOf(entries[i].getChild('brand', atom).getValue().toLowerCase()) < 0){
    	brands.push(entries[i].getChild('brand', atom).getValue().toLowerCase());
    }
      
  } // for statement
  
  return brands;
  
} // function connectFeed()
  
////////////////////////////////////////////////////////////////////

function collectNegativeKeywords(negativeKeywordList){
  
  var negativeKeywords = [];
  
  var negativeKeywordIterator = negativeKeywordList
    .negativeKeywords()
    .get();

  while(negativeKeywordIterator.hasNext()){
    negativeKeywords.push(negativeKeywordIterator.next());
  } // negativeKeywordIterator
  
  return negativeKeywords;
  
} // collectNegativeKeywords

Kennis delen

Adsscripts.com staat voor het delen van kennis. In de huidige markt houden SEA-specialisten de kennis en ervaring graag voor zich. Wij zijn er van overtuigd dat het delen van kennis ervoor kan zorgen dat iedereen beter wordt in haar of zijn werk. Daarom lopen wij hier graag in voorop, door onze kennis over scripts te delen met iedereen.

Wil jij ook graag een bijdrage leveren? Wij staan open voor nieuwe ideeën en feedback op alles wat je op Adsscripts.com vindt.

Neem contact op

Nils Rooijmans
Google Ads Scripter
Water Cooler Topics
Nils Rooijmans, Google Ads Scripter
Bas Baudoin
Teamleider SEA
Happy Leads
Bas Baudoin, Teamleider SEA
Martijn Kraan
Freelance SEA Specialist
Brightstep
Martijn Kraan, Freelance PPC Specialist
Tibbe van Asten
SEA Specialist
Founder Adsscripts
Tibbe van Asten, Senior PPC Automation Specialist