class_docstr: Interact with Google Ads API.
  
  This hook requires two connections:
  
  - gcp_conn_id - provides service account details (like any other GCP connection)
  - google_ads_conn_id - which contains information from Google Ads config.yaml file
      in the ``extras``. Example of the ``extras``:
  
      .. code-block:: json
  
          {
              "google_ads_client": {
                  "developer_token": "{{ INSERT_TOKEN }}",
                  "json_key_file_path": null,
                  "impersonated_email": "{{ INSERT_IMPERSONATED_EMAIL }}"
              }
          }
  
      The ``json_key_file_path`` is resolved by the hook using credentials from gcp_conn_id.
      https://developers.google.com/google-ads/api/docs/client-libs/python/oauth-service
  
  .. seealso::
      For more information on how Google Ads authentication flow works take a look at:
      https://developers.google.com/google-ads/api/docs/client-libs/python/oauth-service
  
  .. seealso::
      For more information on the Google Ads API, take a look at the API docs:
      https://developers.google.com/google-ads/api/docs/start
  
  :param gcp_conn_id: The connection ID with the service account details.
  :param google_ads_conn_id: The connection ID with the details of Google Ads config.yaml file.
  :param api_version: The Google Ads API version to use.
docstr: Convert Google Page Iterator (GRPCIterator) objects to Google Ads Rows.
  
  :param iterators: List of Google Page Iterator (GRPCIterator) objects
  :return: API response for all clients in the form of Google Ads Row object(s)
docstr_tok: ["Convert","Google","Page","Iterator","(","GRPCIterator",")","objects","to","Google","Ads","Rows",".",":","param","iterators",":","List","of","Google","Page","Iterator","(","GRPCIterator",")","objects",":","return",":","API","response","for","all","clients","in","the","form","of","Google","Ads","Row","object","(","s",")"]
code: def _extract_rows(
      self, iterators: list[GRPCIterator]
  ) -> list[GoogleAdsRow]:
      """Convert Google Page Iterator (GRPCIterator) objects to Google Ads Rows.
  
      :param iterators: List of Google Page Iterator (GRPCIterator) objects
      :return: API response for all clients in the form of Google Ads Row object(s)
      """
      try:
          self.log.info(
              "Extracting data from returned Google Ads Iterators"
          )
          return [row for iterator in iterators for row in iterator]
      except GoogleAdsException as e:
          self.log.error(
              "Request ID %s failed with status %s and includes the following errors:",
              e.request_id,
              e.error.code().name,
          )
          for error in e.failure.errors:
              self.log.error("\tError with message: %s.", error.message)
              if error.location:
                  for (
                      field_path_element
                  ) in error.location.field_path_elements:
                      self.log.error(
                          "\t\tOn field: %s",
                          field_path_element.field_name,
                      )
          raise
  
imports: from __future__ import annotations
  from functools import cached_property
  from tempfile import NamedTemporaryFile
  from typing import IO, TYPE_CHECKING, Any
  from google.ads.googleads.client import GoogleAdsClient
  from google.ads.googleads.errors import GoogleAdsException
  from google.auth.exceptions import GoogleAuthError
  from airflow.exceptions import AirflowException
  from airflow.hooks.base import BaseHook
  from airflow.providers.google.common.hooks.base_google import get_field
label_desc: Use image node_id 11 for calling the GoogleAdsHook obj's underlying member method code with example usage: obj._extract_rows(iterators) and returns: unknown