คำแนะนำในการย้ายข้อมูล

คู่มือนี้มีหลักเกณฑ์ในการย้ายข้อมูล API การรายงานหลัก เวอร์ชัน 3 ไปยัง Analytics Reporting API เวอร์ชัน 4

เกริ่นนำ

หากต้องการใช้ประโยชน์จากฟีเจอร์ใหม่ ที่เปิดตัวใน Analytics Reporting API v4 ให้ย้ายข้อมูลโค้ดเพื่อใช้ API คู่มือนี้แสดงคำขอใน Core Reporting API v3 และคำขอที่เทียบเท่าใน Analytics Reporting API v4 เพื่อให้การย้ายข้อมูลง่ายขึ้น

การย้ายข้อมูล Python

หากคุณเป็นนักพัฒนาซอฟต์แวร์ Python ให้ใช้ไลบรารีศูนย์ช่วยเหลือ GAV4 บน GitHub เพื่อแปลงคำขอ Google Analytics Core Reporting API v3 เป็นคำขอ Analytics Reporting API v4

ปลายทาง

Core Reporting API v3 และ Analytics Reporting API v4 มีปลายทางและเมธอด HTTP ที่ต่างกัน ดังนี้

ปลายทาง v3

GET https://www.googleapis.com/analytics/v3/data/ga

ปลายทาง v4

POST https://analyticsreporting.googleapis.com/v4/reports:batchGet

ตัวอย่างต่อไปนี้จะเปรียบเทียบคำขอใน v3 และคำขอที่เทียบเท่าในเวอร์ชัน 4

v3

เอกสารอ้างอิง V3

GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
    &start-date=2015-11-01&end-date=2015-11-06 \
    &metrics=ga:users&dimensions=ga:pagePath

v4

เอกสารอ้างอิง V4

POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
  "reportRequests":[
  {
    "viewId":"XXXX",
    "dateRanges":[
    {
      "startDate":"2015-11-01",
      "endDate":"2015-11-06"
    }],
    "metrics":[
    {
      "expression":"ga:users"
    }],
    "dimensions": [
    {
      "name":"ga:pagePath"
    }]
  }]
}

ไลบรารีของไคลเอ็นต์และบริการการค้นพบ

หากใช้ Python, JavaScript หรือไลบรารีของไคลเอ็นต์อื่นๆ ที่ใช้บริการค้นพบของ Google คุณต้องระบุตำแหน่งของเอกสารการค้นพบสำหรับ Reporting API v4

Python

from apiclient import discovery

...

# Build the Analytics Reporting API v4 authorized service object.
analyticsReporting = discovery.build(
  'analyticsreporting',
  'v4',
  http=http,
  discoveryServiceUrl='https://analyticsreporting.googleapis.com/$discovery/rest')

JavaScript

gapi.client.load(
  'https://analyticsreporting.googleapis.com/$discovery/rest',
  'v4'
).then(...)

ไลบรารีของไคลเอ็นต์ Java และ PHP สร้างขึ้นไว้ล่วงหน้า แต่คุณสามารถใช้บริการการค้นพบและโปรแกรมสร้าง Google APIs เพื่อสร้างไลบรารีดังกล่าวได้

คำขอ

ข้อมูลอ้างอิง API v4 อธิบายโครงสร้างของเนื้อหาคำขอโดยละเอียด ส่วนต่อไปนี้จะอธิบายการย้ายข้อมูลพารามิเตอร์คำขอ v3 ไปยังพารามิเตอร์คำขอ v4

ดูรหัส

ใน v3 พารามิเตอร์ ids ที่ยอมรับ "รหัสตาราง" จะอยู่ในรูปแบบ ga:XXXX โดยที่ XXXX คือรหัสข้อมูลพร็อพเพอร์ตี้ (โปรไฟล์) ใน v4 จะมีการระบุรหัสข้อมูลพร็อพเพอร์ตี้ (โปรไฟล์) ในช่อง viewId ในเนื้อหาคำขอ

ตัวอย่างต่อไปนี้จะเปรียบเทียบพารามิเตอร์ ids ในคำขอ v3 กับช่อง viewId ในคำขอ v4

v3

GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX

v4

POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
  "reportRequests":[
  {
    "viewId":"XXXX",
    ...
  }]
}

ช่วงวันที่

