首页 > 解决方案 > Google Analytics API ruby​​ 客户端 - 多个指标

问题描述

我正在使用 google API ruby​​ 客户端,我想实现一些更复杂的分析查询,例如本文档中建议的

https://developers.google.com/analytics/devguides/reporting/core/v3/common-queries

本文档建议可以将指标作为多个指标的逗号分隔字符串提供,但 API 客户端仅接受表达式。

如何在单个查询中查询多个指标?ruby 客户端似乎只接受通常由单个指标组成的表达式,例如会话或页面浏览量,如下所示:

metric = Google::Apis::AnalyticsreportingV4::Metric.new(expression: 'ga:sessions')

如果我删除“表达式”并输入一个指标列表,我只会得到一个错误。

度量参数的值“ga:sessions;ga:pageviews”无效。

标签: rubygoogle-apigoogle-api-client

解决方案


这是我的解决方案,以及用于报告 Google Analytics 数据的通用方法:

此答案应与https://developers.google.com/drive/v3/web/quickstart/ruby一起阅读

analytics = Google::Apis::AnalyticsreportingV4::AnalyticsReportingService.new
analytics.client_options.application_name = APPLICATION_NAME
analytics.authorization = authorize

def get_analytics_data( analytics,
                        view_id,
                        start_date: (Date.today + 1 - Date.today.wday) - 6, 
                        end_date: (Date.today + 1 - Date.today.wday),
                        metrics: ['ga:sessions'],
                        dimensions: [], 
                        order_bys: [],
                        segments: nil, # array of hashes
                        filter: nil,
                        page_size: nil ) 

  get_reports_request_object = Google::Apis::AnalyticsreportingV4::GetReportsRequest.new

  report_request_object = Google::Apis::AnalyticsreportingV4::ReportRequest.new

  report_request_object.view_id = view_id

  analytics_date_range_object = Google::Apis::AnalyticsreportingV4::DateRange.new
  analytics_date_range_object.start_date = start_date
  analytics_date_range_object.end_date = end_date

  report_request_object.date_ranges = [analytics_date_range_object]

#  report_request_metrics = []

  report_request_object.metrics = []

  metrics.each { |metric|
    analytics_metric_object = Google::Apis::AnalyticsreportingV4::Metric.new
    analytics_metric_object.expression = metric 
    report_request_object.metrics.push(analytics_metric_object) } 

#  report_request_object.metrics = report_request_metrics

  unless dimensions.empty?

     report_request_object.dimensions = []

     dimensions.each { |dimension|
        analytics_dimension_object = Google::Apis::AnalyticsreportingV4::Dimension.new
        analytics_dimension_object.name = dimension
        report_request_object.dimensions.push(analytics_dimension_object) }
  end 

  unless segments.nil?

    report_request_object.segments = []

        analytics_segment_object = Google::Apis::AnalyticsreportingV4::Segment.new
        analytics_dynamic_segment_object = Google::Apis::AnalyticsreportingV4::DynamicSegment.new
        analytics_segment_definition_object = Google::Apis::AnalyticsreportingV4::SegmentDefinition.new
        analytics_segment_filter_object = Google::Apis::AnalyticsreportingV4::SegmentFilter.new
        analytics_simple_segment_object = Google::Apis::AnalyticsreportingV4::SimpleSegment.new
        analytics_or_filters_for_segment_object = Google::Apis::AnalyticsreportingV4::OrFiltersForSegment.new         
        analytics_segment_filter_clause_object = Google::Apis::AnalyticsreportingV4::SegmentFilterClause.new
        analytics_segment_metric_filter_object = Google::Apis::AnalyticsreportingV4::SegmentMetricFilter.new

        analytics_dimension_object = Google::Apis::AnalyticsreportingV4::Dimension.new
        analytics_dimension_object.name = 'ga:segment'
        report_request_object.dimensions.push(analytics_dimension_object)

        analytics_or_filters_for_segment_object.segment_filter_clauses = []
        analytics_simple_segment_object.or_filters_for_segment = []
        analytics_segment_definition_object.segment_filters = []

    segments.each { |segment|

        analytics_segment_metric_filter_object.metric_name = segment[:metric_name]
        analytics_segment_metric_filter_object.comparison_value = segment[:comparison_value]
        analytics_segment_metric_filter_object.operator = segment[:operator]

        analytics_segment_filter_clause_object.metric_filter = analytics_segment_metric_filter_object

        analytics_or_filters_for_segment_object.segment_filter_clauses.push(analytics_segment_filter_clause_object)

        analytics_simple_segment_object.or_filters_for_segment.push(analytics_or_filters_for_segment_object)

        analytics_segment_filter_object.simple_segment = analytics_simple_segment_object

        analytics_segment_definition_object.segment_filters.push(analytics_segment_filter_object)

        analytics_dynamic_segment_object.name = segment[:name]
        analytics_dynamic_segment_object.session_segment = analytics_segment_definition_object

        analytics_segment_object.dynamic_segment = analytics_dynamic_segment_object 

        report_request_object.segments.push(analytics_segment_object) } 
  end

unless order_bys.empty?

 report_request_object.order_bys = []

 order_bys.each { |orderby|
    analytics_orderby_object = Google::Apis::AnalyticsreportingV4::OrderBy.new
    analytics_orderby_object.field_name = orderby
    analytics_orderby_object.sort_order = 'DESCENDING'
    report_request_object.order_bys.push(analytics_orderby_object)}
end

unless filter.nil?
  report_request_object.filters_expression = filter
end

unless page_size.nil?
   report_request_object.page_size = page_size 
end

get_reports_request_object.report_requests = [report_request_object]  

response = analytics.batch_get_reports(get_reports_request_object)
end

如果使用维度,您可以像这样报告数据:

response = get_analytics_data(analytics, VIEW_ID, metrics: ['ga:pageviews'], dimensions: ['ga:pagePath'], order_bys: ['ga:pageviews'], page_size: 25)

response.reports.first.data.rows.each do |row|
  puts row.dimensions
  puts row.metrics.first.values.first.to_i
  puts
end

推荐阅读