如何通过Google Ads API获取广告效果报告?已实现广告系列报告获取
解决Google Ads API获取广告级性能报告的问题
看起来你当前的核心问题是查询语句缺少性能指标(metrics)以及关联的广告系列信息——你现有的查询只获取了扩展文字广告的一个描述字段,完全没有包含你需要的点击、曝光、花费这些核心指标,也没关联广告所属的广告系列数据。下面是具体的解决方案:
第一步:修正GAQL查询语句
Google Ads API的报告依赖GAQL(Google Ads Query Language),要获取广告级的性能数据,你需要在查询中同时包含三类字段:
- 广告自身的标识/内容字段(比如广告ID、标题)
- 关联的广告系列信息(名称、货币类型)
- 所需的所有性能指标(metrics)
这里给你一个完全匹配你需求的查询示例:
SELECT campaign.name, campaign.currency_code, ad_group_ad.ad.id, ad_group_ad.ad.expanded_text_ad.headline_part1, metrics.clicks, metrics.impressions, metrics.cost_micros, metrics.average_position, metrics.average_cpc, metrics.conversions, metrics.cost_per_conversion, metrics.conversion_rate, metrics.ctr, metrics.average_cpm, metrics.interaction_rate, metrics.interactions FROM ad_group_ad WHERE ad_group_ad.status = ENABLED AND campaign.status = ENABLED
注意:
cost_micros等金额类指标是以微单位返回的(比如1PLN=1,000,000 micros),后续需要除以1e6转换成正常货币单位。
第二步:调整代码逻辑,提取目标数据
替换你的getAdsPerformance函数中的查询语句,然后在遍历结果时正确提取并转换各个字段的值:
public function getAdsPerformance($customerId) { try { // 修正后的GAQL查询 $query = 'SELECT campaign.name, campaign.currency_code, ad_group_ad.ad.id, ad_group_ad.ad.expanded_text_ad.headline_part1, metrics.clicks, metrics.impressions, metrics.cost_micros, metrics.average_position, metrics.average_cpc, metrics.conversions, metrics.cost_per_conversion, metrics.conversion_rate, metrics.ctr, metrics.average_cpm, metrics.interaction_rate, metrics.interactions FROM ad_group_ad WHERE ad_group_ad.status = ENABLED AND campaign.status = ENABLED'; $response = $this->googleAdsServiceClient->search($customerId, $query, ['pageSize' => $this->page_size]); $results = []; foreach ($response->iterateAllElements() as $googleAdsRow) { /** @var GoogleAdsRow $googleAdsRow */ $campaign = $googleAdsRow->getCampaign(); $metrics = $googleAdsRow->getMetrics(); $ad = $googleAdsRow->getAdGroupAd()->getAd(); // 处理金额类指标的单位转换(微单位转正常货币) $cost = $metrics->getCostMicros() / 1000000; $avgCpc = $metrics->getAverageCpc() / 1000000; $avgCpm = $metrics->getAverageCpm() / 1000000; $costPerConv = $metrics->getCostPerConversion() ? $metrics->getCostPerConversion() / 1000000 : 0; $results[] = [ 'campaign' => $campaign->getName(), 'currency' => $campaign->getCurrencyCode(), 'clicks' => $metrics->getClicks(), 'impressions' => $metrics->getImpressions(), 'cost' => number_format($cost, 2), 'avg_position' => $metrics->getAveragePosition(), 'avg_cpc' => number_format($avgCpc, 2), 'conversions' => $metrics->getConversions() ?? 0, 'cost/conv' => number_format($costPerConv, 2), 'conv_rate' => $metrics->getConversionRate() ? number_format($metrics->getConversionRate() * 100, 2) : 0, 'ctr' => $metrics->getCtr() ? number_format($metrics->getCtr() * 100, 2) : 0, 'avg_cpm' => number_format($avgCpm, 2), 'interaction_rate' => $metrics->getInteractionRate() ? number_format($metrics->getInteractionRate() * 100, 2) : 0, 'interactions' => $metrics->getInteractions() ?? 0, ]; } // 打印或返回结果 print "<pre>"; print_r($results); print "</pre>"; return $results; } catch (GoogleAdsException $googleAdsException) { printf( "Request with ID '%s' has failed.%sGoogle Ads failure details:%s", $googleAdsException->getRequestId(), PHP_EOL, PHP_EOL ); foreach ($googleAdsException->getGoogleAdsFailure()->getErrors() as $error) { $errorData = [ 'code' => $error->getErrorCode()->getErrorCode(), 'status' => $error->getStatus(), 'message' => $error->getMessage() ]; printf(json_encode($errorData)); } } catch (ApiException $apiException) { $errorData = [ 'code' => $apiException->getCode(), 'status' => $apiException->getStatus(), 'message' => $apiException->getBasicMessage() ]; printf(json_encode($errorData)); } }
关键注意事项
- 单位转换:所有金额类指标都是以微单位返回的,必须除以1000000才能得到正常的货币数值。
- 空值处理:部分指标(比如conversions)如果没有数据会返回null,需要做默认值兜底。
- 广告类型适配:如果你的账户包含其他广告类型(比如响应式搜索广告),需要调整查询中的广告字段(比如
ad_group_ad.ad.responsive_search_ad.headlines),否则会抛出字段不存在的错误。 - 过滤条件:加入
ad_group_ad.status = ENABLED和campaign.status = ENABLED可以只获取活跃的广告和广告系列,避免无效数据。
内容的提问来源于stack exchange,提问作者Mohsin
相关产品推荐
相关产品推荐

