Redirect Advertentie Updater

Bespaar tijd door automatisch je uiteindelijke URL te updaten naar de redirect URL.

Start nu!
Redirect Advertentie Updater
Redirect Get started!

Het komt regelmatig voor dat websites en landingspagina's hun URL structuur aanpassen waardoor de uiteindelijke URL van advertenties op een oude URL landen. Er zijn scripts beschikbaar die checken of de landingspagina's 404 meldingen geven, maar hoe zit het met redirects?

Dit script gebruikt de UrlFetchApp functie van Google Apps Scripts om voor elke advertentie te kijken of de uiteindelijke URL een redirect response code geeft (3xx). Als dit zo is, zal het script de nieuwe URL proberen op te halen en de advertentie de kopiëren en hier de nieuwe URL in te plaatsen binnen dezelfde advertentiegroep. Dit zal voor zowel RSA's als ETA's gedaan worden.

Instructies:

  • Het script draait op MCC niveau maar draait voor één account tegelijkertijd. Vul dus de variable accountId.
  • Voordat je het script uitvoert is het aan te raden eerst een voorbeeld te draaien om te kijken wat de daadwerkelijke wijzigingen zijn en bekijk de logbestanden voor meer informatie.
The script
/*
  Redirect follower v2.1 by Bas Baudoin
  
  This scripts replaces ETA/RSA final URLs with 301/302 redirected URL if available
  
  Instructions:
  - MCC script
  - Change account ID
  - Run example, check logs
  
  Todos
  - Non-domain urls
  - Extensions
*/

var accountId = 'XXX-XXX-XXX'

// placeholders
var urlCombos = {}
var checkedUrls = {}

// functions - do not alter ************************************************************

function main() {
  var account = AdsManagerApp.accounts().withIds([accountId])
  Logger.log(account.get().next().getName())
  account.executeInParallel('updateAds')
}

function updateAds(urls) {
  var adSelector = AdsApp.ads()
    .withCondition('Status = ENABLED')
    .withCondition("AdGroupStatus = ENABLED")
    .withCondition("CampaignStatus = ENABLED")
    .withCondition("Type IN [EXPANDED_TEXT_AD, VERSATILE_TEXT_AD]")
    .get()

  while (adSelector.hasNext()) {
    var ad = adSelector.next()
    var finalUrl = ad.urls().getFinalUrl()
    var adGroup = ad.getAdGroup()
    var adType = ad.getType()

    // check url availability or add to objects
    findRedirectUrl(finalUrl)
    var hasNewUrl = urlCombos[finalUrl]
    var hasNoNewUrl = checkedUrls[finalUrl]
    
    if (hasNewUrl) {
     
      // Recreate ETA
      if (adType == 'EXPANDED_TEXT_AD') {
        Logger.log('new ETA in ' + ad.getAdGroup().getName())
        var eta = ad.asType().expandedTextAd()

        var path1 = eta.getPath1() || ''
        var path2 = eta.getPath2() || ''
        var headline3 = eta.getHeadlinePart3() || ''
        var description2 = eta.getDescription2() || ''
        //var labelIterator = eta.labels().get()
        var labelIterator = ad.labels().get()

        Logger.log('ad: ' + finalUrl + ' - ' + hasNewUrl)

        var adOperation = adGroup.newAd().expandedTextAdBuilder()
          .withHeadlinePart1(eta.getHeadlinePart1())
          .withHeadlinePart2(eta.getHeadlinePart2())
          .withHeadlinePart3(headline3)
          .withDescription1(eta.getDescription1())
          .withDescription2(description2)
          .withPath1(path1)
          .withPath2(path2)
          .withFinalUrl(hasNewUrl)
          .build()
        
        var newAd = adOperation.getResult()

        while (labelIterator.hasNext()) {
          var label = labelIterator.next()
          var labelText = label.getName()
          newAd.applyLabel(labelText)
        }

        ad.pause()

        // Recreate RSA
      } else if (adType == 'VERSATILE_TEXT_AD') {
        Logger.log('new RSA in ' + ad.getAdGroup().getName())
        var rsa = ad.asType().responsiveSearchAd()

        var headlines = rsa.getHeadlines()
        var descriptions = rsa.getDescriptions()
        var labelIterator = rsa.labels().get()
        
        Logger.log('ad: ' + finalUrl + ' - ' + hasNewUrl)

        var rsaOperation = adGroup.newAd().responsiveSearchAdBuilder()
          .withHeadlines(headlines)
          .withDescriptions(descriptions)
          .withFinalUrl(hasNewUrl)
          .build()

        var newAd = rsaOperation.getResult()

        while (labelIterator.hasNext()) {
          var label = labelIterator.next()
          var labelText = label.getName()
          newAd.applyLabel(labelText)
        }
        ad.pause()
      }
    }
  }
  Logger.log('Final results')
  Logger.log(urlCombos)
  Logger.log(checkedUrls)
}

function findRedirectUrl(finalUrl) {
  if (urlCombos[finalUrl] || checkedUrls[finalUrl]) {
    //Logger.log('Url already checked')
    return false
  }
  
  var response = UrlFetchApp.fetch(finalUrl, { followRedirects: false, muteHttpExceptions: true })
  var responseCode = response.getResponseCode()
  var newUrl = response.getHeaders()['Location']
  
  if (!newUrl) {
    checkedUrls[finalUrl] = 'checked'
  }

  if (!responseCode) {
    Logger.log('no response code')

    // redirect starts with 3
  } else if (responseCode.toString()[0] == '3') {
    if (newUrl.indexOf('http') >= 0) {
      urlCombos[finalUrl] = newUrl
      return true
    } else {
      checkedUrls[finalUrl] = 'checked'
      //Logger.log(newUrl + ' does not contain http')
    }
  }
  return false
}
Show whole script!
The Experts
Tibbe van Asten Head of PPC @ Increase
Nils Rooijmans Water Cooler Topics
Martijn Kraan Freelance PPC Specialist
Bas Baudoin Teamlead SEA @ Happy Leads
How about you? JOIN US!
Sharing Knowledge
Caring

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

Training &
Workshop
Neem contact op!
Adsscripts Training & Workshop