Analytics Reporting API v4 ช่วยให้คุณระบุช่วงวันที่ได้หลายช่วงในคำขอเดียว ช่อง dateRanges จะใช้รายการออบเจ็กต์ DateRange ใน v3 คุณใช้พารามิเตอร์ start-date และ end-date เพื่อระบุช่วงวันที่ในคำขอ

ตัวอย่างต่อไปนี้จะเปรียบเทียบพารามิเตอร์ start-date และ end-date ในคำขอ v3 กับช่อง dateRanges ในคำขอ v4

v3

GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
    &start-date=2015-11-01&end-date=2015-11-06 \
    ...

v4

POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
  "reportRequests":[
  {
    "viewId":"XXXX",
    "dateRanges":[
    {
      "startDate":"2015-11-01",
      "endDate":"2015-11-06"
    }],
    ....
  }]
}

เมตริก

พารามิเตอร์ metrics v3 สอดคล้องกับช่อง metrics v4 ที่ใช้รายการออบเจ็กต์เมตริก

ตัวอย่างต่อไปนี้จะเปรียบเทียบพารามิเตอร์ metrics ในคำขอ v3 กับช่อง metrics ในคำขอ v4

v3

GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
    &start-date=2015-11-01&end-date=2015-11-06 \
    &metrics=ga:users,ga:sessions \
    ...

v4

POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
  "reportRequests":[
  {
    "viewId":"XXXX",
    "dateRanges":[
    {
      "startDate":"2015-11-01",
      "endDate":"2015-11-06"
    }],
    "metrics":[
    {
      "expression":"ga:users"
    },{
      "expression":"ga:sessions"
    }],
    ...
  }]
}

ขนาด

พารามิเตอร์ dimensions v3 สอดคล้องกับช่อง dimensions v4 ที่ใช้รายการออบเจ็กต์มิติข้อมูล

ตัวอย่างต่อไปนี้จะเปรียบเทียบพารามิเตอร์ dimensions ในคำขอ v3 กับช่อง dimensions ในคำขอ v4

v3

GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
  &dimensions=ga:country,ga:browser&... \

v4

POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
  "reportRequests":[
  {
    ...
    "dimensions": [
    {
      "name":"ga:country"
    },{
      "name":"ga:browser"
    }],
    ...
  }]
}

กำลังจัดเรียง

พารามิเตอร์ sort v3 เทียบเท่ากับช่อง v4 orderBys ที่จะใช้รายการออบเจ็กต์ OrderBy

ใน v4 หากต้องการจัดเรียงผลลัพธ์ตามค่ามิติข้อมูลหรือเมตริก ให้ทำดังนี้

  • ระบุชื่อหรือชื่อแทนในช่องfieldName
  • ระบุลำดับการจัดเรียง (ASCENDING หรือ DESCENDING) ผ่านช่อง sortOrder

ตัวอย่างต่อไปนี้จะเปรียบเทียบพารามิเตอร์ sort ในคำขอ v3 กับช่อง orderBy ในคำขอ v4 ทั้ง 2 แบบจะจัดเรียงผู้ใช้ตามลำดับตัวอักษรจากมากไปน้อยและแหล่งที่มา

v3

GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
  &sort=-ga:users,ga:source

v4

POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
  "reportRequests":[
  {
    ...
    "orderBys": [
    {
      "fieldName": "ga:users",
      "sortOrder": "DESCENDING"
    },{
      "fieldName": "ga:source"
    }],
  }]
}

ระดับการสุ่มตัวอย่าง

พารามิเตอร์ samplingLevel v3 สอดคล้องกับช่อง v4 samplingLevel ใน v3 ค่า samplingLevel ที่ยอมรับคือ FASTER, HIGHER_PRECISION และ DEFAULT และใน v4 ค่า samplingLevel ที่ยอมรับคือ SMALL, LARGE และ DEFAULT โปรดทราบว่า FASTER ใน v3 ได้เปลี่ยนเป็น SMALL ใน v4 และ HIGHER_PRECISION เป็น LARGE

ตัวอย่างต่อไปนี้จะเปรียบเทียบพารามิเตอร์ samplingLevel ในคำขอ v3 กับช่อง samplingLevel ในคำขอ v4

v3

https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX ...\
samplingLevel=HIGHER_PRECISION

v4

POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
  "reportRequests":[
  {
    ...
    "samplingLevel": "LARGE"
  }]
}

กลุ่ม

พารามิเตอร์ segment v3 จะสอดคล้องกับช่อง v4 segments ที่ใช้รายการออบเจ็กต์กลุ่ม

รหัสกลุ่ม

