Page Summary
-
This code example gets a list of which resources have been changed in your account in the last 14 days.
-
The example demonstrates how to construct a query to find information about changed resources using
change_status. -
It iterates over the results and prints details about each changed resource, including the last change date/time, resource type, resource name, and resource status.
-
The example also includes a helper function to determine the specific resource name based on the resource type.
Java
// Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package com.google.ads.googleads.examples.accountmanagement ; import com.beust.jcommander.Parameter ; import com.google.ads.googleads.examples.utils.ArgumentNames ; import com.google.ads.googleads.examples.utils.CodeSampleParams ; import com.google.ads.googleads.lib.GoogleAdsClient ; import com.google.ads.googleads.v22.errors.GoogleAdsError ; import com.google.ads.googleads.v22.errors.GoogleAdsException ; import com.google.ads.googleads.v22.resources.ChangeStatus ; import com.google.ads.googleads.v22.services.GoogleAdsRow ; import com.google.ads.googleads.v22.services.GoogleAdsServiceClient ; import com.google.ads.googleads.v22.services.GoogleAdsServiceClient.SearchPagedResponse ; import java.io.FileNotFoundException ; import java.io.IOException ; import java.util.Optional ; /** Gets the changes in the account made in the last 7 days. */ public class GetChangeSummary { private static class GetAccountChangesParams extends CodeSampleParams { @Parameter ( names = ArgumentNames . CUSTOMER_ID , required = true ) private Long customerId ; } public static void main ( String [] args ) { GetAccountChangesParams params = new GetAccountChangesParams (); if ( ! params . parseArguments ( args )) { // Either pass the required parameters for this example on the command line, or insert them // into the code here. See the parameter class definition above for descriptions. params . customerId = Long . parseLong ( "INSERT_CUSTOMER_ID_HERE" ); } GoogleAdsClient googleAdsClient = null ; try { googleAdsClient = GoogleAdsClient . newBuilder (). fromPropertiesFile (). build (); } catch ( FileNotFoundException fnfe ) { System . err . printf ( "Failed to load GoogleAdsClient configuration from file. Exception: %s%n" , fnfe ); System . exit ( 1 ); } catch ( IOException ioe ) { System . err . printf ( "Failed to create GoogleAdsClient. Exception: %s%n" , ioe ); System . exit ( 1 ); } try { new GetChangeSummary (). runExample ( googleAdsClient , params . customerId ); } catch ( GoogleAdsException gae ) { // GoogleAdsException is the base class for most exceptions thrown by an API request. // Instances of this exception have a message and a GoogleAdsFailure that contains a // collection of GoogleAdsErrors that indicate the underlying causes of the // GoogleAdsException. System . err . printf ( "Request ID %s failed due to GoogleAdsException. Underlying errors:%n" , gae . getRequestId ()); int i = 0 ; for ( GoogleAdsError googleAdsError : gae . getGoogleAdsFailure (). getErrorsList ()) { System . err . printf ( " Error %d: %s%n" , i ++ , googleAdsError ); } System . exit ( 1 ); } } /** * Runs the example. * * @param googleAdsClient the client instance. * @param customerId the customerId for which to retrieve change status. */ private void runExample ( GoogleAdsClient googleAdsClient , long customerId ) { String query = "SELECT change_status.resource_name, " + "change_status.last_change_date_time, " + "change_status.resource_status, " + "change_status.resource_type, " + "change_status.ad_group, " + "change_status.ad_group_ad, " + "change_status.ad_group_bid_modifier, " + "change_status.ad_group_criterion, " + "change_status.campaign, " + "change_status.campaign_criterion, " + "FROM change_status " + "WHERE change_status.last_change_date_time DURING LAST_14_DAYS " + "ORDER BY change_status.last_change_date_time " + "LIMIT 10000" ; try ( GoogleAdsServiceClient client = googleAdsClient . getLatestVersion (). createGoogleAdsServiceClient ()) { SearchPagedResponse response = client . search ( String . valueOf ( customerId ), query ); for ( GoogleAdsRow row : response . iterateAll ()) { Optional<String> resourceNameOfChangedEntity = getResourceNameForResourceType ( row . getChangeStatus ()); System . out . printf ( "On '%s', change status '%s' shows a resource type of '%s' " + "with resource name '%s' was '%s'.%n" , row . getChangeStatus (). getLastChangeDateTime (), row . getChangeStatus (). getResourceName (), row . getChangeStatus (). getResourceType (). name (), resourceNameOfChangedEntity . orElse ( "" ), row . getChangeStatus (). getResourceStatus (). name ()); } } } /** * Each returned row contains all possible changed fields. This function returns the resource name * of the changed field based on the resource type. The changed field's parent is also populated * but is not used. * * @param changeStatus the change status for which to get affected resource name. * @return an Optional has a value when one could be obtained for the change resource type. */ private static Optional<String> getResourceNameForResourceType ( ChangeStatus changeStatus ) { String resourceName = null ; // This is the list of all known resource names but may be subject to change in the future. // See https://developers.google.com/google-ads/api/docs/change-status for a description. switch ( changeStatus . getResourceType ()) { case AD_GROUP : resourceName = changeStatus . getAdGroup (); break ; case AD_GROUP_AD : resourceName = changeStatus . getAdGroupAd (); break ; case AD_GROUP_BID_MODIFIER : resourceName = changeStatus . getAdGroupBidModifier (); break ; case AD_GROUP_CRITERION : resourceName = changeStatus . getAdGroupCriterion (); break ; case CAMPAIGN : resourceName = changeStatus . getCampaign (); break ; case CAMPAIGN_CRITERION : resourceName = changeStatus . getCampaignCriterion (); break ; } return Optional . ofNullable ( resourceName ); } }
C#
// Copyright 2019 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. using CommandLine ; using Google.Ads.Gax.Examples ; using Google.Ads.GoogleAds.Lib ; using Google.Ads.GoogleAds.V22.Errors ; using Google.Ads.GoogleAds.V22.Services ; using Google.Api.Gax ; using System ; using System.Collections.Generic ; using static Google . Ads . GoogleAds . V22 . Enums . ChangeStatusResourceTypeEnum . Types ; namespace Google.Ads.GoogleAds.Examples.V22 { /// <summary> /// This code example gets a list of which resources have been changed in your account /// in the last 14 days. /// </summary> public class GetChangeSummary : ExampleBase { /// <summary> /// Command line options for running the <see cref="GetChangeSummary"/> example. /// </summary> public class Options : OptionsBase { /// <summary> /// The Google Ads customer ID for which the call is made. /// </summary> [Option("customerId", Required = true, HelpText = "The Google Ads customer ID for which the call is made.")] public long CustomerId { get ; set ; } } /// <summary> /// Main method, to run this code example as a standalone application. /// </summary> /// <param name="args">The command line arguments.</param> public static void Main ( string [] args ) { Options options = ExampleUtilities . ParseCommandLine<Options> ( args ); GetChangeSummary codeExample = new GetChangeSummary (); Console . WriteLine ( codeExample . Description ); codeExample . Run ( new GoogleAdsClient (), options . CustomerId ); } /// <summary> /// Returns a description about the code example. /// </summary> public override string Description = > "This example gets a list of which resources have been changed in your account." ; /// <summary> /// Runs the code example. /// </summary> /// <param name="client">The Google Ads client.</param> /// <param name="customerId">The Google Ads customer ID for which the call is made.</param> public void Run ( GoogleAdsClient client , long customerId ) { // Get the GoogleAdsService. GoogleAdsServiceClient googleAdsService = client . GetService ( Services . V22 . GoogleAdsService ); string searchQuery = @" SELECT change_status.resource_name, change_status.last_change_date_time, change_status.resource_type, change_status.campaign, change_status.ad_group, change_status.resource_status, change_status.ad_group_ad, change_status.ad_group_criterion, change_status.campaign_criterion FROM change_status WHERE change_status.last_change_date_time DURING LAST_14_DAYS ORDER BY change_status.last_change_date_time LIMIT 10000" ; // Create a request that will retrieve all changes. SearchGoogleAdsRequest request = new SearchGoogleAdsRequest () { Query = searchQuery , CustomerId = customerId . ToString () }; try { // Issue the search request. PagedEnumerable<SearchGoogleAdsResponse , GoogleAdsRow > searchPagedResponse = googleAdsService . Search ( request ); // Iterate over all rows in all pages and prints the requested field values for the // campaign in each row. foreach ( GoogleAdsRow googleAdsRow in searchPagedResponse ) { Console . WriteLine ( "Last change: {0}, Resource type: {1}, " + "Resource name: {2}, Resource status: {3}, Specific resource name: {4}" , googleAdsRow . ChangeStatus . LastChangeDateTime , googleAdsRow . ChangeStatus . ResourceType , googleAdsRow . ChangeStatus . ResourceName , googleAdsRow . ChangeStatus . ResourceStatus , SpecificResourceName ( googleAdsRow . ChangeStatus . ResourceType , googleAdsRow )); } } catch ( GoogleAdsException e ) { Console . WriteLine ( "Failure:" ); Console . WriteLine ( $"Message: {e.Message}" ); Console . WriteLine ( $"Failure: {e.Failure}" ); Console . WriteLine ( $"Request ID: {e.RequestId}" ); throw ; } } /// <summary> /// Return the name of the most specific resource that changed. /// </summary> /// <param name="resourceType">Type of the resource.</param> /// <param name="row">Each returned row contains all possible changed fields</param> /// <returns>The resource name of the changed field based on the resource type. /// The changed field's parent is also populated, but is not used.</returns> private string SpecificResourceName ( ChangeStatusResourceType resourceType , GoogleAdsRow row ) { string resourceName ; switch ( resourceType ) { case ChangeStatusResourceType . AdGroup : resourceName = row . ChangeStatus . AdGroup ; break ; case ChangeStatusResourceType . AdGroupAd : resourceName = row . ChangeStatus . AdGroupAd ; break ; case ChangeStatusResourceType . AdGroupCriterion : resourceName = row . ChangeStatus . AdGroupCriterion ; break ; case ChangeStatusResourceType . Campaign : resourceName = row . ChangeStatus . Campaign ; break ; case ChangeStatusResourceType . CampaignCriterion : resourceName = row . ChangeStatus . CampaignCriterion ; break ; case ChangeStatusResourceType . Unknown : case ChangeStatusResourceType . Unspecified : default : resourceName = "" ; break ; } return resourceName ; } } }
PHP
< ?php /** * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace Google\Ads\GoogleAds\Examples\AccountManagement; require __DIR__ . '/../../vendor/autoload.php'; use GetOpt\GetOpt; use Google\Ads\GoogleAds\Examples\Utils\ArgumentNames; use Google\Ads\GoogleAds\Examples\Utils\ArgumentParser; use Google\Ads\GoogleAds\Lib\V22\GoogleAdsClient; use Google\Ads\GoogleAds\Lib\V22\GoogleAdsClientBuilder; use Google\Ads\GoogleAds\Lib\V22\GoogleAdsException; use Google\Ads\GoogleAds\Lib\OAuth2TokenBuilder; use Google\Ads\GoogleAds\V22\Enums\ChangeStatusOperationEnum\ChangeStatusOperation; use Google\Ads\GoogleAds\V22\Enums\ChangeStatusResourceTypeEnum\ChangeStatusResourceType; use Google\Ads\GoogleAds\V22\Errors\GoogleAdsError; use Google\Ads\GoogleAds\V22\Resources\ChangeStatus; use Google\Ads\GoogleAds\V22\Services\GoogleAdsRow; use Google\Ads\GoogleAds\V22\Services\SearchGoogleAdsRequest; use Google\ApiCore\ApiException; /** * This example gets a list of which resources have been changed in your account. */ class GetChangeSummary { private const CUSTOMER_ID = 'INSERT_CUSTOMER_ID_HERE'; public static function main() { // Either pass the required parameters for this example on the command line, or insert them // into the constants above. $options = (new ArgumentParser())->parseCommandArguments([ ArgumentNames::CUSTOMER_ID => GetOpt::REQUIRED_ARGUMENT ]); // Generate a refreshable OAuth2 credential for authentication. $oAuth2Credential = (new OAuth2TokenBuilder())->fromFile()->build(); // Construct a Google Ads client configured from a properties file and the // OAuth2 credentials above. $googleAdsClient = (new GoogleAdsClientBuilder())->fromFile() ->withOAuth2Credential($oAuth2Credential) ->build(); try { self::runExample( $googleAdsClient, $options[ArgumentNames::CUSTOMER_ID] ?: self::CUSTOMER_ID ); } 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) { /** @var GoogleAdsError $error */ printf( "\t%s: %s%s", $error->getErrorCode()->getErrorCode(), $error->getMessage(), PHP_EOL ); } exit(1); } catch (ApiException $apiException) { printf( "ApiException was thrown with message '%s'.%s", $apiException->getMessage(), PHP_EOL ); exit(1); } } /** * Runs the example. * * @param GoogleAdsClient $googleAdsClient the Google Ads API client * @param int $customerId the customer ID */ public static function runExample(GoogleAdsClient $googleAdsClient, int $customerId) { $googleAdsServiceClient = $googleAdsClient->getGoogleAdsServiceClient(); // Creates a query to find information about changed resources in your account. $query = 'SELECT change_status.resource_name, ' . 'change_status.last_change_date_time, ' . 'change_status.resource_status, ' . 'change_status.resource_type, ' . 'change_status.ad_group, ' . 'change_status.ad_group_ad, ' . 'change_status.ad_group_bid_modifier, ' . 'change_status.ad_group_criterion, ' . 'change_status.ad_group_feed, ' . 'change_status.campaign, ' . 'change_status.campaign_criterion, ' . 'change_status.campaign_feed, ' . 'change_status.feed, ' . 'change_status.feed_item ' . 'FROM change_status ' . 'WHERE change_status.last_change_date_time DURING LAST_14_DAYS ' . 'ORDER BY change_status.last_change_date_time ' . 'LIMIT 10000'; // Issues a search request. $response = $googleAdsServiceClient->search( SearchGoogleAdsRequest::build($customerId, $query) ); // Iterates over all rows in all pages and prints the requested field values for // the change status in each row. foreach ($response->iterateAllElements() as $googleAdsRow) { /** @var GoogleAdsRow $googleAdsRow */ printf( "On %s, change status '%s' shows resource '%s' with type '%s' and status '%s'.%s", $googleAdsRow->getChangeStatus()->getLastChangeDateTime(), $googleAdsRow->getChangeStatus()->getResourceName(), self::getResourceNameForResourceType($googleAdsRow->getChangeStatus()), ChangeStatusResourceType::name( $googleAdsRow->getChangeStatus()->getResourceType() ), ChangeStatusOperation::name($googleAdsRow->getChangeStatus()->getResourceStatus()), PHP_EOL ); } } /** * Gets the resource name for the resource type of the change status object. * * Each returned row contains all possible changed resources, only one of which is populated * with the name of the changed resource. This function returns the resource name of the * changed resource based on the resource type. * * @param ChangeStatus $changeStatus the change status object for getting changed resource * @return string the name of the resource that changed */ private static function getResourceNameForResourceType( ChangeStatus $changeStatus ) { $resourceType = $changeStatus->getResourceType(); $resourceName = ''; // Default value for UNSPECIFIED or UNKNOWN resource type. switch ($resourceType) { case ChangeStatusResourceType::AD_GROUP: $resourceName = $changeStatus->getAdGroup(); break; case ChangeStatusResourceType::AD_GROUP_AD: $resourceName = $changeStatus->getAdGroupAd(); break; case ChangeStatusResourceType::AD_GROUP_BID_MODIFIER: $resourceName = $changeStatus->getAdGroupBidModifier(); break; case ChangeStatusResourceType::AD_GROUP_CRITERION: $resourceName = $changeStatus->getAdGroupCriterion(); break; case ChangeStatusResourceType::AD_GROUP_FEED: $resourceName = $changeStatus->getAdGroupFeed(); break; case ChangeStatusResourceType::CAMPAIGN: $resourceName = $changeStatus->getCampaign(); break; case ChangeStatusResourceType::CAMPAIGN_CRITERION: $resourceName = $changeStatus->getCampaignCriterion(); break; case ChangeStatusResourceType::CAMPAIGN_FEED: $resourceName = $changeStatus->getCampaignFeed(); break; case ChangeStatusResourceType::FEED: $resourceName = $changeStatus->getFeed(); break; case ChangeStatusResourceType::FEED_ITEM: $resourceName = $changeStatus->getFeedItem(); break; } return $resourceName; } } GetChangeSummary::main();
Python
#!/usr/bin/env python # # Copyright 2018 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """This example gets a list of which resources have been changed in an account.""" import argparse import sys from google.ads.googleads.client import GoogleAdsClient from google.ads.googleads.errors import GoogleAdsException from google.ads.googleads.v22.services.services.google_ads_service.client import ( GoogleAdsServiceClient , ) from google.ads.googleads.v22.services.types.google_ads_service import ( SearchGoogleAdsRequest , SearchPagedResponse , GoogleAdsRow , ) from google.ads.googleads.v22.resources.types.change_status import ChangeStatus def main ( client : GoogleAdsClient , customer_id : str ) - > None : ads_service : GoogleAdsServiceClient = client . get_service ( "GoogleAdsService" ) # Construct a query to find information about changed resources in your # account. query = """ SELECT change_status.resource_name, change_status.last_change_date_time, change_status.resource_type, change_status.campaign, change_status.ad_group, change_status.resource_status, change_status.ad_group_ad, change_status.ad_group_criterion, change_status.campaign_criterion FROM change_status WHERE change_status.last_change_date_time DURING LAST_14_DAYS ORDER BY change_status.last_change_date_time LIMIT 10000""" search_request : SearchGoogleAdsRequest = client . get_type ( "SearchGoogleAdsRequest" ) search_request . customer_id = customer_id search_request . query = query response : SearchPagedResponse = ads_service . search ( request = search_request ) row : GoogleAdsRow for row in response : cs : ChangeStatus = row . change_status resource_type : str = cs . resource_type . name resource_name : str if resource_type == "AD_GROUP" : resource_name = cs . ad_group elif resource_type == "AD_GROUP_AD" : resource_name = cs . ad_group_ad elif resource_type == "AD_GROUP_CRITERION" : resource_name = cs . ad_group_criterion elif resource_type == "CAMPAIGN" : resource_name = cs . campaign elif resource_type == "CAMPAIGN_CRITERION" : resource_name = cs . campaign_criterion else : resource_name = "UNKNOWN" resource_status : str = cs . resource_status . name print ( f "On ' { cs . last_change_date_time } ', change status " f "' { cs . resource_name } ' shows that a resource type of " f "' { resource_type } ' with resource name ' { resource_name } ' was " f " { resource_status } " ) if __name__ == "__main__" : # GoogleAdsClient will read a google-ads.yaml configuration file in the parser = argparse . ArgumentParser ( description = ( "Displays account changes that occurred in the last 7 days." ) ) # The following argument(s) should be provided to run the example. parser . add_argument ( "-c" , "--customer_id" , type = str , required = True , help = "The Google Ads customer ID." , ) args = parser . parse_args () # GoogleAdsClient will read the google-ads.yaml configuration file in the # home directory if none is specified. googleads_client = GoogleAdsClient . load_from_storage ( version = "v22" ) try : main ( googleads_client , args . customer_id ) except GoogleAdsException as ex : print ( f 'Request with ID " { ex . request_id } " failed with status ' f '" { ex . error . code () . name } " and includes the following errors:' ) for error in ex . failure . errors : print ( f ' \t Error with message " { error . message } ".' ) if error . location : for field_path_element in error . location . field_path_elements : print ( f " \t\t On field: { field_path_element . field_name } " ) sys . exit ( 1 )
Ruby
#!/usr/bin/env ruby # Encoding: utf-8 # # Copyright 2019 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # This example gets a list of which resources have been changed in your account. require 'optparse' require 'google/ads/google_ads' def get_change_summary ( customer_id ) # GoogleAdsClient will read a config file from # ENV['HOME']/google_ads_config.rb when called without parameters client = Google :: Ads :: GoogleAds :: GoogleAdsClient . new # Construct a query to find information about changed resources in your # account. query = << ~ QUERY SELECT change_status . resource_name , change_status . last_change_date_time , change_status . resource_type , change_status . campaign , change_status . ad_group , change_status . resource_status , change_status . ad_group_ad , change_status . ad_group_criterion , change_status . campaign_criterion FROM change_status WHERE change_status . last_change_date_time DURING LAST_14_DAYS ORDER BY change_status . last_change_date_time LIMIT 10000 QUERY # Execute the query. response = client . service . google_ads . search ( customer_id : customer_id , query : query , ) # Process the results. response . each do | row | cs = row . change_status resource_name = case cs . resource_type when :AD_GROUP cs . ad_group when :AD_GROUP_AD cs . ad_group_ad when :AD_GROUP_CRITERION cs . ad_group_criterion when :CAMPAIGN cs . campaign when :CAMPAIGN_CRITERION cs . campaign_criterion else "UNKNOWN" end puts "On #{ cs . last_change_date_time } , change status #{ cs . resource_name } " \ "shows a resource type of #{ cs . resource_type } " \ "with resource name #{ resource_name } was #{ cs . resource_status } ." end end if __FILE__ == $PROGRAM_NAME options = {} # The following parameter(s) should be provided to run the example. You can # either specify these by changing the INSERT_XXX_ID_HERE values below, or on # the command line. # # Parameters passed on the command line will override any parameters set in # code. # # Running the example with -h will print the command line usage. options [ :customer_id ] = 'INSERT_CUSTOMER_ID_HERE' OptionParser . new do | opts | opts . banner = sprintf ( 'Usage: ruby %s [options]' , File . basename ( __FILE__ )) opts . separator '' opts . separator 'Options:' opts . on ( '-C' , '--customer-id CUSTOMER-ID' , String , 'Customer ID' ) do | v | options [ :customer_id ] = v end opts . separator '' opts . separator 'Help:' opts . on_tail ( '-h' , '--help' , 'Show this message' ) do puts opts exit end end . parse! begin get_change_summary ( options . fetch ( :customer_id ) . tr ( "-" , "" )) rescue Google :: Ads :: GoogleAds :: Errors :: GoogleAdsError = > e e . failure . errors . each do | error | STDERR . printf ( "Error with message: %s \n " , error . message ) if error . location error . location . field_path_elements . each do | field_path_element | STDERR . printf ( " \t On field: %s \n " , field_path_element . field_name ) end end error . error_code . to_h . each do | k , v | next if v == :UNSPECIFIED STDERR . printf ( " \t Type: %s \n\t Code: %s \n " , k , v ) end end raise end end
Perl
#!/usr/bin/perl -w # # Copyright 2019, Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # This example gets a list of which resources have been changed in your account # in the last 14 days. use strict ; use warnings ; use utf8 ; use FindBin qw($Bin) ; use lib "$Bin/../../lib" ; use Google::Ads::GoogleAds::Client ; use Google::Ads::GoogleAds::Utils::GoogleAdsHelper ; use Google::Ads::GoogleAds::Utils::SearchGoogleAdsIterator ; use Google::Ads::GoogleAds::V22::Enums::ChangeStatusResourceTypeEnum qw(AD_GROUP AD_GROUP_AD AD_GROUP_CRITERION CAMPAIGN CAMPAIGN_CRITERION FEED FEED_ITEM AD_GROUP_FEED CAMPAIGN_FEED AD_GROUP_BID_MODIFIER) ; use Google::Ads::GoogleAds::V22::Services::GoogleAdsService::SearchGoogleAdsRequest ; use Getopt::Long qw(:config auto_help) ; use Pod::Usage ; use Cwd qw(abs_path) ; # The following parameter(s) should be provided to run the example. You can # either specify these by changing the INSERT_XXX_ID_HERE values below, or on # the command line. # # Parameters passed on the command line will override any parameters set in # code. # # Running the example with -h will print the command line usage. my $customer_id = "INSERT_CUSTOMER_ID_HERE" ; sub get_change_summary { my ( $api_client , $customer_id ) = @_ ; # Construct a search query to find information about changed resources in your # account. my $search_query = "SELECT change_status.resource_name, change_status.last_change_date_time, " . "change_status.resource_status, " . "change_status.resource_type, " . "change_status.ad_group, " . "change_status.ad_group_ad, " . "change_status.ad_group_bid_modifier, " . "change_status.ad_group_criterion, " . "change_status.ad_group_feed, " . "change_status.campaign, " . "change_status.campaign_criterion, " . "change_status.campaign_feed, " . "change_status.feed, " . "change_status.feed_item " . "FROM change_status " . "WHERE change_status.last_change_date_time DURING LAST_14_DAYS " . "ORDER BY change_status.last_change_date_time " . "LIMIT 10000" ; # Create a search Google Ads request that will retrieve all change statuses using # pages of the specified page size. my $search_request = Google::Ads::GoogleAds::V22::Services::GoogleAdsService:: SearchGoogleAdsRequest - > new ({ customerId = > $customer_id , query = > $search_query }); # Get the GoogleAdsService. my $google_ads_service = $api_client - > GoogleAdsService (); my $iterator = Google::Ads::GoogleAds::Utils:: SearchGoogleAdsIterator - > new ({ service = > $google_ads_service , request = > $search_request }); # Iterate over all rows in all pages and print the requested field values for # the change status in each row. while ( $iterator - > has_next ) { my $google_ads_row = $iterator - > next ; my $change_status = $google_ads_row - > { changeStatus }; printf "On %s, change status '%s' shows a resource type of '%s' " . "with resource name '%s' was '%s'.\n" , $change_status - > { lastChangeDateTime }, $change_status - > { resourceName }, $change_status - > { resourceType }, __get_resource_name_for_resource_type ( $change_status ), $change_status - > { resourceStatus }; } return 1 ; } # This method returns the resource name of the changed field based on the # resource type. The changed field's parent is also populated but is not used. sub __get_resource_name_for_resource_type { my $change_status = shift ; my $resource_type = $change_status - > { resourceType }; if ( $resource_type eq AD_GROUP ) { return $change_status - > { adGroup }; } elsif ( $resource_type eq AD_GROUP_AD ) { return $change_status - > { adGroupAd }; } elsif ( $resource_type eq AD_GROUP_BID_MODIFIER ) { return $change_status - > { adGroupBidModifier }; } elsif ( $resource_type eq AD_GROUP_CRITERION ) { return $change_status - > { adGroupCriterion }; } elsif ( $resource_type eq AD_GROUP_FEED ) { return $change_status - > { adGroupFeed }; } elsif ( $resource_type eq CAMPAIGN ) { return $change_status - > { campaign }; } elsif ( $resource_type eq CAMPAIGN_CRITERION ) { return $change_status - > { campaignCriterion }; } elsif ( $resource_type eq CAMPAIGN_FEED ) { return $change_status - > { campaignFeed }; } elsif ( $resource_type eq FEED ) { return $change_status - > { feed }; } elsif ( $resource_type eq FEED_ITEM ) { return $change_status - > { feedItem }; } else { return "" ; } } # Don't run the example if the file is being included. if ( abs_path ( $0 ) ne abs_path ( __FILE__ )) { return 1 ; } # Get Google Ads Client, credentials will be read from ~/googleads.properties. my $api_client = Google::Ads::GoogleAds:: Client - > new (); # By default examples are set to die on any server returned fault. $api_client - > set_die_on_faults ( 1 ); # Parameters passed on the command line will override any parameters set in code. GetOptions ( "customer_id=s" = > \ $customer_id ); # Print the help message if the parameters are not initialized in the code nor # in the command line. pod2usage ( 2 ) if not check_params ( $customer_id ); # Call the example. get_change_summary ( $api_client , $customer_id =~ s/-//g r ); =pod =head1 NAME get_change_summary =head1 DESCRIPTION This example gets a list of which resources have been changed in your account in the last 14 days. =head1 SYNOPSIS get_change_summary.pl [options] -help Show the help message. -customer_id The Google Ads customer ID. =cut

