So verwenden Sie die Batchverarbeitung:
Neuen Batchjob erstellen
Rufen Sie
MutateBatchJob auf, um eine BatchJob-Ressource zu erstellen. Beim Erstellen des
BatchJob-Objekts können Sie optional
metadata.execution_limit_seconds festlegen, um eine Obergrenze
in Sekunden für die Ausführungsdauer des Jobs zu konfigurieren, bevor er automatisch
abgebrochen wird. Weitere Informationen finden Sie unter Zusätzliche Nutzungsrichtlinien.
Java
private String createBatchJob(BatchJobServiceClient batchJobServiceClient, long customerId) { BatchJobOperation operation = BatchJobOperation.newBuilder().setCreate(BatchJob.newBuilder().build()).build(); String batchJobResourceName = batchJobServiceClient .mutateBatchJob(Long.toString(customerId), operation) .getResult() .getResourceName(); System.out.printf("Created a mutate job with resource name: '%s'.%n", batchJobResourceName); return batchJobResourceName; }
C#
private static string CreateBatchJob(BatchJobServiceClient batchJobService, long customerId) { BatchJobOperation operation = new BatchJobOperation() { Create = new BatchJob() { } }; string batchJobResourceName = batchJobService.MutateBatchJob(customerId.ToString(), operation) .Result.ResourceName; Console.WriteLine($"Created a batch job with resource name: " + $"'{batchJobResourceName}'."); return batchJobResourceName; }
PHP
private static function createBatchJob( BatchJobServiceClient $batchJobServiceClient, int $customerId ): string { // Creates a batch job operation to create a new batch job. $batchJobOperation = new BatchJobOperation(); $batchJobOperation->setCreate(new BatchJob()); // Issues a request to the API and get the batch job's resource name. $batchJobResourceName = $batchJobServiceClient->mutateBatchJob( MutateBatchJobRequest::build($customerId, $batchJobOperation) )->getResult()->getResourceName(); printf( "Created a batch job with resource name: '%s'.%s", $batchJobResourceName, PHP_EOL ); return $batchJobResourceName; }
Python
def create_batch_job( batch_job_service: BatchJobServiceClient, customer_id: str, batch_job_operation: BatchJobOperation, ) -> str: """Creates a batch job for the specified customer ID. Args: batch_job_service: an instance of the BatchJobService message class. customer_id: a str of a customer ID. batch_job_operation: a BatchJobOperation instance set to "create" Returns: a str of a resource name for a batch job. """ try: response: MutateBatchJobResponse = batch_job_service.mutate_batch_job( customer_id=customer_id, operation=batch_job_operation ) resource_name: str = response.result.resource_name print(f'Created a batch job with resource name "{resource_name}"') return resource_name except GoogleAdsException as exception: handle_googleads_exception(exception) # This line will likely not be reached due to sys.exit(1) in handle_googleads_exception # but to satisfy the type checker, we add a return statement. return "" # Or raise an exception
Ruby
def create_batch_job(client, batch_job_service, customer_id) # Creates a batch job operation to create a new batch job. operation = client.operation.create_resource.batch_job # Issues a request to the API and get the batch job's resource name. response = batch_job_service.mutate_batch_job( customer_id: customer_id, operation: operation ) batch_job_resource_name = response.result.resource_name puts "Created a batch job with resource name: '#{batch_job_resource_name}'" batch_job_resource_name end
Perl
sub create_batch_job { my ($batch_job_service, $customer_id) = @_; # Create a batch job operation. my $batch_job_operation = Google::Ads::GoogleAds::V25::Services::BatchJobService::BatchJobOperation-> new({create => Google::Ads::GoogleAds::V25::Resources::BatchJob->new({})}); my $batch_job_resource_name = $batch_job_service->mutate({ customerId => $customer_id, operation => $batch_job_operation })->{result}{resourceName}; printf "Created a batch job with resource name: '%s'.\n", $batch_job_resource_name; return $batch_job_resource_name; }
curl
# Creates a batch job. # # Variables: # API_VERSION, # CUSTOMER_ID, # DEVELOPER_TOKEN, # MANAGER_CUSTOMER_ID, # OAUTH2_ACCESS_TOKEN: # See https://developers.google.com/google-ads/api/rest/auth#request_headers # for details. curl -f --request POST \ "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/batchJobs:mutate" \ --header "Content-Type: application/json" \ --header "developer-token: ${DEVELOPER_TOKEN}" \ --header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \ --header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \ --data @- <<EOF { "operation": { "create": {} } } EOF
An diesem Punkt im Prozess ist der status des Jobs
PENDING.
Mutationsvorgänge zum Batchjob hinzufügen
Fügen Sie dem Batchjob
im vorherigen Schritt erstellten ein oder mehrere MutateOperation-Objekte hinzu, indem Sie
AddBatchJobOperations aufrufen. Die
Antwort enthält dann Folgendes:
total_operations: Gesamtzahl der bisher für diesen Job hinzugefügten Vorgänge.next_sequence_token: Sequenz-Token, das imsequence_tokenFeld übergeben werden muss, wenn Sie diese Methode noch einmal aufrufen, um weitere Vorgänge hinzuzufügen.
Bei der ersten AddBatchJobOperations-Anfrage für einen
Batchjob muss sequence_token weggelassen werden. Wenn Sie
AddBatchJobOperations noch einmal aufrufen, um weitere
Vorgänge hinzuzufügen, geben Sie das zuvor abgerufene Sequenz-Token im
sequence_token Feld der
Anfrage an. Wenn Sie die Methode mit einer leeren
mutate_operations Liste aufrufen, wird ein
BatchJobError.EMPTY_OPERATIONS Fehler zurückgegeben. Wenn Sie sie mit einem anderen
Sequenz-Token als dem zuvor abgerufenen aufrufen, wird ein
BatchJobError.INVALID_SEQUENCE_TOKEN Fehler zurückgegeben. Wenn Sie
versuchen, Vorgänge hinzuzufügen, nachdem der Job bereits ausgeführt wurde, wird ein
BatchJobError.CANNOT_MODIFY_JOB_AFTER_JOB_STARTS_RUNNING
Fehler zurückgegeben.
Solange das status des Batchjobs
PENDING ist, ist sequence_token auch als
next_add_sequence_token für die
BatchJob-Ressource verfügbar, die Sie später
abrufen können.
Wenn Sie abhängige Objekte wie eine vollständige Kampagne erstellen, die aus einer neuen Kampagne und den entsprechenden Anzeigengruppen, Anzeigen und Keywords besteht, können Sie temporäre IDs verwenden, um einen Ressourcennamen anzugeben.
Java
private void addAllBatchJobOperations( BatchJobServiceClient batchJobServiceClient, long customerId, String batchJobResourceName) { AddBatchJobOperationsResponse response = batchJobServiceClient.addBatchJobOperations( AddBatchJobOperationsRequest.newBuilder() .setResourceName(batchJobResourceName) .addAllMutateOperations(buildAllOperations(customerId)) .build()); System.out.printf( "%d mutate operations have been added so far.%n", response.getTotalOperations()); // You can use this next sequence token for calling addBatchJobOperations() next time. System.out.printf( "Next sequence token for adding next operations is '%s'.%n", response.getNextSequenceToken()); }
C#
private static void AddAllBatchJobOperations(BatchJobServiceClient batchJobService, long customerId, string batchJobResourceName) { AddBatchJobOperationsResponse response = batchJobService.AddBatchJobOperations( new AddBatchJobOperationsRequest() { ResourceName = batchJobResourceName, MutateOperations = { BuildAllOperations(customerId) } }); Console.WriteLine($"{response.TotalOperations} mutate operations have been added" + $" so far."); // You can use this next sequence token for calling AddBatchJobOperations() next time. Console.WriteLine($"Next sequence token for adding next operations is " + $"'{response.NextSequenceToken}'."); }
PHP
private static function addAllBatchJobOperations( BatchJobServiceClient $batchJobServiceClient, int $customerId, string $batchJobResourceName ): void { $response = $batchJobServiceClient->addBatchJobOperations( AddBatchJobOperationsRequest::build( $batchJobResourceName, '', self::buildAllOperations($customerId) ) ); printf( "%d mutate operations have been added so far.%s", $response->getTotalOperations(), PHP_EOL ); // You can use this next sequence token for calling addBatchJobOperations() next time. printf( "Next sequence token for adding next operations is '%s'.%s", $response->getNextSequenceToken(), PHP_EOL ); }
Python
def add_all_batch_job_operations( batch_job_service: BatchJobServiceClient, operations: List[MutateOperation], resource_name: str, ) -> None: """Adds all mutate operations to the batch job. As this is the first time for this batch job, we pass null as a sequence token. The response will contain the next sequence token that we can use to upload more operations in the future. Args: batch_job_service: an instance of the BatchJobService message class. operations: a list of a mutate operations. resource_name: a str of a resource name for a batch job. """ try: response: AddBatchJobOperationsResponse = ( batch_job_service.add_batch_job_operations( resource_name=resource_name, sequence_token=None, # type: ignore mutate_operations=operations, ) ) print( f"{response.total_operations} mutate operations have been " "added so far." ) # You can use this next sequence token for calling # add_batch_job_operations() next time. print( "Next sequence token for adding next operations is " f"{response.next_sequence_token}" ) except GoogleAdsException as exception: handle_googleads_exception(exception)
Ruby
def add_all_batch_job_operations( client, batch_job_service, customer_id, batch_job_resource_name) response = batch_job_service.add_batch_job_operations( resource_name: batch_job_resource_name, mutate_operations: build_all_operations(client, customer_id), ) puts "#{response.total_operations} mutate operations have been added so far." # You can use this next sequence token for calling # add_all_batch_job_operations() next time puts "Next sequence token for adding next operations is " \ "'#{response.next_sequence_token}'" end
Perl
sub add_all_batch_job_operations { my ($batch_job_service, $customer_id, $batch_job_resource_name) = @_; my $add_batch_job_operations_response = $batch_job_service->add_operations({ resourceName => $batch_job_resource_name, sequenceToken => undef, mutateOperations => build_all_operations($customer_id)}); printf "%d batch operations have been added so far.\n", $add_batch_job_operations_response->{totalOperations}; # You can use this next sequence token for calling add_operations() next time. printf "Next sequence token for adding next operations is '%s'.\n", $add_batch_job_operations_response->{nextSequenceToken}; }
curl
# Adds operations to a batch job. # # Variables: # API_VERSION, # CUSTOMER_ID, # DEVELOPER_TOKEN, # MANAGER_CUSTOMER_ID, # OAUTH2_ACCESS_TOKEN: # See https://developers.google.com/google-ads/api/rest/auth#request_headers # for details. # BATCH_JOB_RESOURCE_NAME: # The resource name of the batch job to which the operations should be added # as returned by the previous step. curl -f --request POST \ "https://googleads.googleapis.com/v${API_VERSION}/${BATCH_JOB_RESOURCE_NAME}:addOperations" \ --header "Content-Type: application/json" \ --header "developer-token: ${DEVELOPER_TOKEN}" \ --header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \ --header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \ --data @- <<EOF { "mutateOperations": [ { "campaignBudgetOperation": { "create": { "resourceName": "customers/${CUSTOMER_ID}/campaignBudgets/-1", "name": "batch job budget #${RANDOM}", "deliveryMethod": "STANDARD", "amountMicros": 5000000 } } }, { "campaignOperation": { "create": { "advertisingChannelType": "SEARCH", "status": "PAUSED", "name": "batch job campaign #${RANDOM}", "campaignBudget": "customers/${CUSTOMER_ID}/campaignBudgets/-1", "resourceName": "customers/${CUSTOMER_ID}/campaigns/-2", "manualCpc": { } } }, } ] } EOF
Klicken Sie, um den Inhalt der Funktion zum Erstellen von Vorgängen in GitHub für Ihre Clientbibliothek aufzurufen:
Java
buildAllOperations()
C#
BuildAllOperations()
PHP
buildAllOperations()
Python
build_all_operations()
Ruby
build_all_operations()
Perl
build_all_operations
Batchjob ausführen
Nachdem Sie alle Vorgänge hinzugefügt haben, können Sie die Google Ads API auffordern, den Batch
job auszuführen, indem Sie RunBatchJob für die hochgeladenen Vorgänge aufrufen.
Wenn Sie RunBatchJob aufrufen, nachdem der Job bereits ausgeführt wurde
wird ein
BatchJobError.CANNOT_MODIFY_JOB_AFTER_JOB_STARTS_RUNNING
-Fehler zurückgegeben.
Java
private OperationFuture runBatchJob( BatchJobServiceClient batchJobServiceClient, String batchJobResourceName) { OperationFuture operationResponse = batchJobServiceClient.runBatchJobAsync(batchJobResourceName); // BEWARE! The above call returns an OperationFuture. The execution of that future depends on // the thread pool which is owned by batchJobServiceClient. 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. System.out.printf( "Mutate job with resource name '%s' has been executed.%n", batchJobResourceName); return operationResponse; }
C#
private Operation<Empty, BatchJobMetadata> RunBatchJob( BatchJobServiceClient batchJobService, string batchJobResourceName) { Operation<Empty, BatchJobMetadata> operationResponse = batchJobService.RunBatchJob(batchJobResourceName); Console.WriteLine($"Batch job with resource name '{batchJobResourceName}' has been " + $"executed."); return operationResponse; }
PHP
private static function runBatchJob( BatchJobServiceClient $batchJobServiceClient, string $batchJobResourceName ): OperationResponse { $operationResponse = $batchJobServiceClient->runBatchJob(RunBatchJobRequest::build($batchJobResourceName)); printf( "Batch job with resource name '%s' has been executed.%s", $batchJobResourceName, PHP_EOL ); return $operationResponse; }
Python
def run_batch_job( batch_job_service: BatchJobServiceClient, resource_name: str ) -> Operation: """Runs the batch job for executing all uploaded mutate operations. Args: batch_job_service: an instance of the BatchJobService message class. resource_name: a str of a resource name for a batch job. Returns: a google.api_core.operation.Operation instance. """ try: response: Operation = batch_job_service.run_batch_job( resource_name=resource_name ) print( f'Batch job with resource name "{resource_name}" has been ' "executed." ) return response except GoogleAdsException as exception: handle_googleads_exception(exception) # This line will likely not be reached due to sys.exit(1) in handle_googleads_exception # but to satisfy the type checker, we add a return statement. # In a real application, you might want to return a dummy Operation or raise an error. return Operation( op_type_name="type.googleapis.com/google.protobuf.Empty", complete=True, done_callbacks=[], metadata_type=None, result_type=None, ) # type: ignore
Ruby
def run_batch_job(batch_job_service, batch_job_resource_name) operation_response = batch_job_service.run_batch_job( resource_name: batch_job_resource_name, ) puts "Batch job with resource name '#{batch_job_resource_name}' " \ "has been executed." operation_response end
Perl
sub run_batch_job { my ($batch_job_service, $batch_job_resource_name) = @_; my $batch_job_lro = $batch_job_service->run({resourceName => $batch_job_resource_name}); printf "Batch job with resource name '%s' has been executed.\n", $batch_job_resource_name; return $batch_job_lro; }
curl
# Runs a batch job. # # Variables: # API_VERSION, # CUSTOMER_ID, # DEVELOPER_TOKEN, # MANAGER_CUSTOMER_ID, # OAUTH2_ACCESS_TOKEN: # See https://developers.google.com/google-ads/api/rest/auth#request_headers # for details. # BATCH_JOB_RESOURCE_NAME: # The resource name of the batch job to run as returned by the previous step. curl -f --request POST \ "https://googleads.googleapis.com/v19/${BATCH_JOB_RESOURCE_NAME}:run" \ --header "Content-Type: application/json" \ --header "developer-token: ${DEVELOPER_TOKEN}" \ --header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \ --header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \ --data @- <<EOF {} EOF
Die zurückgegebene Antwort ist ein Objekt mit langer Ausführungszeit Operation (LRO). Das Objekt mit langer Ausführungszeit enthält die Metadaten Ihres Batchjobs sowie Informationen zum Jobstatus.
Status des Batchjobs abfragen, bis er abgeschlossen ist
Im nächsten Schritt wird der Status des Batchjobs mit dem Objekt mit langer Ausführungszeit
GetOperation abgefragt, bis der Wert des Objekts mit langer Ausführungszeit done
true ist.
Java
private void pollBatchJob(OperationFuture operationResponse) { try { operationResponse.get(MAX_TOTAL_POLL_INTERVAL_SECONDS, TimeUnit.SECONDS); } catch (InterruptedException | ExecutionException | TimeoutException e) { System.err.printf("Failed polling the mutate job. Exception: %s%n", e); System.exit(1); } }
C#
private static void PollBatchJob(Operation<Empty, BatchJobMetadata> operationResponse) { PollSettings pollSettings = new PollSettings( Expiration.FromTimeout(TimeSpan.FromSeconds(MAX_TOTAL_POLL_INTERVAL_SECONDS)), TimeSpan.FromSeconds(1)); operationResponse.PollUntilCompleted(pollSettings); }
PHP
private static function pollBatchJob(OperationResponse $operationResponse): void { $operationResponse->pollUntilComplete( [ 'initialPollDelayMillis' => self::POLL_FREQUENCY_SECONDS * 1000, 'totalPollTimeoutMillis' => self::MAX_TOTAL_POLL_INTERVAL_SECONDS * 1000 ] ); }
Python
def poll_batch_job( operations_response: Operation, event: asyncio.Event ) -> None: """Polls the server until the batch job execution finishes. Sets the initial poll delay time and the total time to wait before time-out. Args: operations_response: a google.api_core.operation.Operation instance. event: an instance of asyncio.Event to invoke once the operations have completed, alerting the awaiting calling code that it can proceed. """ loop: asyncio.AbstractEventLoop = asyncio.get_event_loop() def done_callback(future: Coroutine[Any, Any, Any]) -> None: # The operations_response object will call callbacks from a daemon # thread so we must use a threadsafe method of setting the event here # otherwise it will not trigger the awaiting code. loop.call_soon_threadsafe(event.set) # operations_response represents a Long-Running Operation or LRO. The class # provides an interface for polling the API to check when the operation is # complete. Below we use the asynchronous interface, but there's also a # synchronous interface that uses the Operation.result method. # See: https://googleapis.dev/python/google-api-core/latest/operation.html operations_response.add_done_callback(done_callback) # type: ignore
Ruby
def poll_batch_job(operation_response) operation_response.wait_until_done! end
Perl
sub poll_batch_job { my ($operation_service, $batch_job_lro) = @_; $operation_service->poll_until_done({ name => $batch_job_lro->{name}, pollFrequencySeconds => POLL_FREQUENCY_SECONDS, pollTimeoutSeconds => POLL_TIMEOUT_SECONDS }); }
curl
# Gets the status of a batch job. # # Variables: # API_VERSION, # CUSTOMER_ID, # DEVELOPER_TOKEN, # MANAGER_CUSTOMER_ID, # OAUTH2_ACCESS_TOKEN: # See https://developers.google.com/google-ads/api/rest/auth#request_headers # for details. # BATCH_JOB_OPERATION_NAME: # The operation name of the running batch job as returned by the previous # step. curl -f --request GET \ "https://googleads.googleapis.com/v${API_VERSION}/${BATCH_JOB_OPERATION_NAME}" \ --header "Content-Type: application/json" \ --header "developer-token: ${DEVELOPER_TOKEN}" \ --header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \ --header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \
Vorhandenen Vorgang mit langer Ausführungszeit abrufen
Wenn Ihre Anwendung Batchjobs über einen separaten Prozess abfragt oder die Abfrage nach einem Neustart fortsetzen muss, können Sie den Namen des Vorgangs mit langer Ausführungszeit mit GoogleAdsService.Search oder GoogleAdsService.SearchStream abrufen:
Fragen Sie die
batch_jobRessource ab, um daslong_running_operationFeld zu lesen:SELECT batch_job.id, batch_job.status, batch_job.long_running_operation FROM batch_job WHERE batch_job.id = BATCH_JOB_IDPrüfen Sie, ob
batch_job.statusden WertRUNNINGoderDONEhat (long_running_operationwird erst nach dem Aufruf vonRunBatchJobausgefüllt und ist nicht festgelegt, solange der Job den StatusPENDINGhat). Lesen Sie dann den Stringlong_running_operationaus dem zurückgegebenenBatchJob-Objekt.Übergeben Sie diesen Vorgangsnamenstring an
GetOperationfür Ihre ClientbibliothekOperationsClient, um denOperation-Vorgang zu prüfen oder die Abfrage fortzusetzen.
Metadaten von Vorgängen
Wenn Sie den Vorgang mit langer Ausführungszeit abfragen, enthält das metadata Feld in der
Operation Antwort zusätzliche Details zum
Fortschritt des Batchjobs. Dieses Feld enthält ein
BatchJobMetadata-Objekt. Wichtige Unterfelder sind:
creation_date_time: Der Zeitstempel, der angibt, wann der Batchjob erstellt wurde.start_date_time: Der Zeitstempel, der angibt, wann der Batchjob gestartet wurde.completion_date_time: Der Zeitstempel, der angibt, wann der Batchjob abgeschlossen wurde (nur vorhanden, wenn der Job abgeschlossen ist).estimated_completion_ratio: Eine Schätzung des Anteils des Jobs (zwischen 0,0 und 1,0), der abgeschlossen wurde.operation_count: Die Gesamtzahl der Vorgänge im Batchjob.executed_operation_count: Die Anzahl der bisher ausgeführten Vorgänge.execution_limit_seconds: Die ungefähre Obergrenze in Sekunden für die Ausführungsdauer des Batchjobs, bevor er abgebrochen wird.
Anhand dieser Felder, insbesondere estimated_completion_ratio
und der Anzahl der Vorgänge, können Sie den Fortschritt des Jobs einschätzen, die verbleibende Zeit schätzen und die Abfragehäufigkeit anpassen. Sie können beispielsweise weniger häufig abfragen
, wenn estimated_completion_ratio
niedrig ist, und häufiger, wenn der Wert sich 1,0 nähert.
Alle Batchjob-Ergebnisse auflisten
Wenn alle Ihre Batchjobs abgeschlossen sind, verwenden Sie
ListBatchJobResults, um die Ergebnisse aufzulisten und
die Status und Antworten auszugeben:
Java
private void fetchAndPrintResults( BatchJobServiceClient batchJobServiceClient, String batchJobResourceName) { System.out.printf( "Mutate job with resource name '%s' has finished. Now, printing its results...%n", batchJobResourceName); // Gets all the results from running mutate job and prints their information. ListBatchJobResultsPagedResponse batchJobResults = batchJobServiceClient.listBatchJobResults( ListBatchJobResultsRequest.newBuilder() .setResourceName(batchJobResourceName) .setPageSize(PAGE_SIZE) .build()); for (BatchJobResult batchJobResult : batchJobResults.iterateAll()) { System.out.printf( "Mutate job #%d has a status '%s' and response of type '%s'.%n", batchJobResult.getOperationIndex(), batchJobResult.getStatus().getMessage().isEmpty() ? "N/A" : batchJobResult.getStatus().getMessage(), batchJobResult .getMutateOperationResponse() .getResponseCase() .equals(ResponseCase.RESPONSE_NOT_SET) ? "N/A" : batchJobResult.getMutateOperationResponse().getResponseCase()); } }
C#
private static void FetchAndPrintResults(BatchJobServiceClient batchJobService, string batchJobResourceName) { Console.WriteLine($"batch job with resource name '{batchJobResourceName}' has " + $"finished. Now, printing its results..."); ListBatchJobResultsRequest request = new ListBatchJobResultsRequest() { ResourceName = batchJobResourceName, PageSize = PAGE_SIZE, }; ListBatchJobResultsResponse resp = new ListBatchJobResultsResponse(); // Gets all the results from running batch job and prints their information. foreach (BatchJobResult batchJobResult in batchJobService.ListBatchJobResults(request)) { if (!batchJobResult.IsFailed) { Console.WriteLine($"batch job result #{batchJobResult.OperationIndex} is " + $"successful and response is of type " + $"'{batchJobResult.MutateOperationResponse.ResponseCase}'."); } else { Console.WriteLine($"batch job result #{batchJobResult.OperationIndex} " + $"failed with error message {batchJobResult.Status.Message}."); foreach (GoogleAdsError error in batchJobResult.Failure.Errors) { Console.WriteLine($"Error found: {error}."); } } } }
PHP
private static function fetchAndPrintResults( BatchJobServiceClient $batchJobServiceClient, string $batchJobResourceName ): void { printf( "Batch job with resource name '%s' has finished. Now, printing its results...%s", $batchJobResourceName, PHP_EOL ); // Gets all the results from running batch job and print their information. $batchJobResults = $batchJobServiceClient->listBatchJobResults( ListBatchJobResultsRequest::build($batchJobResourceName)->setPageSize(self::PAGE_SIZE) ); foreach ($batchJobResults->iterateAllElements() as $batchJobResult) { /** * @var BatchJobResult $batchJobResult */ printf( "Batch job #%d has a status '%s' and response of type '%s'.%s", $batchJobResult->getOperationIndex(), $batchJobResult->getStatus() ? $batchJobResult->getStatus()->getMessage() : 'N/A', $batchJobResult->getMutateOperationResponse() ? $batchJobResult->getMutateOperationResponse()->getResponse() : 'N/A', PHP_EOL ); } }
Python
def fetch_and_print_results( client: GoogleAdsClient, batch_job_service: BatchJobServiceClient, resource_name: str, ) -> None: """Prints all the results from running the batch job. Args: client: an initialized GoogleAdsClient instance. batch_job_service: an instance of the BatchJobService message class. resource_name: a str of a resource name for a batch job. """ print( f'Batch job with resource name "{resource_name}" has finished. ' "Now, printing its results..." ) list_results_request: ListBatchJobResultsRequest = client.get_type( "ListBatchJobResultsRequest" ) list_results_request.resource_name = resource_name list_results_request.page_size = 1000 # Gets all the results from running batch job and prints their information. batch_job_results: ListBatchJobResultsResponse = ( batch_job_service.list_batch_job_results(request=list_results_request) ) for batch_job_result in batch_job_results: status: str = batch_job_result.status.message status = status if status else "N/A" result: Any = batch_job_result.mutate_operation_response result = result or "N/A" print( f"Batch job #{batch_job_result.operation_index} " f'has a status "{status}" and response type "{result}"' )
Ruby
def fetch_and_print_results(batch_job_service, batch_job_resource_name) puts "Batch job with resource name '#{batch_job_resource_name}' has " \ "finished. Now, printing its results..." \ # Gets all the results from running batch job and print their information. batch_job_results = batch_job_service.list_batch_job_results( resource_name: batch_job_resource_name, page_size: PAGE_SIZE, ) batch_job_results.each do |result| puts "Batch job ##{result.operation_index} has a status " \ "#{result.status ? result.status.message : 'N/A'} and response of type " \ "#{result.mutate_operation_response ? result.mutate_operation_response.response : 'N/A'}" end end
Perl
sub fetch_and_print_results { my ($batch_job_service, $batch_job_resource_name) = @_; printf "Batch job with resource name '%s' has finished. " . "Now, printing its results...\n", $batch_job_resource_name; # Get all the results from running batch job and print their information. my $list_batch_job_results_response = $batch_job_service->list_results({ resourceName => $batch_job_resource_name, pageSize => PAGE_SIZE }); foreach my $batch_job_result (@{$list_batch_job_results_response->{results}}) { printf "Batch job #%d has a status '%s' and response of type '%s'.\n", $batch_job_result->{operationIndex}, $batch_job_result->{status} ? $batch_job_result->{status}{message} : "N/A", $batch_job_result->{mutateOperationResponse} ? [keys %{$batch_job_result->{mutateOperationResponse}}]->[0] : "N/A"; } }
curl
# Gets the results of a batch job. # # Variables: # API_VERSION, # CUSTOMER_ID, # MANAGER_CUSTOMER_ID, # OAUTH2_ACCESS_TOKEN: # See https://developers.google.com/google-ads/api/rest/auth#request_headers # for details. # BATCH_JOB_RESOURCE_NAME: # The operation name of the running batch job as returned by the previous # step. curl -f --request GET \ "https://googleads.googleapis.com/v${API_VERSION}/${BATCH_JOB_RESOURCE_NAME}:listResults?pageSize=1000" \ --header "Content-Type: application/json" \ --header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \ --header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}"
In ListBatchJobResultsRequest wird das
page_size Feld standardmäßig auf den Maximalwert 1000 gesetzt, wenn es
weggelassen oder auf 0 gesetzt wird. Wenn Sie page_size auf einen Wert über
1000 oder unter 0 setzen, wird ein
BatchJobError.INVALID_PAGE_SIZE Fehler zurückgegeben.
Jedes BatchJobResult identifiziert den entsprechenden Vorgang
mit operation_index, dem nullbasierten Index des
hochgeladenen MutateOperation im Batchjob.
- Erfolgreicher Vorgang:
mutate_operation_responseist ausgefüllt. Dieresponseenthält denresource_nameder geänderten Ressource sowie alle änderbaren Felder, wennresponse_content_typeaufMUTABLE_RESOURCEgesetzt ist.statusist nicht festgelegt. - Fehlgeschlagener (oder nicht ausgeführter) Vorgang:
mutate_operation_responseist nicht festgelegt undstatusenthält die Fehlerdetails für den Vorgang.
Batchjob abbrechen oder entfernen
Wie Sie einen Batchjob beenden oder verwerfen, hängt davon ab, ob
RunBatchJob aufgerufen wurde:
- Vor dem Aufruf von
RunBatchJob: Solange derstatusdes JobsPENDINGist, können Sie den Batchjob verwerfen, indem SieMutateBatchJobmitBatchJobOperation.removeaufrufen. Wenn Sieremoveaufrufen, nachdem der Job bereits ausgeführt wurde, wird einBatchJobError.CAN_ONLY_REMOVE_PENDING_JOBFehler zurückgegeben. - Nach dem Aufruf von
RunBatchJob: Sobald ein Vorgang mit langer Ausführungszeit vorhanden ist, können Sie versuchen, den laufenden Batchjob abzubrechen, indem SieCancelOperationfür den Vorgang mit langer Ausführungszeit aufrufen. Da Standardvorgänge in einem Batchjob mit aktivierter teilweiser Fehlerbehebung ausgeführt werden (Vorgänge in atomaren Unter-Batches werden gemeinsam zurückgesetzt), werden beim Abbrechen eines Batchjobs keine Vorgänge zurückgesetzt, die bereits abgeschlossen waren, bevor der Abbruch wirksam wurde. Sobald der abgebrochene (oder beendete) Job'sstatuszuDONEwechselt, gibt der Aufruf vonListBatchJobResultsBatchJobResult-Einträge für das ausgeführte Präfix (operation_index<executed_operation_count) mit den jeweiligen Ausführungsergebnissen zurück, gefolgt vonBatchJobResult-Einträgen für alle verbleibenden nicht ausgeführten Vorgänge (operation_indexvonexecuted_operation_countbisoperation_count- 1), wobeimutate_operation_responsenicht festgelegt ist undstatusmit dem Fehlerstatus auf Jobebene ausgefüllt ist (oderInternalError.INTERNAL_ERROR).
Fehlerbehandlung
BatchJobService führt Standardvorgänge mit
aktivierter teilweiser Fehlerbehebung aus. Erfolgreiche Vorgänge werden übernommen, auch wenn andere Vorgänge im selben Job fehlschlagen (außer in
atomaren Unter-Batches). Vorgänge, die aufgrund vorübergehender Fehler fehlschlagen, werden automatisch wiederholt. Allerdings lassen sich nicht alle Fehlerszenarien vermeiden. Vorgänge, die aufgrund von Validierungsfehlern fehlgeschlagen sind, können korrigiert und in einem neuen Batchjob noch einmal gesendet werden. Wenn ein Batchjob
abgebrochen wird oder beendet wird, bevor alle Vorgänge abgeschlossen sind, können Sie die nicht ausgeführten Vorgänge (operation_index
>= executed_operation_count) zusammen mit allen fehlgeschrittenen
Vorgängen aus dem ausgeführten Präfix in einem neuen Batchjob noch einmal senden.