我有一长串的广告系列名称,我需要将其折叠为长度为1的字符向量,然后传递为"其中"通过" RAdwords"来调用Google AdWords API的条款封装
创建此字符串不会出现问题,直到其长度达到某个值,这会导致值被截断,从而导致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__
如果我通过&#39; campaign_filter1&#39;作为RAdwords中的where子句,事情按预期运行。
如果我通过&#39; campaign_filter2&#39;作为where子句,我收到此错误:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><reportDownloadError>
<ApiError><type>QueryError.INVALID_WHERE_CLAUSE</type><trigger></trigger>
<fieldPath></fieldPath></ApiError></reportDownloadError>
似乎&#34; |的截短&#34;正在逐字传递给RAdwords函数。
以下是检查&#34; traffic_data&#34;的结构的结果。在对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 :(得分: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 = ""
。否则,您最终会在第一个广告系列名称的开头添加一个空格。