将过滤器与 Google Analytics 报告 API 结合使用

sat*_*hia 3 php google-api google-analytics-api google-api-php-client

以下代码应该能够按 EXACT eventCategory 进行过滤,但它不起作用。它返回所有可用的事件,当然它有点混乱。

/*

  this querystring is what I'd like to receive, I've built it with the query explorer: https://ga-dev-tools.appspot.com/query-explorer/
  ids=ga:private&
  start-date=2017-05-01&
  end-date=yesterday&
  metrics=ga:eventValue,ga:avgEventValue&
  dimensions=ga:subContinent,ga:eventCategory,ga:eventAction,ga:eventLabel&
  filters=ga:eventCategory==video
*/

// Create the DateRange object.
$dateRange = new Google_Service_AnalyticsReporting_DateRange();
$dateRange->setStartDate("3daysago");
$dateRange->setEndDate("today");


// Create the Metrics object.
$ev = new Google_Service_AnalyticsReporting_Metric();
$ev->setExpression("ga:eventValue");
$ev->setAlias("EventValue");

$avg = new Google_Service_AnalyticsReporting_Metric();
$avg->setExpression("ga:avgEventValue");
$avg->setAlias("Avg Value");

//Create the dimensions
$sc = new Google_Service_AnalyticsReporting_Dimension();
$sc->setName("ga:subContinent");

$ec = new Google_Service_AnalyticsReporting_Dimension();
$ec->setName("ga:eventCategory");

$ea = new Google_Service_AnalyticsReporting_Dimension();
$ea->setName("ga:eventAction");

$el = new Google_Service_AnalyticsReporting_Dimension();
$el->setName("ga:eventLabel");


// Create the segment dimension.
$segmentDimensions = new Google_Service_AnalyticsReporting_Dimension();
$segmentDimensions->setName("ga:segment");

// Create Dimension Filter.
$dimensionFilter = new Google_Service_AnalyticsReporting_SegmentDimensionFilter();
$dimensionFilter->setDimensionName("ga:eventCategory");
$dimensionFilter->setOperator("EXACT");
$dimensionFilter->setExpressions(array("video"));

// Create Segment Filter Clause.
$segmentFilterClause = new Google_Service_AnalyticsReporting_SegmentFilterClause();
$segmentFilterClause->setDimensionFilter($dimensionFilter);

// Create the Or Filters for Segment.
$orFiltersForSegment = new Google_Service_AnalyticsReporting_OrFiltersForSegment();
$orFiltersForSegment->setSegmentFilterClauses(array($segmentFilterClause));

// Create the Simple Segment.
$simpleSegment = new Google_Service_AnalyticsReporting_SimpleSegment();
$simpleSegment->setOrFiltersForSegment(array($orFiltersForSegment));

// Create the Segment Filters.
$segmentFilter = new Google_Service_AnalyticsReporting_SegmentFilter();
$segmentFilter->setSimpleSegment($simpleSegment);

// Create the Segment Definition.
$segmentDefinition = new Google_Service_AnalyticsReporting_SegmentDefinition();
$segmentDefinition->setSegmentFilters(array($segmentFilter));

// Create the Dynamic Segment.
$dynamicSegment = new Google_Service_AnalyticsReporting_DynamicSegment();
$dynamicSegment->setSessionSegment($segmentDefinition);
$dynamicSegment->setName("video buffering");

// Create the Segments object.
$segment = new Google_Service_AnalyticsReporting_Segment();
$segment->setDynamicSegment($dynamicSegment);


// Create the ReportRequest object.
$request = new Google_Service_AnalyticsReporting_ReportRequest();
$request->setViewId(VIEW_ID);
$request->setDateRanges(array($dateRange));
$request->setSegments(array($segment));
$request->setDimensions(array($segmentDimensions,$sc,$ec,$ea,$el));
$request->setMetrics(array($ev, $avg));

// Create the GetReportsRequest object.
$getReport = new Google_Service_AnalyticsReporting_GetReportsRequest();
$getReport->setReportRequests(array($request));

// Call the batchGet method.
$body = new Google_Service_AnalyticsReporting_GetReportsRequest();
$body->setReportRequests( array( $request) );
$response = $analyticsreporting->reports->batchGet( $body );

print_r($response);die;
Run Code Online (Sandbox Code Playgroud)

根据当前的请求,我得到的是:

Uncaught Google_Service_Exception: {
  "error": {
    "code": 400,
    "message": "Invalid JSON payload received. Unknown name \"name\" at 'report_requests[0].dimensions[1]': Proto field is not repeating, cannot start list.",
    "errors": [
      {
        "message": "Invalid JSON payload received. Unknown name \"name\" at 'report_requests[0].dimensions[1]': Proto field is not repeating, cannot start list.",
        "domain": "global",
        "reason": "badRequest"
      }
    ],
    "status": "INVALID_ARGUMENT"
  }
}
Run Code Online (Sandbox Code Playgroud)

这是我想接收的经过编辑的数据子集:https : //pastebin.com/L1pRgbn4

Dan*_*n L 7

I know this is really late to the party but I thought maybe it could help someone else... I think it's because you're going after a segment, rather than a filter, according to your code.

There's a key difference between the two:

Segment – For a segment, every visit is checked to see if it satisfies the conditions of the segment. For sessions that satisfy the condition, all rows are returned. For sessions that do not, no rows are returned.

Filter – For a filter, all the rows for ALL visits are considered, then only the rows that satisfy the conditions of the filter will be returned.

For a great answer to your question - go here.

In short, you probably need something like this:

// Create Dimension Filter.
$dimensionFilter = new 
Google_Service_AnalyticsReporting_SegmentDimensionFilter();
$dimensionFilter->setDimensionName("ga:eventCategory");
$dimensionFilter->setOperator("EXACT");
$dimensionFilter->setExpressions(array("video"));

// Create the DimensionFilterClauses
$dimensionFilterClause = new 
Google_Service_AnalyticsReporting_DimensionFilterClause();
$dimensionFilterClause->setFilters(array($dimensionFilter));

$request->setDimensionFilterClauses(array($dimensionFilterClause));
Run Code Online (Sandbox Code Playgroud)