You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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));
    }
}

关键注意事项

  1. 单位转换:所有金额类指标都是以微单位返回的,必须除以1000000才能得到正常的货币数值。
  2. 空值处理:部分指标(比如conversions)如果没有数据会返回null,需要做默认值兜底。
  3. 广告类型适配:如果你的账户包含其他广告类型(比如响应式搜索广告),需要调整查询中的广告字段(比如ad_group_ad.ad.responsive_search_ad.headlines),否则会抛出字段不存在的错误。
  4. 过滤条件:加入ad_group_ad.status = ENABLED和campaign.status = ENABLED可以只获取活跃的广告和广告系列,避免无效数据。

内容的提问来源于stack exchange,提问作者Mohsin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:24:16