2017-09-20 17 views
0

長さが1の文字ベクトルに折りたたまれた後、Google AdWords APIの呼び出しで " 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__ 

私がRAd​​wordsのwhere句として 'campaign_filter1'を渡すと、expecteとして実行されます。 d。

私はwhere句として「campaign_filter2」を渡すと、私はこのエラーを取得:

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

に思える「| 切り捨ては」RAdwords関数に渡さ文字通りなっています。私はこの問題を回避機能をループのいくつかの並べ替えを取得し、API 1からデータを呼び出すことができ、明らかに

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

:ここ

はRAdwordsに失敗したコールに「traffic_data」の構造を検査した結果でありますしかし、それはひどく非効率的です。 RAdwordsに渡す文字列全体をどのように取得できますか?

+0

100%確実に '|切り詰められた 'があなたの質問に終わっていますか?送信され、確認された実際のクエリテキストを調べましたか?私はそれが非常に驚くべきことを見つけるために尋ねるだけです。それにかかわらず、実際のクエリテキストを調べることは、再生時の特定の構文エラーを明らかにするため有益です。 – joran

+0

...例えば 'RAdwords :: statement'を実行して長いWHERE句を指定するだけで、すべてが明確に挿入され、切り捨てられません。長さにAPI制限がありますか? – joran

+0

ああ、はい、私は今それを見ることができます。 それでは、答えは、私はそのAPIの制限が何であるかを見つけ出し、そこから解決する必要があります。ありがとう! – holemanm

答えて

0

1つの質問upfront:すべてのキャンペーンデータをドローロードしないで、結果データフレームを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句のデータを持っています。 2番目のパートでは、すべてのキャンペーンをフィルタとしてwhere句を使用して、すべてのキャンペーンを再度ダウンロードする方法を示します。

私は200以上のキャンペーンで上記のコードをテストしました。 RAdwordsパッケージの問題も、AdWords APIの問題もありませんでした。

campaign_filter2に渡す文字列に問題があると思われます。 paste()以内にはsep = ""を設定しないでください。それ以外の場合は、最初のキャンペーン名の先頭にスペースが入ります。

関連する問題