In diesem Leitfaden finden Sie Informationen zum Aktualisieren, Entfernen und Erstellen von Berichten für Kundenlisten.
Liste mit OfflineUserDataJobService aktualisieren
Nachdem Sie Ihre Kundenlisten erstellt und die Ausrichtung eingerichtet haben, sollten Sie sie regelmäßig aktualisieren.
Wenn Sie Ihre Listen mit den neuesten Daten aktualisieren möchten, ist es in der Regel effizienter, einzelne Nutzer anzuhängen oder zu entfernen, anstatt alle Nutzer aus der Liste zu entfernen und sie von Grund auf neu hochzuladen.
An eine Liste anhängen
Wenn Sie eine vorhandene Liste ergänzen möchten, erstellen Sie eine OfflineUserDataJob, so wie Sie es auch beim Erstellen einer neuen Kundenliste tun würden.
Java
private void addUsersToCustomerMatchUserList( GoogleAdsClient googleAdsClient, long customerId, boolean runJob, String userListResourceName, Long offlineUserDataJobId, ConsentStatus adPersonalizationConsent, ConsentStatus adUserDataConsent) throws UnsupportedEncodingException { try (OfflineUserDataJobServiceClient offlineUserDataJobServiceClient = googleAdsClient.getLatestVersion().createOfflineUserDataJobServiceClient()) { String offlineUserDataJobResourceName; if (offlineUserDataJobId == null) { // Creates a new offline user data job. OfflineUserDataJob.Builder offlineUserDataJobBuilder = OfflineUserDataJob.newBuilder() .setType(OfflineUserDataJobType.CUSTOMER_MATCH_USER_LIST) .setCustomerMatchUserListMetadata( CustomerMatchUserListMetadata.newBuilder().setUserList(userListResourceName)); // Adds consent information to the job if specified. if (adPersonalizationConsent != null || adUserDataConsent != null) { Consent.Builder consentBuilder = Consent.newBuilder(); if (adPersonalizationConsent != null) { consentBuilder.setAdPersonalization(adPersonalizationConsent); } if (adUserDataConsent != null) { consentBuilder.setAdUserData(adUserDataConsent); } // Specifies whether user consent was obtained for the data you are uploading. See // https://www.google.com/about/company/user-consent-policy for details. offlineUserDataJobBuilder .getCustomerMatchUserListMetadataBuilder() .setConsent(consentBuilder); } // Issues a request to create the offline user data job. CreateOfflineUserDataJobResponse createOfflineUserDataJobResponse = offlineUserDataJobServiceClient.createOfflineUserDataJob( Long.toString(customerId), offlineUserDataJobBuilder.build()); offlineUserDataJobResourceName = createOfflineUserDataJobResponse.getResourceName(); System.out.printf( "Created an offline user data job with resource name: %s.%n", offlineUserDataJobResourceName); } else { // Reuses the specified offline user data job. offlineUserDataJobResourceName = ResourceNames.offlineUserDataJob(customerId, offlineUserDataJobId); } // Issues a request to add the operations to the offline user data job. This example // only adds a few operations, so it only sends one AddOfflineUserDataJobOperations request. // If your application is adding a large number of operations, split the operations into // batches and send multiple AddOfflineUserDataJobOperations requests for the SAME job. See // https://developers.google.com/google-ads/api/docs/remarketing/audience-types/customer-match#customer_match_considerations // and https://developers.google.com/google-ads/api/docs/best-practices/quotas#user_data // for more information on the per-request limits. List<OfflineUserDataJobOperation> userDataJobOperations = buildOfflineUserDataJobOperations(); AddOfflineUserDataJobOperationsResponse response = offlineUserDataJobServiceClient.addOfflineUserDataJobOperations( AddOfflineUserDataJobOperationsRequest.newBuilder() .setResourceName(offlineUserDataJobResourceName) .setEnablePartialFailure(true) .addAllOperations(userDataJobOperations) .build()); // Prints the status message if any partial failure error is returned. // NOTE: The details of each partial failure error are not printed here, you can refer to // the example HandlePartialFailure.java to learn more. if (response.hasPartialFailureError()) { GoogleAdsFailure googleAdsFailure = ErrorUtils.getInstance().getGoogleAdsFailure(response.getPartialFailureError()); System.out.printf( "Encountered %d partial failure errors while adding %d operations to the offline user " + "data job: '%s'. Only the successfully added operations will be executed when " + "the job runs.%n", googleAdsFailure.getErrorsCount(), userDataJobOperations.size(), response.getPartialFailureError().getMessage()); } else { System.out.printf( "Successfully added %d operations to the offline user data job.%n", userDataJobOperations.size()); } if (!runJob) { System.out.printf( "Not running offline user data job '%s', as requested.%n", offlineUserDataJobResourceName); return; } // Issues an asynchronous request to run the offline user data job for executing // all added operations. offlineUserDataJobServiceClient.runOfflineUserDataJobAsync(offlineUserDataJobResourceName); // BEWARE! The above call returns an OperationFuture. The execution of that future depends on // the thread pool which is owned by offlineUserDataJobServiceClient. If you use this future, // you *must* keep the service client in scope too. // See https://developers.google.com/google-ads/api/docs/client-libs/java/lro for more detail. // Offline user data jobs may take 6 hours or more to complete, so instead of waiting for the // job to complete, retrieves and displays the job status once. If the job is completed // successfully, prints information about the user list. Otherwise, prints the query to use // to check the job again later. checkJobStatus(googleAdsClient, customerId, offlineUserDataJobResourceName); } }
C#
private static string AddUsersToCustomerMatchUserList(GoogleAdsClient client, long customerId, string userListResourceName, bool runJob, long? offlineUserDataJobId, ConsentStatus? adPersonalizationConsent, ConsentStatus? adUserDataConsent) { // Get the OfflineUserDataJobService. OfflineUserDataJobServiceClient service = client.GetService( Services.V26.OfflineUserDataJobService); string offlineUserDataJobResourceName; if (offlineUserDataJobId == null) { // Creates a new offline user data job. OfflineUserDataJob offlineUserDataJob = new OfflineUserDataJob() { Type = OfflineUserDataJobType.CustomerMatchUserList, CustomerMatchUserListMetadata = new CustomerMatchUserListMetadata() { UserList = userListResourceName, } }; if (adUserDataConsent != null || adPersonalizationConsent != null) { // Specifies whether user consent was obtained for the data you are uploading. // See https://www.google.com/about/company/user-consent-policy // for details. offlineUserDataJob.CustomerMatchUserListMetadata.Consent = new Consent(); if (adPersonalizationConsent != null) { offlineUserDataJob.CustomerMatchUserListMetadata.Consent.AdPersonalization = (ConsentStatus)adPersonalizationConsent; } if (adUserDataConsent != null) { offlineUserDataJob.CustomerMatchUserListMetadata.Consent.AdUserData = (ConsentStatus)adUserDataConsent; } } // Issues a request to create the offline user data job. CreateOfflineUserDataJobResponse response1 = service.CreateOfflineUserDataJob( customerId.ToString(), offlineUserDataJob); offlineUserDataJobResourceName = response1.ResourceName; Console.WriteLine($"Created an offline user data job with resource name: " + $"'{offlineUserDataJobResourceName}'."); } else { // Reuses the specified offline user data job. offlineUserDataJobResourceName = ResourceNames.OfflineUserDataJob(customerId, offlineUserDataJobId.Value); } AddOfflineUserDataJobOperationsRequest request = new AddOfflineUserDataJobOperationsRequest() { ResourceName = offlineUserDataJobResourceName, Operations = { BuildOfflineUserDataJobOperations() }, EnablePartialFailure = true, }; // Issues a request to add the operations to the offline user data job. This example // only adds a few operations, so it only sends one AddOfflineUserDataJobOperations // request. // If your application is adding a large number of operations, split the operations into // batches and send multiple AddOfflineUserDataJobOperations requests for the SAME job. // See https://developers.google.com/google-ads/api/docs/remarketing/audience-types/customer-match#customer_match_considerations // and https://developers.google.com/google-ads/api/docs/best-practices/quotas#user_data // for more information on the per-request limits. AddOfflineUserDataJobOperationsResponse response2 = service.AddOfflineUserDataJobOperations(request); // Prints the status message if any partial failure error is returned. // Note: The details of each partial failure error are not printed here, // you can refer to the example HandlePartialFailure.cs to learn more. if (response2.PartialFailureError != null) { // Extracts the partial failure from the response status. GoogleAdsFailure partialFailure = response2.PartialFailure; Console.WriteLine($"{partialFailure.Errors.Count} partial failure error(s) " + $"occurred"); } Console.WriteLine("The operations are added to the offline user data job."); if (!runJob) { Console.WriteLine($"Not running offline user data job " + "'{offlineUserDataJobResourceName}', as requested."); return offlineUserDataJobResourceName; } // Issues an asynchronous request to run the offline user data job for executing // all added operations. Operation<Empty, OfflineUserDataJobMetadata> operationResponse = service.RunOfflineUserDataJob(offlineUserDataJobResourceName); Console.WriteLine("Asynchronous request to execute the added operations started."); // Since offline user data jobs may take 24 hours or more to complete, it may not be // practical to do operationResponse.PollUntilCompleted() to wait for the results. // Instead, we save the offlineUserDataJobResourceName and use GoogleAdsService.Search // to check for the job status periodically. // In case you wish to follow the PollUntilCompleted or PollOnce approach, make sure // you keep both operationResponse and service variables alive until the polling // completes. return offlineUserDataJobResourceName; }
PHP
private static function addUsersToCustomerMatchUserList( GoogleAdsClient $googleAdsClient, int $customerId, bool $runJob, ?string $userListResourceName, ?int $offlineUserDataJobId, ?int $adPersonalizationConsent, ?int $adUserDataConsent ) { $offlineUserDataJobServiceClient = $googleAdsClient->getOfflineUserDataJobServiceClient(); if (is_null($offlineUserDataJobId)) { // Creates a new offline user data job. $offlineUserDataJob = new OfflineUserDataJob( [ 'type' => OfflineUserDataJobType::CUSTOMER_MATCH_USER_LIST, 'customer_match_user_list_metadata' => new CustomerMatchUserListMetadata( [ 'user_list' => $userListResourceName ] ) ] ); // Adds consent information to the job if specified. if (!empty($adPersonalizationConsent) || !empty($adUserDataConsent)) { $consent = new Consent(); if (!empty($adPersonalizationConsent)) { $consent->setAdPersonalization($adPersonalizationConsent); } if (!empty($adUserDataConsent)) { $consent->setAdUserData($adUserDataConsent); } // Specifies whether user consent was obtained for the data you are uploading. See // https://www.google.com/about/company/user-consent-policy for details. $offlineUserDataJob->getCustomerMatchUserListMetadata()->setConsent($consent); } // Issues a request to create the offline user data job. /** * @var CreateOfflineUserDataJobResponse $createOfflineUserDataJobResponse */ $createOfflineUserDataJobResponse = $offlineUserDataJobServiceClient->createOfflineUserDataJob( CreateOfflineUserDataJobRequest::build($customerId, $offlineUserDataJob) ); $offlineUserDataJobResourceName = $createOfflineUserDataJobResponse->getResourceName(); printf( "Created an offline user data job with resource name: '%s'.%s", $offlineUserDataJobResourceName, PHP_EOL ); } else { // Reuses the specified offline user data job. $offlineUserDataJobResourceName = ResourceNames::forOfflineUserDataJob($customerId, $offlineUserDataJobId); } // Issues a request to add the operations to the offline user data job. This example // only adds a few operations, so it only sends one AddOfflineUserDataJobOperations request. // If your application is adding a large number of operations, split the operations into // batches and send multiple AddOfflineUserDataJobOperations requests for the SAME job. See // https://developers.google.com/google-ads/api/docs/remarketing/audience-types/customer-match#customer_match_considerations // and https://developers.google.com/google-ads/api/docs/best-practices/quotas#user_data // for more information on the per-request limits. /** * @var AddOfflineUserDataJobOperationsResponse $operationResponse */ $response = $offlineUserDataJobServiceClient->addOfflineUserDataJobOperations( AddOfflineUserDataJobOperationsRequest::build( $offlineUserDataJobResourceName, self::buildOfflineUserDataJobOperations() )->setEnablePartialFailure(true) ); // Prints the status message if any partial failure error is returned. // Note: The details of each partial failure error are not printed here, you can refer to // the example HandlePartialFailure.php to learn more. if ($response->hasPartialFailureError()) { // Extracts the partial failure from the response status. $partialFailure = GoogleAdsFailures::fromAny( $response->getPartialFailureError()->getDetails()->getIterator()->current() ); printf( "%d partial failure error(s) occurred: %s.%s", count($partialFailure->getErrors()), $response->getPartialFailureError()->getMessage(), PHP_EOL ); } else { print 'The operations are added to the offline user data job.' . PHP_EOL; } if ($runJob === false) { printf( "Not running offline user data job '%s', as requested.%s", $offlineUserDataJobResourceName, PHP_EOL ); return; } // Issues an asynchronous request to run the offline user data job for executing all added // operations. The result is OperationResponse. Visit the OperationResponse.php file for // more details. $offlineUserDataJobServiceClient->runOfflineUserDataJob( RunOfflineUserDataJobRequest::build($offlineUserDataJobResourceName) ); // Offline user data jobs may take 6 hours or more to complete, so instead of waiting // for the job to complete, retrieves and displays the job status once. If the job is // completed successfully, prints information about the user list. Otherwise, prints the // query to use to check the job again later. self::checkJobStatus($googleAdsClient, $customerId, $offlineUserDataJobResourceName); }
Python
def add_users_to_customer_match_user_list( client: GoogleAdsClient, customer_id: str, user_list_resource_name: str, run_job: bool, offline_user_data_job_id: Optional[str], ad_user_data_consent: Optional[str], ad_personalization_consent: Optional[str], ) -> None: """Uses Customer Match to create and add users to a new user list. Args: client: The Google Ads client. customer_id: The ID for the customer that owns the user list. user_list_resource_name: The resource name of the user list to which to add users. run_job: If true, runs the OfflineUserDataJob after adding operations. Otherwise, only adds operations to the job. offline_user_data_job_id: ID of an existing OfflineUserDataJob in the PENDING state. If None, a new job is created. ad_user_data_consent: The consent status for ad user data for all members in the job. ad_personalization_consent: The personalization consent status for ad user data for all members in the job. """ # Creates the OfflineUserDataJobService client. offline_user_data_job_service_client: OfflineUserDataJobServiceClient = ( client.get_service("OfflineUserDataJobService") ) offline_user_data_job_resource_name: str if offline_user_data_job_id: # Reuses the specified offline user data job. offline_user_data_job_resource_name = ( offline_user_data_job_service_client.offline_user_data_job_path( customer_id, offline_user_data_job_id ) ) else: # Creates a new offline user data job. offline_user_data_job: OfflineUserDataJob = client.get_type( "OfflineUserDataJob" ) offline_user_data_job.type_ = ( client.enums.OfflineUserDataJobTypeEnum.CUSTOMER_MATCH_USER_LIST ) offline_user_data_job.customer_match_user_list_metadata.user_list = ( user_list_resource_name ) # Specifies whether user consent was obtained for the data you are # uploading. For more details, see: # https://www.google.com/about/company/user-consent-policy if ad_user_data_consent: offline_user_data_job.customer_match_user_list_metadata.consent.ad_user_data = client.enums.ConsentStatusEnum[ ad_user_data_consent ] if ad_personalization_consent: offline_user_data_job.customer_match_user_list_metadata.consent.ad_personalization = client.enums.ConsentStatusEnum[ ad_personalization_consent ] # Issues a request to create an offline user data job. create_offline_user_data_job_response: ( CreateOfflineUserDataJobResponse ) = offline_user_data_job_service_client.create_offline_user_data_job( customer_id=customer_id, job=offline_user_data_job ) offline_user_data_job_resource_name = ( create_offline_user_data_job_response.resource_name ) print( "Created an offline user data job with resource name: " f"'{offline_user_data_job_resource_name}'." ) # Issues a request to add the operations to the offline user data job. # Best Practice: This example only adds a few operations, so it only sends # one AddOfflineUserDataJobOperations request. If your application is adding # a large number of operations, split the operations into batches and send # multiple AddOfflineUserDataJobOperations requests for the SAME job. See # https://developers.google.com/google-ads/api/docs/remarketing/audience-types/customer-match#customer_match_considerations # and https://developers.google.com/google-ads/api/docs/best-practices/quotas#user_data # for more information on the per-request limits. request: AddOfflineUserDataJobOperationsRequest = client.get_type( "AddOfflineUserDataJobOperationsRequest" ) request.resource_name = offline_user_data_job_resource_name request.operations = build_offline_user_data_job_operations(client) request.enable_partial_failure = True # Issues a request to add the operations to the offline user data job. response: AddOfflineUserDataJobOperationsResponse = ( offline_user_data_job_service_client.add_offline_user_data_job_operations( request=request ) ) # Prints the status message if any partial failure error is returned. # Note: the details of each partial failure error are not printed here. # Refer to the error_handling/handle_partial_failure.py example to learn # more. # Extracts the partial failure from the response status. partial_failure: Union[status_pb2.Status, None] = getattr( response, "partial_failure_error", None ) if getattr(partial_failure, "code", None) != 0: error_details: Iterable[Any, None] = getattr( partial_failure, "details", [] ) for error_detail in error_details: failure_message: GoogleAdsFailure = client.get_type( "GoogleAdsFailure" ) # Retrieve the class definition of the GoogleAdsFailure instance # in order to use the "deserialize" class method to parse the # error_detail string into a protobuf message object. failure_object: GoogleAdsFailure = type( failure_message ).deserialize(error_detail.value) errors: Iterable[GoogleAdsError] = failure_object.errors for error in errors: print( "A partial failure at index " f"{error.location.field_path_elements[0].index} occurred.\n" f"Error message: {error.message}\n" f"Error code: {error.error_code}" ) print("The operations are added to the offline user data job.") if not run_job: print( "Not running offline user data job " f"'{offline_user_data_job_resource_name}', as requested." ) return # Issues a request to run the offline user data job for executing all # added operations. offline_user_data_job_service_client.run_offline_user_data_job( resource_name=offline_user_data_job_resource_name ) # Retrieves and displays the job status. check_job_status(client, customer_id, offline_user_data_job_resource_name)
Ruby
def add_users_to_customer_match_user_list(client, customer_id, run_job, user_list, job_id, ad_user_data_consent, ad_personalization_consent) offline_user_data_service = client.service.offline_user_data_job job_name = if job_id.nil? # Creates the offline user data job. offline_user_data_job = client.resource.offline_user_data_job do |job| job.type = :CUSTOMER_MATCH_USER_LIST job.customer_match_user_list_metadata = client.resource.customer_match_user_list_metadata do |m| m.user_list = user_list if !ad_user_data_consent.nil? || !ad_personalization_consent.nil? m.consent = client.resource.consent do |c| # Specifies whether user consent was obtained for the data you are # uploading. For more details, see: # https://www.google.com/about/company/user-consent-policy unless ad_user_data_consent.nil? c.ad_user_data = ad_user_data_consent end unless ad_personalization_consent.nil? c.ad_personalization = ad_personalization_consent end end end end end # Issues a request to create the offline user data job. response = offline_user_data_service.create_offline_user_data_job( customer_id: customer_id, job: offline_user_data_job, ) offline_user_data_job_resource_name = response.resource_name puts "Created an offline user data job with resource name: " \ "#{offline_user_data_job_resource_name}" offline_user_data_job_resource_name else client.path.offline_user_data_job(customer_id, job_id) end # Issues a request to add the operations to the offline user data job. This # example only adds a few operations, so it only sends one # AddOfflineUserDataJobOperations request. If your application is adding a # large number of operations, split the operations into batches and send # multiple AddOfflineUserDataJobOperations requests for the SAME job. See # https://developers.google.com/google-ads/api/docs/remarketing/audience-types/customer-match#customer_match_considerations # and https://developers.google.com/google-ads/api/docs/best-practices/quotas#user_data # for more information on the per-request limits. response = offline_user_data_service.add_offline_user_data_job_operations( resource_name: offline_user_data_job_resource_name, enable_partial_failure: true, operations: build_offline_user_data_job_operations(client), ) # Prints errors if any partial failure error is returned. if response.partial_failure_error failures = client.decode_partial_failure_error(response.partial_failure_error) failures.each do |failure| failure.errors.each do |error| human_readable_error_path = error .location .field_path_elements .map { |location_info| if location_info.index "#{location_info.field_name}[#{location_info.index}]" else "#{location_info.field_name}" end }.join(" > ") errmsg = "error occured while adding operations " \ "#{human_readable_error_path}" \ " with value: #{error.trigger.string_value}" \ " because #{error.message.downcase}" puts errmsg end end end puts "The operations are added to the offline user data job." unless run_job puts "Not running offline user data job #{job_name}, as requested." return end # Issues an asynchronous request to run the offline user data job # for executing all added operations. response = offline_user_data_service.run_offline_user_data_job( resource_name: offline_user_data_job_resource_name ) puts "Asynchronous request to execute the added operations started." puts "Waiting until operation completes." # Offline user data jobs may take 6 hours or more to complete, so instead of # waiting for the job to complete, retrieves and displays the job status # once. If the job is completed successfully, prints information about the # user list. Otherwise, prints the query to use to check the job again later. check_job_status( client, customer_id, offline_user_data_job_resource_name, ) end
Perl
sub add_users_to_customer_match_user_list { my ($api_client, $customer_id, $run_job, $user_list_resource_name, $offline_user_data_job_id, $ad_personalization_consent, $ad_user_data_consent) = @_; my $offline_user_data_job_service = $api_client->OfflineUserDataJobService(); my $offline_user_data_job_resource_name = undef; if (!defined $offline_user_data_job_id) { # Create a new offline user data job. my $offline_user_data_job = Google::Ads::GoogleAds::V26::Resources::OfflineUserDataJob->new({ type => CUSTOMER_MATCH_USER_LIST, customerMatchUserListMetadata => Google::Ads::GoogleAds::V26::Common::CustomerMatchUserListMetadata-> new({ userList => $user_list_resource_name })}); # Add consent information to the job if specified. if ($ad_personalization_consent or $ad_user_data_consent) { my $consent = Google::Ads::GoogleAds::V26::Common::Consent->new({}); if ($ad_personalization_consent) { $consent->{adPersonalization} = $ad_personalization_consent; } if ($ad_user_data_consent) { $consent->{adUserData} = $ad_user_data_consent; } # Specify whether user consent was obtained for the data you are uploading. # See https://www.google.com/about/company/user-consent-policy for details. $offline_user_data_job->{customerMatchUserListMetadata}{consent} = $consent; } # Issue a request to create the offline user data job. my $create_offline_user_data_job_response = $offline_user_data_job_service->create({ customerId => $customer_id, job => $offline_user_data_job }); $offline_user_data_job_resource_name = $create_offline_user_data_job_response->{resourceName}; printf "Created an offline user data job with resource name: '%s'.\n", $offline_user_data_job_resource_name; } else { # Reuse the specified offline user data job. $offline_user_data_job_resource_name = Google::Ads::GoogleAds::V26::Utils::ResourceNames::offline_user_data_job( $customer_id, $offline_user_data_job_id); } # Issue a request to add the operations to the offline user data job. # This example only adds a few operations, so it only sends one AddOfflineUserDataJobOperations # request. If your application is adding a large number of operations, split # the operations into batches and send multiple AddOfflineUserDataJobOperations # requests for the SAME job. See # https://developers.google.com/google-ads/api/docs/remarketing/audience-types/customer-match#customer_match_considerations # and https://developers.google.com/google-ads/api/docs/best-practices/quotas#user_data # for more information on the per-request limits. my $user_data_job_operations = build_offline_user_data_job_operations(); my $response = $offline_user_data_job_service->add_operations( { resourceName => $offline_user_data_job_resource_name, enablePartialFailure => "true", operations => $user_data_job_operations }); # Print the status message if any partial failure error is returned. # Note: The details of each partial failure error are not printed here, you can # refer to the example handle_partial_failure.pl to learn more. if ($response->{partialFailureError}) { # Extract the partial failure from the response status. my $partial_failure = $response->{partialFailureError}{details}[0]; printf "Encountered %d partial failure errors while adding %d operations " . "to the offline user data job: '%s'. Only the successfully added " . "operations will be executed when the job runs.\n", scalar @{$partial_failure->{errors}}, scalar @$user_data_job_operations, $response->{partialFailureError}{message}; } else { printf "Successfully added %d operations to the offline user data job.\n", scalar @$user_data_job_operations; } if (!defined $run_job) { print "Not running offline user data job $offline_user_data_job_resource_name, as requested.\n"; return; } # Issue an asynchronous request to run the offline user data job for executing # all added operations. my $operation_response = $offline_user_data_job_service->run({ resourceName => $offline_user_data_job_resource_name }); # Offline user data jobs may take 6 hours or more to complete, so instead of waiting # for the job to complete, this example retrieves and displays the job status once. # If the job is completed successfully, it prints information about the user list. # Otherwise, it prints, the query to use to check the job status again later. check_job_status($api_client, $customer_id, $offline_user_data_job_resource_name); }
curl
Einzelne Nutzer mithilfe von Kennungen entfernen
So entfernen Sie einzelne Nutzer:
Legen Sie das Attribut
removefür einOfflineUserDataJobOperationauf einUserData-Objekt fest.Fügen Sie dem wiederkehrenden Feld
user_identifiers[]ein oder mehrereUserIdentifier-Objekte hinzu. Eine einzelne Nutzer-ID kann verwendet werden, um einen Nutzer aus einer Liste zu entfernen, auch wenn mehrere IDs für den Nutzer eingereicht wurden.
Auf teilweise fehlgeschlagene Vorgänge prüfen
Wenn Sie Ihrem Job mit AddOfflineUserDataJobOperations Vorgänge hinzufügen, können Sie optional Teilfehler aktivieren. Setzen Sie dazu in Ihrer AddOfflineUserDataJobOperationsRequest das Feld enable_partial_failure auf true.
Wenn die Option für teilweise Fehler aktiviert ist, werden Vorgänge, die die Validierung nicht bestehen, im Feld partial_failure_error in der Antwort aufgezeichnet, während gültige Vorgänge dem Job hinzugefügt werden. Wenn der Teilfehler deaktiviert ist (Standardeinstellung), führt jeder Vorgang, der die Validierung nicht besteht, dazu, dass die gesamte Anfrage fehlschlägt. Weitere Informationen finden Sie im Leitfaden zu Teilfehlern.
Es ist wichtig, die Antwort auf partial_failure_error zu prüfen, wenn die Option für Teilfehler aktiviert ist. Wenn alle Vorgänge die Validierung nicht bestehen, wird keiner dem Job hinzugefügt und partial_failure_error enthält alle Vorgangsfehler. Wenn Sie dann RunOfflineUserDataJob aufrufen, wird der Job sofort mit dem Status SUCCESS abgeschlossen, da keine Vorgänge zu verarbeiten sind.
Alle Daten auf einmal aus der Liste entfernen
Wenn Sie alle Nutzer aus einer Liste entfernen möchten, setzen Sie remove_all in einem OfflineUserDataJobOperation auf true und senden Sie dann eine RunOfflineUserDataJob-Anfrage mit dem Ressourcennamen, der mit dem remove_all-Vorgang verknüpft ist.
Im Gegensatz zu einzelnen remove-Vorgängen kann ein remove_all-Vorgang mit nachfolgenden create-Vorgängen im selben Job kombiniert werden, sofern remove_all der erste Vorgang im Job ist. Andernfalls wird beim Ausführen des Jobs der Fehler INVALID_OPERATION_ORDER zurückgegeben. Wenn Sie die Mitglieder einer Nutzerliste vollständig durch neue Mitglieder ersetzen möchten, ordnen Sie die Vorgänge in AddOfflineUserDataJobOperationsRequest in dieser Reihenfolge an:
Legen Sie
remove_allin einemOfflineUserDataJobOperationauftruefest.Fügen Sie für jedes neue Mitglied einen
create-Vorgang hinzu und legen Sie dieUserDatain einerOfflineUserDataJobOperationfest.
remove_all-Vorgänge werden stündlich ausgeführt und können bis zu 24 Stunden dauern.
Empfehlungen zum Aktualisieren von Kundenlisten
Sie können Empfehlungen vom Typ REFRESH_CUSTOMER_MATCH_LIST abrufen, um Kundenlisten zu identifizieren, die seit einiger Zeit nicht mehr aktualisiert wurden. Das ist besonders nützlich, wenn Sie ein Drittanbieter sind, der seinen Nutzern die Verwaltung von Kundenlisten ermöglicht.
Weitere Informationen zum Arbeiten mit Empfehlungen finden Sie im Leitfaden Optimierungsfaktor und Empfehlungen.
Liste entfernen
Verwenden Sie die Methode UserListService.MutateUserLists, um einen remove-Vorgang mit dem Ressourcennamen der Nutzerliste zu senden, die Sie entfernen möchten.
Liste mit UserDataService aktualisieren
Die UserDataService hat ein Limit von 10 Vorgängen und insgesamt 100 user_identifiers pro Anfrage. Sie eignet sich daher besser für kleine Aktualisierungen.
Wenn beispielsweise jedes Ihrer UserData-Objekte ein UserIdentifier für hashed_email und ein weiteres UserIdentifier für hashed_phone_number hat, kann Ihre Anfrage höchstens 50 UserData-Objekte enthalten.
UserDataService enthält die Methode UploadUserData, die ein UploadUserDataRequest akzeptiert. Zusätzlich zu customer_id akzeptiert UploadUserDataRequest eine Liste von Vorgängen zum Erstellen von Kontakten und ein Pflichtfeld namens customer_match_user_list_metadata, das mit dem Ressourcennamen der Remarketing-Liste gefüllt wird, auf die das Targeting erfolgen soll.
Erstellen Sie zuerst eine UploadUserDataRequest-Instanz, in der Sie customer_id und customer_match_user_list_metadata füllen:
Java
// Creates a request to add user data operations to the user list.
String userListResourceName =
ResourceNames.userList(customerId, userListId);
UploadUserDataRequest.Builder uploadUserDataRequest =
UploadUserDataRequest.newBuilder()
.setCustomerId(String.valueOf(customerId))
.setCustomerMatchUserListMetadata(
CustomerMatchUserListMetadata.newBuilder()
.setUserList(userListResourceName)
.setConsent(
Consent.newBuilder()
.setAdUserData(ConsentStatus.GRANTED)
.setAdPersonalization(ConsentStatus.GRANTED)
.build())
.build());
Wenn Sie Nutzerkontaktdaten hochladen möchten, setzen Sie CrmBasedUserListInfo.upload_key_type auf CONTACT_INFO.
Fügen Sie zuerst die Vorgänge zum UploadUserDataRequest-Objekt hinzu. Jeder Vorgang enthält ein create-Feld, das mit UserData-Objekten gefüllt ist, die eine oder mehrere UserIdentifier-Instanzen enthalten. Jedes UserIdentifier enthält eine personenidentifizierbare Information oder kann einer von mehreren verschiedenen Typen sein, die in den folgenden Abschnitten beschrieben werden.
Wenn Sie E-Mail-Adressen von Kunden hochladen möchten, erstellen Sie ein neues UserDataOperation-Objekt und füllen Sie das Feld create mit einem UserData-Objekt. Das UserData-Objekt akzeptiert eine Liste von user_identifiers.
Normalisieren Sie jede E-Mail-Adresse (Leerzeichen entfernen und in Kleinbuchstaben umwandeln) und hashen Sie sie mit SHA-256, bevor Sie das Feld hashed_email ausfüllen:
Java
ImmutableList<String> EMAILS =
ImmutableList.of(
"client1@example.com",
"client2@example.com",
" Client3@example.com ");
// Normalize and hash email addresses using the SHA-256 hashing algorithm.
List<UserDataOperation> userDataOperations =
new ArrayList<>(EMAILS.size());
for (String email : EMAILS) {
String normalizedEmail = email.trim().toLowerCase();
UserDataOperation userDataOperation =
UserDataOperation.newBuilder()
.setCreate(
UserData.newBuilder()
.addUserIdentifiers(
UserIdentifier.newBuilder()
.setHashedEmail(toSHA256String(normalizedEmail))
.build())
.build())
.build();
userDataOperations.add(userDataOperation);
}
uploadUserDataRequest.addAllOperations(userDataOperations);
Das Hochladen von Nutzer-address_info ähnelt dem Hochladen von Nutzer-E-Mail-Adressen.
Anstatt jedoch eine hashed_email zu übergeben, füllen Sie das Feld address_info mit einem OfflineUserAddressInfo-Objekt, das die first_name, last_name, country_code und postal_code des Nutzers enthält. Wie E‑Mail-Adressen gelten auch first_name und last_name als personenidentifizierbare Informationen und müssen vor dem Hochladen normalisiert und gehasht werden.
Java
String firstName = "Alex";
String lastName = "Quinn";
String countryCode = "US";
String postalCode = "94045";
String normalizedFirstName = firstName.trim().toLowerCase();
String normalizedLastName = lastName.trim().toLowerCase();
UserIdentifier userIdentifierWithAddress =
UserIdentifier.newBuilder()
.setAddressInfo(
OfflineUserAddressInfo.newBuilder()
// First and last name must be normalized and hashed.
.setHashedFirstName(toSHA256String(normalizedFirstName))
.setHashedLastName(toSHA256String(normalizedLastName))
// Country code and zip code are sent in plaintext.
.setCountryCode(countryCode)
.setPostalCode(postalCode)
.build())
.build();
UserDataOperation userDataOperation =
UserDataOperation.newBuilder()
.setCreate(
UserData.newBuilder()
.addUserIdentifiers(userIdentifierWithAddress)
.build())
.build();
uploadUserDataRequest.addOperations(userDataOperation);
Nachdem Sie der UploadUserDataRequest-Instanz Vorgänge hinzugefügt haben, rufen Sie die Methode uploadUserData für UserDataServiceClient auf, um die Anfrage an den Google Ads API-Server zu senden. Sie können prüfen, ob die Anfrage erfolgreich war, indem Sie die Anzahl der empfangenen Vorgänge und die Uploadzeit im Antwortobjekt prüfen. Beachten Sie, dass es mehrere Stunden dauern kann, bis die Liste mit Mitgliedern gefüllt ist.
Java
// Creates the user data service client.
try (UserDataServiceClient userDataServiceClient =
googleAdsClient.getLatestVersion().createUserDataServiceClient()) {
// Adds operations to the user list based on the user data type.
UploadUserDataResponse response =
userDataServiceClient.uploadUserData(uploadUserDataRequest.build());
// Logs the results. It may take several hours for the list to be
// populated with members.
System.out.printf(
"Received %d operations at %s%n",
response.getReceivedOperationsCount(),
response.getUploadDateTime());
}
Targeting-Ebene für Liste wechseln
Wenn Sie die Ausrichtungsebene Ihrer Liste ändern müssen, z. B. von der Anzeigengruppen- auf die Kampagnenebene, lesen Sie den Leitfaden zum Wechseln der Ausrichtungsebenen.
Leistung der Liste prüfen
Wenn Sie Leistungsdaten für Ihre Zielgruppensegmente erfassen möchten, senden Sie eine Suchanfrage an die Ressource ad_group_audience_view oder campaign_audience_view. Sie können beispielsweise metrics.conversions oder metrics.cost_per_conversion analysieren, um festzustellen, ob die Ausrichtung auf ein bestimmtes Zielgruppensegment die Anzahl der Conversions erhöht, und dann Ihre Gebotsanpassungen entsprechend anpassen.
SELECT
ad_group.id,
ad_group_criterion.criterion_id,
ad_group_criterion.resource_name,
metrics.conversions,
metrics.cost_per_conversion
FROM ad_group_audience_view
WHERE segments.date DURING LAST_30_DAYS
Wir empfehlen, mindestens zwei Wochen zu warten, bevor Sie Gebote basierend auf dem Traffic-Volumen in Ihrem Konto optimieren.