AI-generated Key Takeaways
-
The code example fetches the set of valid product categories using the Google Ads API.
-
It retrieves product category constants, including their localizations (specifically US English names) and parent categories.
-
The example structures the retrieved categories into a hierarchical tree and then prints them out recursively.
-
The example demonstrates how to handle and display hierarchical data from the Google Ads API.
Java
// 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. package com.google.ads.googleads.examples.shoppingads ; 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.ProductCategoryConstant ; import com.google.ads.googleads.v22.resources.ProductCategoryConstant.ProductCategoryLocalization ; 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 com.google.ads.googleads.v22.services.SearchGoogleAdsRequest ; import com.google.api.client.util.Preconditions ; import java.io.FileNotFoundException ; import java.io.IOException ; import java.util.ArrayList ; import java.util.HashMap ; import java.util.List ; import java.util.Map ; /** Fetches the set of all ProductCategoryConstants. */ public class GetProductCategoryConstants { private static class GetProductCategoryConstantParams extends CodeSampleParams { @Parameter ( names = ArgumentNames . CUSTOMER_ID , required = true ) Long customerId ; } public static void main ( String args [] ) { GetProductCategoryConstantParams params = new GetProductCategoryConstantParams (); 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 ( "ENTER_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 GetProductCategoryConstants (). 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 Google Ads API client. * @param customerId the client customer ID. */ private void runExample ( GoogleAdsClient googleAdsClient , long customerId ) { // Creates the query. String query = "SELECT " + "product_category_constant.localizations, " + "product_category_constant.product_category_constant_parent " + "FROM " + "product_category_constant" ; // Creates the request. SearchGoogleAdsRequest request = SearchGoogleAdsRequest . newBuilder () . setCustomerId ( Long . toString ( customerId )) . setQuery ( query ) . build (); // Creates the Google Ads Service Client. try ( GoogleAdsServiceClient googleAdsServiceClient = googleAdsClient . getLatestVersion (). createGoogleAdsServiceClient ()) { // Creates a list of top level category nodes. List<CategoryNode> rootCategories = new ArrayList <> (); // Creates a map of category resource name to category node for all categories found in the // results. This Map is a convenience lookup to enable fast retrieval of existing nodes. Map<String , CategoryNode > biddingCategories = new HashMap <> (); // Performs the search request. SearchPagedResponse response = googleAdsServiceClient . search ( request ); for ( GoogleAdsRow googleAdsRow : response . iterateAll ()) { // Gets the product category constant from the row. ProductCategoryConstant productCategory = googleAdsRow . getProductCategoryConstant (); // Finds the US-en localized name in the localizations list. String localizedName = productCategory . getLocalizationsList (). stream () . filter ( localization - > "US" . equals ( localization . getRegionCode ()) && "en" . equals ( localization . getLanguageCode ())) // Gets the name from the product category localization. . map ( ProductCategoryLocalization :: getValue ) . findAny () . orElse ( null ); String resourceName = productCategory . getResourceName (); CategoryNode node = biddingCategories . get ( resourceName ); if ( node == null ) { // Adds a node for the resource name to the map. node = new CategoryNode ( resourceName , localizedName ); biddingCategories . put ( resourceName , node ); } else if ( node . getLocalizedName () == null ) { // Ensures that the name attribute for the node is set. Name will be null for nodes added // to biddingCategories as a result of being a parentNode below. node . setLocalizedName ( localizedName ); } if ( productCategory . hasProductCategoryConstantParent ()) { // Looks for the parent category's node in the map and adds it if it is not present. String parentResourceName = productCategory . getProductCategoryConstantParent (); CategoryNode parentNode = biddingCategories . get ( parentResourceName ); if ( parentNode == null ) { parentNode = new CategoryNode ( parentResourceName ); biddingCategories . put ( parentResourceName , parentNode ); } parentNode . children . add ( node ); } else { // The category has no parent, so adds the category's node to the list of root categories // encountered. rootCategories . add ( node ); } } displayCategories ( rootCategories , "" ); } } /** * Recursively prints out each category node and its children. * * @param categories the categories to print. * @param prefix the string to print at the beginning of each line of output. */ private static void displayCategories ( List<CategoryNode> categories , String prefix ) { for ( CategoryNode category : categories ) { System . out . printf ( "%s%s [%s]%n" , prefix , category . localizedName , category . resourceName ); displayCategories ( category . children , String . format ( "%s%s > " , prefix , category . localizedName )); } } /** Node that tracks a product bidding category's id, name, and child nodes. */ private static class CategoryNode { private final String resourceName ; private String localizedName ; private final List<CategoryNode> children ; /** * Gets the localized name of the category. * * @return the name of the category. */ public String getLocalizedName () { return this . localizedName ; } /** * Sets the localized name of the category. * * @param localizedName the new name of the category. */ public void setLocalizedName ( String localizedName ) { this . localizedName = localizedName ; } /** * Constructor for categories first encountered as non-parent elements in the results. * * @param resourceName the resource name = of the category * @param localizedName the name of the category */ CategoryNode ( String resourceName , String localizedName ) { this . children = new ArrayList <> (); this . resourceName = Preconditions . checkNotNull ( resourceName ); this . localizedName = localizedName ; } /** * Constructor for categories first encountered as a parent category, in which case only the * resource name is available. * * @param resourceName the resource name of the category */ CategoryNode ( String resourceName ) { this ( resourceName , null ); } } }
C#
// Copyright 2020 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.Extensions.Config ; using Google.Ads.GoogleAds.Lib ; using Google.Ads.GoogleAds.V22.Errors ; using Google.Ads.GoogleAds.V22.Resources ; using Google.Ads.GoogleAds.V22.Services ; using System ; using System.Collections.Generic ; using System.Linq ; namespace Google.Ads.GoogleAds.Examples.V22 { /// <summary> /// This code example fetches the set of valid ProductCategories. /// </summary> public class GetProductCategoryConstants : ExampleBase { /// <summary> /// Command line options for running the <see cref="GetProductCategoryConstants"/> /// 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 ); GetProductCategoryConstants codeExample = new GetProductCategoryConstants (); Console . WriteLine ( codeExample . Description ); codeExample . Run ( new GoogleAdsClient (), options . CustomerId ); } /// <summary> /// Node that tracks a product category's id, name, and child nodes. /// </summary> public class CategoryNode { /// <summary> /// The resource name of the category. /// </summary> public string ResourceName { get ; private set ; } /// <summary> /// Gets or sets the localized name of the category. /// </summary> public string LocalizedName { get ; set ; } /// <summary> /// Gets the list of child. /// </summary> public List<CategoryNode> Children { get ; } = new List<CategoryNode> (); /// <summary> /// Constructor for categories first encountered as non-parent elements in the results. /// </summary> /// <param name="resourceName">The resource name of the category.</param> /// <param name="localizedName">The name of the category.</param> public CategoryNode ( string resourceName , string localizedName ) { if ( string . IsNullOrEmpty ( resourceName )) { throw new ArgumentNullException (); } this . ResourceName = resourceName ; this . LocalizedName = localizedName ; } /// <summary> /// Constructor for categories first encountered as a parent category, in which case /// only the ID is available. /// </summary> /// <param name="resourceName">The resource name of the category.</param> public CategoryNode ( string resourceName ) : this ( resourceName , null ) { } } /// <summary> /// Returns a description about the code example. /// </summary> public override string Description = > "This code example fetches the set of valid ProductCategories." ; /// <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 GoogleAdsServiceClient . GoogleAdsServiceClient googleAdsService = client . GetService ( Services . V22 . GoogleAdsService ); // Creates the query. string query = "SELECT product_category_constant.localizations, " + "product_category_constant.product_category_constant_parent " + "FROM product_category_constant" ; // Creates the request. SearchGoogleAdsRequest request = new SearchGoogleAdsRequest () { CustomerId = customerId . ToString (), Query = query }; // Creates a list of top level category nodes. List<CategoryNode> rootCategories = new List<CategoryNode> (); // Creates a map of category ID to category node for all categories found in the // results. // This Map is a convenience lookup to enable fast retrieval of existing nodes. Dictionary<string , CategoryNode > productCategories = new Dictionary<string , CategoryNode > (); try { // Performs the search request. foreach ( GoogleAdsRow googleAdsRow in googleAdsService . Search ( request )) { ProductCategoryConstant productCategory = googleAdsRow . ProductCategoryConstant ; string localizedName = productCategory . Localizations . Where ( item = > item . RegionCode == "US" && item . LanguageCode == "en" ) . Select ( item = > item . Value . ToString ()) . First (); string resourceName = productCategory . ResourceName ; CategoryNode node = null ; if ( productCategories . ContainsKey ( resourceName )) { node = productCategories [ resourceName ]; } else { node = new CategoryNode ( resourceName , localizedName ); productCategories [ resourceName ] = node ; } if ( string . IsNullOrEmpty ( node . LocalizedName )) { // Ensures that the name attribute for the node is set. Name will be null for //nodes added to productCategories as a result of being a parentNode below. node . LocalizedName = localizedName ; } if ( ! string . IsNullOrEmpty ( productCategory . ProductCategoryConstantParent )) { string parentResourceName = productCategory . ProductCategoryConstantParent ; CategoryNode parentNode = null ; if ( productCategories . ContainsKey ( parentResourceName )) { parentNode = productCategories [ parentResourceName ]; } else { parentNode = new CategoryNode ( parentResourceName ); productCategories [ parentResourceName ] = parentNode ; } parentNode . Children . Add ( node ); } else { rootCategories . Add ( node ); } } DisplayCategories ( rootCategories , "" ); } catch ( GoogleAdsException e ) { Console . WriteLine ( "Failure:" ); Console . WriteLine ( $"Message: {e.Message}" ); Console . WriteLine ( $"Failure: {e.Failure}" ); Console . WriteLine ( $"Request ID: {e.RequestId}" ); throw ; } } /// <summary> /// Recursively prints out each category node and its children. /// </summary> /// <param name="categories">The categories to print.</param> /// <param name="prefix">The string to print at the beginning of each line of output. /// </param> private static void DisplayCategories ( IEnumerable<CategoryNode> categories , string prefix ) { foreach ( CategoryNode category in categories ) { Console . WriteLine ( $"{prefix}{category.LocalizedName}" + $" [{category.ResourceName}]" ); DisplayCategories ( category . Children , $"{prefix}{category.LocalizedName} > " ); } } } }
PHP
< ?php /** * 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. */ namespace Google\Ads\GoogleAds\Examples\ShoppingAds; 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\OAuth2TokenBuilder; 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\V22\Errors\GoogleAdsError; use Google\Ads\GoogleAds\V22\Resources\ProductCategoryConstant; use Google\Ads\GoogleAds\V22\Resources\ProductCategoryConstant\ProductCategoryLocalization; use Google\Ads\GoogleAds\V22\Services\GoogleAdsRow; use Google\Ads\GoogleAds\V22\Services\SearchGoogleAdsRequest; use Google\ApiCore\ApiException; /** Fetches the set of all ProductCategoryConstants. */ class GetProductCategoryConstants { 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 the query. $query = "SELECT product_category_constant.localizations, " . "product_category_constant.product_category_constant_parent " . "FROM product_category_constant "; // Performs the search request. $response = $googleAdsServiceClient->search(SearchGoogleAdsRequest::build($customerId, $query)); // Creates a map of top level categories. $rootCategories = []; // Creates a map of all categories found in the results. // This is a convenience lookup to enable fast retrieval of existing categories. $biddingCategories = []; // Iterates over all rows in all pages to extract the result. foreach ($response->iterateAllElements() as $googleAdsRow) { /** * @var GoogleAdsRow $googleAdsRow * @var ProductCategoryConstant $productBiddingCategory */ // Gets the product category constant from the row. $productBiddingCategory = $googleAdsRow->getProductCategoryConstant(); // Finds the US-en localized name in the localizations list. /** @var ProductCategoryLocalization[] $filteredLocalizations */ $filteredLocalizations = array_filter( iterator_to_array($productBiddingCategory->getLocalizations()->getIterator()), function (ProductCategoryLocalization $productCategoryLocalization) { return $productCategoryLocalization->getRegionCode() === 'US' && $productCategoryLocalization->getLanguageCode() === 'en'; } ); // Fetches the first value in the filtered array, which is supposed to contain only // one member or none at all. $localizedName = empty($filteredLocalizations) ? null : array_shift($filteredLocalizations)->getValue(); $resourceName = $productBiddingCategory->getResourceName(); // Adds the category in the map if new. if (!array_key_exists($resourceName, $biddingCategories)) { $biddingCategories[$resourceName] = []; } // Sets the localized name attribute if not already set. if (!array_key_exists('localizedName', $biddingCategories[$resourceName])) { $biddingCategories[$resourceName]['localizedName'] = $localizedName; } if ($productBiddingCategory->getProductCategoryConstantParent() === '') { // Adds the category as a root category if having no parent. $rootCategories[$resourceName] = &$biddingCategories[$resourceName]; } else { // Links the category to the parent category if any. $parentResourceName = $productBiddingCategory->getProductCategoryConstantParent(); // Adds the parent category in the map if new. if (!array_key_exists($parentResourceName, $biddingCategories)) { $biddingCategories[$parentResourceName] = []; } // Adds the category as a child category of the parent category. $biddingCategories[$parentResourceName]['children'][$resourceName] = &$biddingCategories[$resourceName]; } } // Prints the result. self::displayCategories($rootCategories, ''); } /** * Recursively prints out each category and its children. * * @param array $categories the map of categories to print * @param string $prefix the string to print at the beginning of each line of output */ private static function displayCategories( array $categories, string $prefix ) { foreach ($categories as $categoryKey => $categoryValue) { $localizedName = $categoryValue['localizedName']; printf( '%s%s [%s]%s', $prefix, $localizedName, $categoryKey, PHP_EOL ); if (array_key_exists('children', $categoryValue)) { self::displayCategories( $categoryValue['children'], sprintf('%s%s > ', $prefix, $localizedName) ); } } } } GetProductCategoryConstants::main();
Python
#!/usr/bin/env python # 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 fetches the set of all ProductCategoryConstants.""" import argparse import collections import sys from typing import DefaultDict , List , Optional from google.ads.googleads.client import GoogleAdsClient from google.ads.googleads.errors import GoogleAdsException from google.ads.googleads.v22.resources.types.product_category_constant import ( ProductCategoryConstant , ) from google.ads.googleads.v22.services.services.google_ads_service import ( GoogleAdsServiceClient , ) from google.ads.googleads.v22.services.types.google_ads_service import ( SearchGoogleAdsStreamRequest , SearchGoogleAdsStreamResponse , ) class Category : def __init__ ( self , localized_name : Optional [ str ] = None , resource_name : Optional [ str ] = None , children : Optional [ List [ "Category" ]] = None , ) - > None : self . localized_name : Optional [ str ] = localized_name self . resource_name : Optional [ str ] = resource_name if children is None : self . children : List [ "Category" ] = [] else : self . children : List [ "Category" ] = children def display_categories ( categories : List [ Category ], prefix : str = "" ) - > None : """Recursively prints out each category and its children. Args: categories: the map of categories to print prefix: the string to print at the beginning of each line of output Returns: None """ for category in categories : print ( f " { prefix } { category . localized_name } [ { category . resource_name } ]" ) if category . children : display_categories ( category . children , prefix = f " { prefix } { category . localized_name } " ) def main ( client : GoogleAdsClient , customer_id : str ) - > None : """Fetches the set of valid ProductBiddingCategories.""" ga_service : GoogleAdsServiceClient = client . get_service ( "GoogleAdsService" ) query : str = """ SELECT product_category_constant.localizations, product_category_constant.product_category_constant_parent FROM product_category_constant""" search_request : SearchGoogleAdsStreamRequest = client . get_type ( "SearchGoogleAdsStreamRequest" ) search_request . customer_id = customer_id search_request . query = query stream : SearchGoogleAdsStreamResponse = ga_service . search_stream ( search_request ) all_categories : DefaultDict [ str , Category ] = collections . defaultdict ( lambda : Category () ) # Creates a map of top level categories. root_categories : List [ Category ] = [] for batch in stream : for row in batch . results : # Gets the product category constant from the row. product_category : ProductCategoryConstant = ( row . product_category_constant ) localized_name : str = "" for localization in product_category . localizations : region : str = localization . region_code lang : str = localization . language_code if region == "US" and lang == "en" : # Gets the name from the product category localization. localized_name = localization . value break category : Category = Category ( localized_name = localized_name , resource_name = product_category . resource_name , ) # Ensure resource_name is not None before using as a dict key if category . resource_name : all_categories [ category . resource_name ] = category parent_resource_name : Optional [ str ] = None if product_category . product_category_constant_parent : parent_resource_name = ( product_category . product_category_constant_parent ) # Links the category to the parent category if any. if parent_resource_name : # Adds the category as a child category of the parent # category. all_categories [ parent_resource_name ] . children . append ( category ) elif ( category . resource_name ): # Ensure it's not None before adding to root # Otherwise adds the category as a root category. root_categories . append ( category ) display_categories ( root_categories ) if __name__ == "__main__" : parser = argparse . ArgumentParser ( description = "Get Product Bidding Category Constant" ) # 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 : argparse . Namespace = parser . parse_args () # GoogleAdsClient will read the google-ads.yaml configuration file in the # home directory if none is specified. googleads_client : GoogleAdsClient = 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 fetches the set of all ProductCategoryConstants. require 'optparse' require 'google/ads/google_ads' def display_categories ( categories , prefix : '' ) categories . each do | c | puts " #{ prefix }#{ c . fetch ( :name ) } [ #{ c . fetch ( :id ) } ]" unless c . fetch ( :children ) . empty? display_categories ( c . fetch ( :children ), prefix : " #{ prefix }#{ c . fetch ( :name ) } > " ) end end end def get_product_category_constant ( 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 query = << ~ EOD SELECT product_category_constant . localizations , product_category_constant . product_category_constant_parent FROM product_category_constant EOD ga_service = client . service . google_ads response = ga_service . search ( customer_id : customer_id , query : query , ) # Default the values in the hash to have an Array of children, so that # we can push children in before we've discovered all the data for the # parent category. all_categories = Hash . new do | h , k | h [ k ] = { children : [] } end root_categories = Set . new response . each do | row | product_category = row . product_category_constant localized_product = product_category . localizations . detect { | l | l . region_code == "US" && l . language_code == 'en' } category = { name : localized_product . value , id : product_category . resource_name , children : [] } all_categories [ category . fetch ( :id ) ] = category parent_id = product_category . product_category_constant_parent if parent_id all_categories [ parent_id ][ :children ] << category else root_categories . add ( category ) end end display_categories ( root_categories ) end if __FILE__ == $0 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: %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_product_category_constant ( 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 fetches the set of all ProductCategoryConstants. 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::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_product_category_constants { my ( $api_client , $customer_id ) = @_ ; # Create the search query. my $search_query = "SELECT product_category_constant.localizations, " . "product_category_constant.product_category_constant_parent " . "FROM product_category_constant" ; # Create a search Google Ads request that will retrieve all product # categories 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 }); # Default the values in the hash to have an array of children, so that # we can push children in before we've discovered all the data for the # parent category. my $all_categories = {}; my $root_categories = [] ; while ( $iterator - > has_next ) { my $google_ads_row = $iterator - > next ; my $product_category = $google_ads_row - > { productCategoryConstant }; # Find the US-en localized name in the localizations list. my @localizations = grep { $_ - > { regionCode } eq "US" and $_ - > { languageCode } eq "en" } @ { $product_category - > { localizations }}; my $localized_name = @localizations ? @localizations [ 0 ] - > { value } : undef ; my $category = { name = > $localized_name , id = > $product_category - > { resourceName }, children = > [] }; $all_categories - > { $category - > { id }} = $category ; my $parent_id = $product_category - > { productCategoryConstantParent }; if ( $parent_id ) { push @ { $all_categories - > { $parent_id }{ children }}, $category ; } else { push @$root_categories , $category ; } } display_categories ( $root_categories , "" ); return 1 ; } # Recursively prints out each category node and its children. sub display_categories { my ( $categories , $prefix ) = @_ ; foreach my $category ( @$categories ) { printf "%s%s [%s]\n" , $prefix , $category - > { name }, $category - > { id }; display_categories ( $category - > { children }, sprintf ( "%s%s > " , $prefix , $category - > { name })); } } # 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_product_category_constants ( $api_client , $customer_id =~ s/-//g r ); =pod =head1 NAME get_product_category_constants =head1 DESCRIPTION This example fetches the set of all ProductCategoryConstants. =head1 SYNOPSIS get_product_category_constants.pl [options] -help Show the help message. -customer_id The Google Ads customer ID. =cut