ใน v4 หากต้องการขอกลุ่มตามรหัสกลุ่ม ให้สร้างออบเจ็กต์ Segment และระบุรหัสผ่านช่อง segmentId

ตัวอย่างต่อไปนี้จะเปรียบเทียบพารามิเตอร์ segment ในคำขอ v3 กับช่อง segments ในคำขอ v4

v3

GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
&segment=gaid::-11

v4

POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
  "reportRequests": [{
    ...
    "viewId": "XXXX",
    "segments": [{
      "segmentId": "gaid::-11"
    }]
  }]
}

กลุ่มแบบไดนามิก

ใน v4 ให้ใช้ช่อง segments ที่มีออบเจ็กต์ DynamicSegment เพื่อแสดงการกำหนดกลุ่มที่ซับซ้อนมากขึ้น

ตัวอย่างต่อไปนี้จะเปรียบเทียบพารามิเตอร์ segment ในคำขอ v3 กับช่อง segments ที่มีออบเจ็กต์ DynamicSegment ในคำขอ v4

v3

GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
&segment=sessions::condition::ga:medium==referral

v4

POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
  "reportRequests": [{
    ...
    "segments": [{
      "dynamicSegment": {
        "name": "segment_name",
        "sessionSegment": {
          "segmentFilters": [{
            "simpleSegment": {
              "orFiltersForSegment": [{
                "segmentFilterClauses": [{
                  "dimensionFilter": {
                    "dimensionName": "ga:medium",
                    "operator": "EXACT",
                    "expressions": [ "referral" ]
                  }
                }]
              }]
            }
          }]
        }
      }
    }]
  }]
}

คุณสามารถรวมเงื่อนไขและลำดับไว้ในกลุ่มได้ ดังนี้

v3

GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
&segment=users::condition::ga:revenue>10;sequence::ga:deviceCategory==desktop->>ga:deviceCategory==mobile

v4

  "reportRequests": [{
      "dateRanges": [
            { "endDate": "2014-11-30", "startDate": "2014-11-01" }
      ],
      "metrics": [
          {"expression": "ga:pageviews"},
          {"expression": "ga:sessions"}
      ],
      "viewId": "XXXX",
      "dimensions":[{"name":"ga:medium"}, {"name":"ga:segment"}],
      "segments": [{
        "dynamicSegment": {
        "name": "segment_name",
        "userSegment": {
          "segmentFilters": [{
            "simpleSegment": {
              "orFiltersForSegment": [{
                "segmentFilterClauses": [{
                  "metricFilter": {
                    "metricName": "ga:sessions",
                    "operator": "GREATER_THAN",
                    "comparisonValue": "10"
                  }
                }]
              }]
            }
          },
          {
            "sequenceSegment": {
              "segmentSequenceSteps": [{
                "orFiltersForSegment": [{
                  "segmentFilterClauses": [{
                    "dimensionFilter": {
                      "dimensionName": "ga:deviceCategory",
                      "operator": "EXACT",
                      "expressions": ["desktop"]
                    }
                  }]
                }],
                "matchType": "PRECEDES"
              },{
                "orFiltersForSegment": [{
                  "segmentFilterClauses": [{
                    "dimensionFilter": {
                      "dimensionName": "ga:deviceCategory",
                      "operator": "EXACT",
                      "expressions": ["mobile"]
                    }
                  }]
                }]
              }]
            }
          }]
        }
      }
    }]
  }]

ไวยากรณ์กลุ่ม v3 ใน v4

ช่อง segmentId ใน API v4 รองรับไวยากรณ์ของกลุ่มใน API v3

ตัวอย่างต่อไปนี้แสดงวิธีที่ช่อง segmentId ในคำขอที่เทียบเท่าใน v4 รองรับพารามิเตอร์ segment ในคำขอ v3

v3

GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
&segment=sessions::condition::ga:medium==referral

v4

POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
  "reportRequests": [{
    ...
    "viewId": "XXXX",
    "segments": [{
      "segmentId": "sessions::condition::ga:medium==referral"
    }]
  }]
}

ฟิลเตอร์

v4 ใช้ dimensionFilterClauses ในการกรองมิติข้อมูลและ metricFilterClauses เพื่อกรองเมตริก dimensionFilterClauses มีรายการออบเจ็กต์ DimensionFilter และ metricFilterClauses มีรายการออบเจ็กต์ MetricFilter

