Рубиновый клиент API Google Analytics - несколько показателей - PullRequest
0 голосов
/ 07 мая 2018

Я использую клиент 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: сеансы; ga: просмотры страниц' для параметра метрики.

1 Ответ

0 голосов
/ 09 мая 2018

Вот мое решение вместе с универсальным методом представления данных 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
...