核心报告 API - 如何使用多个 dimensionFilterClauses 过滤器?

8
我正在尝试在Core Reporting API V4查询中使用多个dimensionFilterClauses。如果我只在ga:adwordsCustomerID维度上使用一个过滤器,一切都很好,但是当我在ga:adTargetingType维度上添加第二个过滤器时,它会抛出“状态400:错误请求”的错误。
这是我编写的查询:
    return analytics.reports().batchGet(
        body={"reportRequests": [{
            "pageSize": 10000,
            "viewId": VIEW_ID,
            "dateRanges": [
                {"startDate": "31daysAgo", "endDate": "yesterday"}
            ],
            "dimensions": [
                {"name": "ga:adwordsCampaignID"},
                {"name": "ga:adwordsAdGroupID"},
                {"name": "ga:adwordsCriteriaID"}
            ],
            "metrics": [
                {"expression": "ga:adClicks"},
                {"expression": "ga:adCost"},
                {"expression": "ga:uniquePurchases"},
                {"expression": "ga:itemRevenue"},
                {"expression": "ga:CPC"},
                {"expression": "ga:ROAS"}
            ],
            "dimensionFilterClauses": [
                {"filters": [
                    {"dimensionName": "ga:adwordsCustomerID",
                     "operator": "EXACT",
                     "expressions": ["2096809090"]},
                    {"dimensionName": "ga:adTargetingType",
                     "operator": "EXACT",
                     "expressions": ["Keyword"]}
                ]}
            ],
            "metricFilterClauses": [
                {"filters": [
                    {"metricName": "ga:adCost",
                     "operator": "GREATER_THAN",
                     "comparisonValue": "0"}
                ]}
            ],
            "orderBys": [
                {"fieldName": "ga:adClicks",
                 "sortOrder": "DESCENDING"}
            ]}
        ]}
    ).execute()

你知道上面的查询体有什么问题吗?

3
筛选器是使用 OR 连接的。如果你想让两个筛选器使用 AND 连接,则需要使用多个 DimensionFilterClauses。你遇到的错误似乎来自于代码的其他部分,因为你没有在所展示的代码中调用 get() 函数。 - Matt
@Matt 谢谢您的评论。错误消息是由请求以状态400:错误请求终止引起的。您有使用AND设置多个DimensionFilterClauses的示例吗?我还没有找到任何相关的示例。 - Gianluca
你应该包含error.resp.message而不仅仅是原因。最好包括完整的错误响应。我在下面发布了一个带有两个DimensionFilterClauses的示例。如果你明白了,请在这里回复。 - Matt
3个回答

13

分析报告API V4 过滤

ReportRequest接受一个DimensionFilterClauses数组。这些子句与逻辑AND运算符结合。例如,如果你有两个DimensionFilterClause对象:AB;API将仅返回符合A AND B条件的值。

每个DimensionFilterClause都需要一个DimensionFilters数组(称为filters)。这些过滤器与逻辑OR运算符结合使用。也就是说,如果您在DimensionFilterClause中有两个DimensionFilter对象CD,API将返回满足C或D的结果。

示例

以下是一个包含两个DimensionFilterClauses的请求示例:ga:adWordsCampaignID==8675309 AND ga:adwordsAdGroupID==12345 API Explorer example

{
  "reportRequests": 
  [
    {
      "viewId": "XXXX",
      "dimensions": 
      [
        {"name": "ga:adwordsCampaignID"},
        {"name": "ga:adwordsAdGroupID"},
        {"name": "ga:adwordsCriteriaID"}
      ],
      "metrics": 
      [
        {"expression": "ga:adClicks"},
        {"expression": "ga:adCost"}
      ],
      "metricFilterClauses": 
      [
        {
          "filters": 
          [
            {
              "metricName": "ga:adCost",
              "operator": "GREATER_THAN",
              "comparisonValue": "0"
            }
          ]
        }
      ],
      "dimensionFilterClauses": 
      [
        {
          "filters": 
          [
            {
              "dimensionName": "ga:adwordsCampaignID",
              "operator": "EXACT",
              "expressions": ["8675309"]
            }
          ]
        },
        {
          "filters": 
          [
            {
              "dimensionName": "ga:adwordsAdGroupID",
              "operator": "EXACT",
              "expressions": 
              ["12345"],
            }
          ]
        }
      ]
    }
  ]
}

结论

从一开始看起来,您的API请求正文似乎没有任何问题,如果有问题,您将收到错误消息。但更有可能的是,您不打算请求:

        "dimensionFilterClauses": [
            {"filters": [
                {"dimensionName": "ga:adwordsCustomerID",
                 "operator": "EXACT",
                 "expressions": ["2096809090"]},
                {"dimensionName": "ga:adTargetingType",
                 "operator": "EXACT",
                 "expressions": ["Keyword"]}
            ]}
        ],