ตัวอย่างต่อไปนี้จะเปรียบเทียบพารามิเตอร์ filters ในคำขอ v3 กับช่อง dimensionFilterClauses ในคำขอ v4

v3

GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
  &start-date=2015-06-01&end-date=2015-07-31&metrics=ga:users& \
  dimensions=ga:browser&filters=ga:browser==Firefox

v4

  "reportRequests": [{
      "dateRanges": [
            { "endDate": "2014-11-30", "startDate": "2014-11-01" }
      ],
      "metrics": [
          {"expression": "ga:pageviews"},
          {"expression": "ga:sessions"}
      ],
      "viewId": "XXXX",
      "dimensions":[{"name":"ga:browser"}, {"name":"ga:country"}],
      "dimensionFilterClauses": [{
           "filters": [{
                "dimension_name": "ga:browser",
                "operator": "EXACT",
                "expressions": ["Firefox"]
            }]
      }]
  }]

ไวยากรณ์ตัวกรอง v3 ใน v4

แม้ว่าช่อง filtersExpression ใน v4 จะรองรับไวยากรณ์ filters ใน v3 ให้ใช้ dimensionFilterClauses และ metricFilterClauses เพื่อกรองมิติข้อมูลและเมตริก

ตัวอย่างต่อไปนี้แสดงวิธีที่ช่อง filtersExpression ในคำขอที่เทียบเท่าใน v4 รองรับพารามิเตอร์ filters ในคำขอ v3

v3

GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga%XXXX \
&filters=ga:browser==Firefox

v4

POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
  "reportRequests": [{
    ...
    "filtersExpression": "ga:browser==Firefox"
  }]
}

แถวว่าง

พารามิเตอร์ include-empty-rows v3 สอดคล้องกับช่อง includeEmptyRows ใน v4 พารามิเตอร์ v3 มีค่าเริ่มต้นเป็น true ขณะที่ใน v4 ช่องจะใช้ค่าเริ่มต้นเป็น false หากไม่ได้กำหนดค่าใน v3 คุณจะต้องตั้งค่า เป็น true ใน v4

ตัวอย่างต่อไปนี้จะเปรียบเทียบพารามิเตอร์ include-empty-rows ในคำขอ v3 กับช่อง includeEmptyRows ในคำขอ v4

v3

https://www.googleapis.com/analytics/v3/data/ga? ...\
    &include-empty-rows=true

v4

POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
  "reportRequests":[
  {
    ...
    "includeEmptyRows": "true",
  }]
}

การใส่เลขหน้า

v4 ใช้ช่อง pageToken และ pageSize เพื่อใส่เลขหน้าผ่านผลการค้นหาจำนวนมาก ได้รับ pageToken จากพร็อพเพอร์ตี้ nextPageToken ของออบเจ็กต์การตอบกลับ

ตัวอย่างต่อไปนี้จะเปรียบเทียบพารามิเตอร์ start-index และ max-results ในคำขอ v3 กับช่อง pageToken และ pageSize ในคำขอ v4

v3

https://www.googleapis.com/analytics/v3/data/ga? ...\
    &start-index=10001&max-results=10000

v4

POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
  "reportRequests":[
  {
    ...
    # Taken from `nextPageToken` of a previous response.
    "pageToken": "10000",
    "pageSize": "10000",
  }]
}

พารามิเตอร์มาตรฐาน

Analytics Reporting API v4 รองรับพารามิเตอร์การค้นหามาตรฐานส่วนใหญ่ใน API v3 ยกเว้นพารามิเตอร์ userIp และ callback

ตัวอย่างต่อไปนี้จะเปรียบเทียบพารามิเตอร์ quotaUser ในคำขอ v3 กับพารามิเตอร์นั้นในคำขอ v4

ปลายทาง v3

GET https://www.googleapis.com/analytics/v3/data/ga?quotaUser=1X3F2F2

ปลายทาง v4

POST https://analyticsreporting.googleapis.com/v4/reports:batchGet?quotaUser=1X3F2F2

การตอบกลับ

เนื่องจาก V4 ช่วยให้คุณส่งออบเจ็กต์ ReportRequest หลายรายการในคําขอ HTTP รายการเดียว คุณจึงได้รับอาร์เรย์ของออบเจ็กต์รายงานในการตอบสนอง สำหรับทุก ReportRequest ที่ส่ง คุณจะได้รับ Report ที่เกี่ยวข้องในการตอบสนอง

รายงาน

