2017-09-20 46 views
0

我有一長串Campaign名稱,我需要摺疊爲長度爲1的字符向量,然後通過「AdWords」API中的「where」子句通過「 RAdwords「包。字符串在傳遞到函數時被截斷

創建此字符串直到其長度達到某些值被截斷的位置時纔會產生問題,這會導致AdWords API調用出錯。

下面是設置的樣本,這將不會導致錯誤:

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

這裏是一個設置,這將導致一個錯誤:

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

檢查的每個可變顯示結構:

> 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__ 

如果我在RAdwords中通過'campaign_filter1'作爲我的where子句,那麼事情就像預期的那樣運行d。

如果我通過「campaign_filter2」爲where子句中,我得到這個錯誤:

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

看來「| 截斷」是越來越字面上傳遞給RAdwords功能。

這裏是一個失敗的呼叫檢查的「traffic_data」的結構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> 

很顯然,我可以解決這個某種循環功能和API的一個調用數據一次運動,但這將是非常低效的。我怎樣才能讓整個字符串傳遞給RAdwords?

+0

你是否100%確定'| |截斷「結束在您的查詢?您是否檢查過發送並驗證的實際查詢文本?我只問,因爲我會覺得非常驚訝。無論如何,檢查實際的查詢文本將提供信息,因爲它會揭示遊戲中的特定語法錯誤。 – joran

+0

...因此,例如,當我運行'RAdwords :: statement'並提供您的長WHERE子句時,整個事情都被明確插入,而不是被截斷。也許API的長度限制...? – joran

+0

啊,是的,我現在可以看到。 那麼,答案將是,我必須找出那個API限制是什麼,並從那裏解決它。謝謝! – holemanm

回答

0

前面有一個問題:爲什麼不把所有的活動數據加載到R中並過濾結果數據框?通過這種策略,整個字符串活動名稱粘貼過程將變得多餘。您可以基於R中的向量操作來過濾數據幀。這種方法可能更加粗糙且不易受到攻擊。

但是,如果你想你的API中明確過濾廣告調用,您可以使用此代碼做到這一點:

# 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) 

在我下載的所有活動名稱的第一部分有數據的where子句。在第二部分中,我將演示如何使用所有廣告系列的where子句作爲過濾器再次下載所有廣告系列。

我測試了超過200個廣告系列的代碼。 RAdwords包和Adwords API都沒有任何問題。

我懷疑您傳遞給campaign_filter2的字符串有問題。在paste()內,您錯過了設置sep = ""。否則,最終會在第一個廣告系列名稱的開頭留出空格。