Reputation: 2230
The following code, should be able to filter by EXACT eventCategory but it is not working. it returns all events available and of course it is a bit of a mess.
/*
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;
With the current request all I get is:
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"
}
}
Here's a redacted subset of data I'd like to receive: https://pastebin.com/L1pRgbn4
Upvotes: 3
Views: 2824
Reputation: 406
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));
Upvotes: 7