รายงาน v4 มีช่องระดับบนสุด 3 ช่อง ได้แก่ columnHeader, data และ nextPageToken

เนื่องจากตัวการตอบกลับ V4 ไม่ได้รวมการตอบสนองต่อพารามิเตอร์การค้นหาทั้งหมดเหมือนกับการตอบกลับ v3 แอปพลิเคชันไคลเอ็นต์จึงต้องเพิ่มพารามิเตอร์นั้นไปยัง ReportRequest เพื่อรับการตอบสนองต่อพารามิเตอร์การค้นหาที่เฉพาะเจาะจง

เราได้ระบุ nextPageToken ในส่วนการใส่เลขหน้าไปแล้ว ตอนนี้เรามาดูออบเจ็กต์ columnHeader กันก่อน

ส่วนหัวของคอลัมน์

ส่วนหัวของคอลัมน์ประกอบด้วยรายการ มิติข้อมูล ที่มีชื่อและออบเจ็กต์ MetricHeader ซึ่งมีรายการออบเจ็กต์ MetricHeaderEntry แต่ละออบเจ็กต์ MetricHeaderEntry ระบุเมตริก name และ type (สกุลเงิน เปอร์เซ็นต์ ฯลฯ) ซึ่งจะช่วยจัดรูปแบบเอาต์พุต

ตัวอย่างต่อไปนี้จะเปรียบเทียบช่อง columnHeaders ในการตอบกลับ v3 กับช่อง columnHeader ในการตอบสนอง v4

v3

"columnHeaders": [
    {
        "name":"ga:source",
        "columnType":"DIMENSION",
        "dataType":"STRING"
    },{
        "name":"ga:city",
        "columnType":"DIMENSION",
        "dataType":"STRING"
    },{
        "name":"ga:sessions",
        "columnType":"METRIC",
        "dataType":"INTEGER"
    },{
        "name":"ga:pageviews",
        "columnType":
        "METRIC",
        "dataType":"INTEGER"
    }
]

v4

"columnHeader": {
    "dimensions": [
        "ga:source",
        "ga:city"
    ],
    "metricHeader": {
        "metricHeaderEntries": [
            {
                "name": "ga:pageviews",
                "type": "INTEGER"
            },
            {
                "name": "ga:sessions",
                "type": "INTEGER"
            }
        ]
    }
},

แถวรายงาน

Core Reporting API v3 จะแสดงข้อมูลรายงานในอาร์เรย์ rows ซึ่งมีมิติข้อมูลและเมตริกที่ขอ

Analytics Reporting API v4 จะแสดงผลข้อมูลรายงานในออบเจ็กต์ ReportRow ซึ่งมีอาร์เรย์ของมิติข้อมูลและอาร์เรย์ของออบเจ็กต์ DateRangeValues โดยแต่ละช่วงมีช่วงวันที่ 1 หรือ 2 ช่วงตามแผนภาพต่อไปนี้

แถวรายงาน

แถว

v3

"rows": [
    [
        "google",
        "Philadelphia",
        "60",
        "5"
    ],
    [
        "google",
        "Johnstown",
        "21",
        "1"
    ],
    [
        "google",
        "Progress",
        "7",
        "1"
    ]
],

v4

"rows": [
    {
        "dimensions": [
            "google",
            "Philadelphia"
        ],
        "metrics": [
            {
                "values": [
                    "60",
                    "5"
                ]
            }
        ]
    },
    {
        "dimensions": [
            "google",
            "Johnstown"
        ],
        "metrics": [
            {
                "values": [
                    "21",
                    "1"
                ]
            }
        ]
    },
    {
        "dimensions": [
            "google",
            "Progress"
        ],
        "metrics": [
            {
                "values": [
                    "7",
                    "1"
                ]
            }
        ]
    }
],

ข้อมูลที่สุ่มตัวอย่างมา

หากผลลัพธ์ได้รับการสุ่มตัวอย่าง Core Reporting API v3 จะแสดงช่องบูลีน containsSampledData ซึ่งตั้งค่าเป็น true

Analytics Reporting API v4 จะไม่แสดงบูลีนหากข้อมูลเป็นการสุ่มตัวอย่าง แต่ API จะแสดงผลช่อง samplesReadCounts และ samplingSpaceSizes หากผลลัพธ์ไม่ได้มาจากการสุ่มตัวอย่าง ระบบจะไม่กำหนดฟิลด์เหล่านี้ ตัวอย่าง Python ต่อไปนี้แสดงวิธีคํานวณว่ารายงานมีข้อมูลตัวอย่างหรือไม่