但是您打算请求的是:
        "dimensionFilterClauses": [
            {"filters": [
                {"dimensionName": "ga:adwordsCustomerID",
                 "operator": "EXACT",
                 "expressions": ["2096809090"]},
            ]},{"filters": [
                {"dimensionName": "ga:adTargetingType",
                 "operator": "EXACT",
                 "expressions": ["Keyword"]}
            ]}
        ],

当没有数据显示时,我的建议是先删除过滤器,然后验证您正在搜索的确切字符串。如果您没有完整的字符串,可以使用不同的filter.operator,例如PARTIALBEGINS_WITH
错误处理
特别是在调试时,使用适当的错误处理是明智的。
try:
  response = analyticsreporting.reports().batchGet(
    body=requestBody
  ).execute()

except TypeError, error:
  # Handle errors in constructing a query.
  print 'There was an error in constructing your query : %s' % error

except HttpError, error:
  # Handle API errors.
  print ('There was an API error : %s : %s' %
         (error.resp.status, error.resp.reason))

更新: ga:adTargetingType==Keyword 示例

根据下方的评论,要求给出一个使用 ga:adTargetingType==Keyword 的尺寸筛选器示例。使用 API 示例 来证明它有效(只需将 VIEW_ID 更改为您的视图 ID 并点击“授权并执行”)。以下是 JSON 代码:

{
  "reportRequests": 
  [
    {
      "viewId": "VIEW_ID",
      "metrics": [{"expression": "ga:sessions"}],
      "dimensions": [{"name": "ga:adTargetingType"}],
      "dimensionFilterClauses": 
      [
        {
          "filters": 
          [
            {
              "dimensionName": "ga:adTargetingType",
              "operator": "EXACT",
              "expressions": ["Keyword"]
            }
          ]
        }
      ]
    }
  ]
}

我总是喜欢从小处开始,逐步扩大。通过删除其他参数和字段,我可以证明什么有效,什么无效。这个示例是最少需要的请求,它过滤出ga:keyword==Keyword

第二次更新:

你实际收到的错误消息如下:

"Selected dimensions and metrics cannot be queried together."

以下指标无法查询维度 ga:adTargetingType:
  • ga:impressions
  • ga:adClicks
  • ga:adCost
  • ga:CPM
  • ga:CPC
  • ga:CTR
  • ga:costPerTransaction
  • ga:costPerGoalConversion
  • ga:costPerConversion
  • ga:RPC
  • ga:ROAS

非常感谢您的帮助。我认为我在编写ga:adTargetingType维度上的筛选器时仍存在问题。您建议的查询结构完美地工作,因为我已经使用其他筛选器进行了测试。但是,如果我将运算符(如BEGINS_WITHEXACT==PARTIAL)与表达式["Keyword"]组合使用,它不会返回任何输出。在Query Explorer中,ga:adTargetingType==Keyword筛选器的等效内容是什么?后者正好返回我正在寻找的内容。 - Gianluca
@Gianluca 我已经更新了答案,并提供了一个过滤器示例,用于过滤 ga:adTargetingType==Keyword。如果您有来自请求的结果 error.resp.message,那么它可能有助于调试问题所在。 - Matt
@Gianluca 再次更新,我尝试了您的确切查询,并发现“无法查询所选维度和指标”。检查错误消息非常重要。此外,Dimensions and Metric Explorer 将向您展示哪些维度和指标可以一起查询。 - Matt
我不知道@Gianluca是否仍在SO上活跃,只有他才能将其标记为回答他的问题。但如果您在API方面遇到任何问题,请随时在此处提问或提出新问题,因为这个答案有点冗长。在SO上有许多Google Analytics专家。 - Matt
1
@JonasPalačionis,你可以尝试向dimensionFilter添加一个not布尔值,如下:{"dimensionName": "ga:adwordsCustomerID", "not": true, "operator": "EXACT", "expressions": ["<ID_TO_EXCLUDE>"]} - Matt
显示剩余4条评论

5
这个页面缺少一个重要的信息,即使用FilterLogicalOperator来组合多个维度过滤器的运算符。如果未指定,则被视为OR。因此,上面说默认是AND的答案是不正确的。
为了应用两个过滤器,我们需要在代码中添加FilterLogicalOperator。
"dimensionFilterClauses": [
            {"operator": "AND",
             "filters": [
                {"dimensionName": "ga:adwordsCustomerID",
                 "operator": "EXACT",
                 "expressions": ["2096809090"]},
                {"dimensionName": "ga:adTargetingType",
                 "operator": "EXACT",
                 "expressions": ["Keyword"]}
            ]}
        ],

0
"dimensions": 
      [
        {"name": "ga:adwordsCampaignID"},
        {"name": "ga:adwordsAdGroupID"},
        {"name": "ga:adwordsCriteriaID"}
      ],
      "metrics": 
      [
        {"expression": "ga:adClicks"},
        {"expression": "ga:adCost"}
      ],

代码将能够调用多个维度而不需要筛选。如果您想知道哪些维度和指标,请使用链接: GA 维度和指标


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接