2016-07-12 5 views
0

Für unsere Google AdWords-Kampagnen verwenden wir ein Skript, das prüft, ob Produkte auf Lager sind. Wenn ein Produkt nicht auf Lager ist, pausiert es die Kampagne. Nach dem Ausführen von T-Skript erhalten wir den folgenden Fehler:Google AdWords vergriffenes Skript

Ich bekomme den folgenden Fehler: TypeError: Kann Methode von "indexOf" von null nicht aufrufen. (Linie 54).

Der Teil des Fehlers ist:

if(STRIP_QUERY_STRING) { 
 
    if(url.indexOf('?')>=0) { 
 
     url = url.split('?')[0]; 
 
    } 
 
    } 
 
    if(url.indexOf('{') >= 0) { 
 
    //Let's remove the value track parameters 
 
    url = url.replace(/\{[0-9a-zA-Z]+\}/g,''); 
 
    } 
 
    return url; 
 
}

Das vollständige Skript ist:

/************************************ 
 
Script aan/uit advertenties 
 
***********************************/ 
 
var URL_LEVEL = 'Ad'; // or Keyword 
 
var ONLY_ACTIVE = false; // set to false for all ads or keywords 
 
var CAMPAIGN_LABEL = 'automatisch'; // set this if you want to only check campaigns with this label 
 
var STRIP_QUERY_STRING = true; // set this to false if the stuff that comes after the question mark is important 
 
var WRAPPED_URLS = false; // set this to true if you use a 3rd party like Marin or Kenshoo for managing you account 
 
// This is the specific text to search for 
 
// on the page that indicates the item 
 
// is out of stock. 
 
var OUT_OF_STOCK_TEXT = 'adwords-niet-op-voorraad'; 
 
    
 
function main() { 
 
    var alreadyCheckedUrls = {}; 
 
    var iter = buildSelector().get(); 
 
    while(iter.hasNext()) { 
 
    var entity = iter.next(); 
 
    var url = cleanUrl(entity.getDestinationUrl()); 
 
    if(alreadyCheckedUrls[url]) { 
 
     if(alreadyCheckedUrls[url] === 'out of stock') { 
 
     entity.pause(); 
 
     } else { 
 
     entity.enable(); 
 
     } 
 
    } else { 
 
     var htmlCode; 
 
     try { 
 
     htmlCode = UrlFetchApp.fetch(url).getContentText(); 
 
     } catch(e) { 
 
     Logger.log('There was an issue checking:'+url+', Skipping.'); 
 
     continue; 
 
     } 
 
     if(htmlCode.indexOf(OUT_OF_STOCK_TEXT) >= 0) { 
 
     alreadyCheckedUrls[url] = 'out of stock'; 
 
     entity.pause(); 
 
     } else { 
 
     alreadyCheckedUrls[url] = 'in stock'; 
 
     entity.enable(); 
 
     } 
 
    } 
 
    Logger.log('Url: '+url+' is '+alreadyCheckedUrls[url]); 
 
    } 
 
} 
 
    
 
function cleanUrl(url) { 
 
    if(WRAPPED_URLS) { 
 
    url = url.substr(url.lastIndexOf('https')); 
 
    if(decodeURIComponent(url) !== url) { 
 
     url = decodeURIComponent(url); 
 
    } 
 
    } 
 
    if(STRIP_QUERY_STRING) { 
 
    if(url.indexOf('?')>=0) { 
 
     url = url.split('?')[0]; 
 
    } 
 
    } 
 
    if(url.indexOf('{') >= 0) { 
 
    //Let's remove the value track parameters 
 
    url = url.replace(/\{[0-9a-zA-Z]+\}/g,''); 
 
    } 
 
    return url; 
 
} 
 
    
 
function buildSelector() { 
 
    var selector = (URL_LEVEL === 'Ad') ? AdWordsApp.ads() : AdWordsApp.keywords(); 
 
    selector = selector.withCondition('CampaignStatus != DELETED').withCondition('AdGroupStatus != DELETED'); 
 
    if(ONLY_ACTIVE) { 
 
    selector = selector.withCondition('CampaignStatus = ENABLED').withCondition('Status = ENABLED'); 
 
    if(URL_LEVEL !== 'Ad') { 
 
     selector = selector.withCondition('AdGroupStatus = ENABLED'); 
 
    } 
 
    } 
 
    if(CAMPAIGN_LABEL) { 
 
    var label = AdWordsApp.labels().withCondition("Name = '"+CAMPAIGN_LABEL+"'").get().next(); 
 
    var campIter = label.campaigns().get(); 
 
    var campaignNames = []; 
 
    while(campIter.hasNext()) { 
 
     campaignNames.push(campIter.next().getName()); 
 
    } 
 
    selector = selector.withCondition("CampaignName IN ['"+campaignNames.join("','")+"']"); 
 
    } 
 
    return selector; 
 
    }

Antwort

0

Sie verwenden getDestinationUrl() zum Abrufen der URL der Anzeige/des Keywords, aber Ziel-URLs werden seit etwa einem Jahr in AdWords nicht mehr verwendet. Daher gibt diese Methode null zurück, was bedeutet, dass Sie mit null als Argument aufrufen, das den von Ihnen aufgelisteten Fehler verursacht.

Um das Skript funktionieren zu lassen, würde ich annehmen, dass Sie .urls().getFinalUrl() anstelle von getDestinationUrl() verwenden müssen.

+0

Vielen Dank für diese Lösung. Veraltet seit etwa einem Jahr? Das macht mich irgendwie dumm. Zum Glück für mich wurde ich gebeten, dies erst gestern zu untersuchen. Wie auch immer, vielen Dank. Haben Sie einen Link zu einer Google-Bibliothek für Funktionen wie diese? Ich kann keinen guten finden. – Tristan

+0

Ja, ich denke, die ursprünglichen Ziel-URLs wurden im Juli 2015 in die endgültigen URLs migriert. Was die Dokumentation betrifft, ist hier ein guter Ausgangspunkt: https://developers.google.com/adwords/scripts/docs/reference/adwordsapp/adwordsapp_ad – dorian

Verwandte Themen