def ContainsSampledData(report):
  """Determines if the report contains sampled data.

   Args:
       report (Report): An Analytics Reporting API v4 response report.

  Returns:
      bool: True if the report contains sampled data.
  """
  report_data = report.get('data', {})
  sample_sizes = report_data.get('samplesReadCounts', [])
  sample_spaces = report_data.get('samplingSpaceSizes', [])
  if sample_sizes and sample_spaces:
    return True
  else:
    return False

ด้านล่างคือตัวอย่างการตอบกลับซึ่งมีข้อมูลที่สุ่มตัวอย่างจากคำขอที่มีช่วงวันที่ 2 ช่วง ผลลัพธ์คำนวณจากตัวอย่างเกือบ 500,000 รายการของขนาดพื้นที่การสุ่มตัวอย่างประมาณ 15 ล้านเซสชัน ดังนี้

{
  "reports":
  [
    {
      "columnHeader": {
        ...
      },
      "data": {
        ...
        "samplesReadCounts": [ "499630","499630"],
        "samplingSpaceSizes": ["15328013","15328013"],
      }
    }
  ]
}

การแยกวิเคราะห์การตอบกลับ V4

โค้ดตัวอย่างต่อไปนี้จะแยกวิเคราะห์และพิมพ์การตอบกลับ Analytics Reporting API v4

Python

def printResponse(self, response):
  """Parses and prints the Analytics Reporting API v4 response"""

  for report in response.get('reports', []):
    columnHeader = report.get('columnHeader', {})
    dimensionHeaders = columnHeader.get('dimensions', [])
    metricHeaders = columnHeader.get('metricHeader', {}).get('metricHeaderEntries', [])
    rows = report.get('data', {}).get('rows', [])

    for row in rows:
      dimensions = row.get('dimensions', [])
      dateRangeValues = row.get('metrics', [])

      for header, dimension in zip(dimensionHeaders, dimensions):
        print header + ': ' + dimension

      for i, values in enumerate(dateRangeValues):
        print 'Date range (' + str(i) + ')'
        for metricHeader, value in zip(metricHeaders, values.get('values')):
          print metricHeader.get('name') + ': ' + value

Java

public static void printResponse(GetReportsResponse response) {

  for (Report report: response.getReports()) {
    ColumnHeader header = report.getColumnHeader();
    List<String> dimensionHeaders = header.getDimensions();
    List<MetricHeaderEntry> metricHeaders = header.getMetricHeader().getMetricHeaderEntries();
    List<ReportRow> rows = report.getData().getRows();

    for (ReportRow row: rows) {
      List<String> dimensions = row.getDimensions();
      List<DateRangeValues> metrics = row.getMetrics();
      for (int i = 0; i < dimensionHeaders.size() && i < dimensions.size(); i++) {
        System.out.println(dimensionHeaders.get(i) + ": " + dimensions.get(i));
      }

      for (int j = 0; j < metrics.size(); j++) {
        System.out.print("Date Range (" + j + "): ");
        DateRangeValues values = metrics.get(j);
        for (int k = 0; k < values.size() && k < metricHeaders.size(); k++) {
          System.out.println(metricHeaders.get(k).getName() + ": " + values.get(k));
        }
      }
    }
  }
}

การจัดการข้อผิดพลาด

เนื่องจากรูปแบบการตอบสนองต่อข้อผิดพลาดใน v4 แตกต่างจากใน v3 โปรดอัปเดตโค้ดให้จัดการการตอบกลับข้อผิดพลาด v4

ตัวอย่างต่อไปนี้จะเปรียบเทียบการตอบกลับข้อผิดพลาดใน v3 และการตอบกลับข้อผิดพลาดที่เทียบเท่าใน v4

v3

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "insufficientPermissions",
    "message": "User does not have sufficient permissions for this profile.",

   }
  ],
  "code": 403,
  "message": "User does not have sufficient permissions for this profile."
 }
}

v4

{
 "error": {
  "code": 403,
  "message": "User does not have sufficient permissions for this profile.",
  "status": "PERMISSION_DENIED",
  "details": [
   {
    "@type": "type.googleapis.com/google.rpc.DebugInfo",
    "detail": "[ORIGINAL ERROR] generic::permission_denied: User does not have sufficient permissions for this profile. [google.rpc.error_details_ext] { message: \"User does not have sufficient permissions for this profile.\" }"
   }
  ]
 }
}