2017-09-20 4 views
0

J'ai une longue liste de noms de campagnes que je dois réduire à un vecteur de caractères de longueur 1, puis passer en tant que clause "where" dans un appel à l'API Google AdWords via le " RAdwords "package.Chaîne de caractères tronquée lors de la transmission à la fonction

La création de cette chaîne de caractères n'est pas un problème tant que sa longueur n'atteint pas un certain point de troncature des valeurs, ce qui provoque une erreur dans l'appel de l'API AdWords.

Voici un exemple de la configuration qui ne provoque pas une erreur:

campaigns <- paste0("Campaign ", seq(1,5)) 
collapsed_campaigns <- paste0(campaigns, collapse = "','") 
campaign_filter1 <- paste("CampaignName IN ['", collapsed_campaigns, "']") 

Et voici une configuration qui provoquera une erreur:

campaigns <- paste0("Campaign ", seq(1,50)) 
collapsed_campaigns <- paste0(campaigns, collapse = "','") 
campaign_filter2 <- paste("CampaignName IN ['", collapsed_campaigns, "']") 

Inspecter la structure de chaque montre variables :

> str(campaign_filter1) 
chr "CampaignName IN [' Campaign 1','Campaign 2','Campaign 3', 
'Campaign 4','Campaign 5 ']" 
> str(campaign_filter2) 
chr "CampaignName IN [' Campaign 1','Campaign 2','Campaign 3', 
'Campaign 4','Campaign 5','Campaign 6','Campaign 7','Campaign 8','Camp"| __truncated__ 

Si je passe 'campaign_filter1' comme mon clause where RAdwords, les choses se passent comme attendues d' ré.

Si je passe 'campaign_filter2' comme la clause where, je reçois cette erreur:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><reportDownloadError> 
<ApiError><type>QueryError.INVALID_WHERE_CLAUSE</type><trigger></trigger> 
<fieldPath></fieldPath></ApiError></reportDownloadError> 

Il semble que le "| tronquée" est littéralement se passer à la fonction RAdwords.

Voici le résultat d'une inspection de la structure de « traffic_data » dans un appel a échoué RAdwords:

> str(traffic_data) 
Classes ‘data.table’ and 'data.frame': 1 obs. of 1 variable: 
$ ads: chr "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?> 
<reportDownloadError><ApiError><type>QueryError.INVALID_WHERE_CLAU"| __truncated__ 
- attr(*, ".internal.selfref")=<externalptr> 

De toute évidence, je pouvais contourner ce une sorte de fonction en boucle et appeler les données de l'API un campagne à la fois, mais ce serait horriblement inefficace. Comment puis-je transmettre l'intégralité de la chaîne de caractères à RAdwords?

+0

Êtes-vous sûr à 100% que le '| truncated' se termine dans votre requête? Avez-vous inspecté le texte de requête envoyé et vérifié? Je demande seulement parce que je trouverais cela très surprenant. Quoi qu'il en soit, inspecter le texte de la requête sera informatif car il révélera l'erreur de syntaxe spécifique en jeu. – joran

+0

... donc par exemple quand j'exécute 'RAdwords :: statement' et que je fournis juste ta longue clause WHERE, tout est clairement inséré, pas tronqué. Peut-être qu'il y a une limite d'API sur la longueur ...? – joran

+0

Ah, oui, je peux le voir maintenant. Donc, alors la réponse sera, je dois savoir quelle est cette limite d'API et l'adresser à partir de là. Merci! – holemanm

Répondre

0

Une question d'emblée: Pourquoi ne pas télécharger toutes les données de la campagne et filtrer les données de résultats dans R? Avec cette stratégie, tout le processus de collage des noms de chaînes de caractères deviendrait superflu. Vous pouvez filtrer la base de données en fonction des opérations vectorielles dans R. Cette approche est probablement plus rubriquée et moins vulnérable.

Cependant, si vous souhaitez filtrer les campagnes explicitement dans votre API appel, vous pouvez le faire avec ce code:

# 1. Download all campaigns 
# query all campaign names 
body1 <- statement(select=c('CampaignName'), 
        report="CAMPAIGN_PERFORMANCE_REPORT", 
        start="2017-11-01", 
        end="2017-11-02") 
# download all campaign names 
campaigns <- getData(clientCustomerId = "***-***-****", 
         google_auth = google_auth, 
         statement = body, 
         apiVersion = "201710", 
         transformation = T, 
         changeNames = T) 
# 2. Build query with all campaigns in where clause 
# build string for where clause 
cmp_string <- paste0(campaigns$Campaign, collapse = "','") 
cmp_string <- paste("CampaignName IN ['", cmp_string, "']", sep = "") 
# query all campaigns with where condition 
body2 <- statement(select = c('CampaignName'), 
        where = cmp_string, 
        report = "CAMPAIGN_PERFORMANCE_REPORT", 
        start = "2017-11-01", 
        end = "2017-11-02") 
# download all campaigns using the where clause 
campaigns2 <- getData(clientCustomerId = "***-***-****", 
        google_auth = google_auth, 
        statement = body, 
        apiVersion = "201710", 
        transformation = T, 
        changeNames = T) 

Dans la première partie, je télécharger tous les noms de campagne pour fournir des données pour la clause where. Dans la deuxième partie, je montre comment télécharger à nouveau toutes les campagnes en utilisant la clause where avec toutes les campagnes comme filtre.

J'ai testé le code ci-dessus avec plus de 200 campagnes. Il n'y a pas eu de problème avec le package RAdwords ni avec l'API AdWords.

Je suppose qu'il y a des problèmes avec la chaîne que vous passez dans campaign_filter2. Dans paste() vous manquez de définir sep = "". Sinon, vous vous retrouvez avec un espace au début du nom de la première campagne.