Aktualizacje z użyciem masek pól

W interfejsie Google Ads API aktualizacje są przeprowadzane za pomocą maski pola. Maska pola zawiera listę wszystkich pól, które chcesz zmienić w ramach aktualizacji. Wszystkie pola, które nie znajdują się w masce, są ignorowane, nawet jeśli zostaną wysłane na serwer.

FieldMaskUtil

Zalecanym sposobem generowania masek pól jest użycie wbudowanego narzędzia do generowania masek pól, które ukrywa wiele szczegółowych informacji i umożliwia automatyczne generowanie masek pól na podstawie zmian wprowadzonych w polach danego elementu.

Aby wygenerować maskę pola na potrzeby aktualizacji kampanii:

campaign = client.resource.campaign
campaign.resource_name = client.path.campaign(customer_id, campaign_id)

mask = client.field_mask.with campaign do
  campaign.status = :PAUSED
  campaign.network_settings = client.resource.network_settings do |ns|
    ns.target_search_network = false
  end
end

Kod najpierw tworzy pusty obiekt Campaign, a potem ustawia jego nazwę zasobu, aby poinformować interfejs API o zmienianej kampanii.

W tym przykładzie do rozpoczęcia bloku obejmującego aktualizacje używamy metody client.field_mask.with w kampanii. Na końcu tego bloku narzędzie porównuje bieżący stan kampanii po wprowadzeniu blokady ze stanem kampanii przed wprowadzeniem blokady i automatycznie generuje maskę pól, która wylicza zmienione pola. Możesz podać tę maskę pola podczas tworzenia operacji dla wywołania metody mutate w ten sposób:

operation = client.operation.campaign
operation.update = campaign
operation.update_mask = mask

Ta metoda jest zalecana, gdy wykonujesz skomplikowaną operację i chcesz mieć pełną kontrolę nad każdym krokiem. W większości przypadków możesz jednak użyć prostszego narzędzia Ruby:

operation = client.operation.update_resource.campaign do |c|
  c.status = :PAUSED
  c.network_settings = client.resource.network_settings do |ns|
    ns.target_search_network = false
  end
end

Ta metoda automatycznie tworzy nowy pusty zasób kampanii, tworzy maskę pola na podstawie zmian wprowadzonych w bloku, tworzy operację aktualizacji i zwraca operację końcową z wstępnie wypełnionymi polami updateupdate_mask. Możesz też przekazać kampanię metodzie campaign, aby określić stan początkowy kampanii. Ten wzór działa w przypadku wszystkich zasobów, które obsługują operację aktualizacji.

Ręczne tworzenie maski

Aby utworzyć maskę pola od podstaw, bez używania żadnych narzędzi biblioteki, musisz najpierw utworzyć Google::Protobuf::FieldMask, a następnie tablicę wypełnioną nazwami wszystkich pól, które chcesz zmienić, i w końcu przypisać tablicę do pola path maski pola.

mask = Google::Protobuf::FieldMask.new
mask.path = ["status", "name"]

Aktualizowanie pól wiadomości i ich podpól

Pola MESSAGE mogą mieć pola podrzędne (np. MaximizeConversions, które ma 3 pola: target_cpa_micros, cpc_bid_ceiling_micros i cpc_bid_floor_micros), albo w ogóle ich nie mieć (np. ManualCpm).

Pola wiadomości bez zdefiniowanych pól podrzędnych

Podczas aktualizowania pola MESSAGE, które nie jest zdefiniowane za pomocą żadnych pól podrzędnych, użyj FieldMaskUtil, aby wygenerować maskę pola, jak opisano wcześniej.

Pola wiadomości z zdefiniowanymi podpolami

Podczas aktualizowania pola MESSAGE zdefiniowanego za pomocą podpól bez jawnego ustawiania podpól w danej wiadomości musisz ręcznie dodać do pola FieldMask wszystkie zmienialne podpola MESSAGE, podobnie jak w przykładzie z wcześniejszej części, w którym maska pola została utworzona od podstaw.

Typowym przykładem jest aktualizacja strategii ustalania stawek w kampanii bez ustawiania żadnych pól w nowej strategii ustalania stawek. W tym przykładzie pokazujemy, jak zaktualizować kampanię, aby używała strategii ustalania stawek MaximizeConversions bez ustawiania żadnych podpól strategii ustalania stawek.

W tym przykładzie użycie wbudowanego porównania FieldMaskUtil nie osiąga zamierzonego celu.

Podany niżej kod generuje maskę pola, która zawiera maximize_conversions. Interfejs Google Ads API nie zezwala jednak na takie działanie, aby zapobiec przypadkowemu oczyszczeniu pól i wystąpieniu błędu FieldMaskError.FIELD_HAS_SUBFIELDS.

# Creates a campaign with the proper resource name.
campaign = client.resource.campaign do |c|
  c.resource_name = client.path.campaign(customer_id, campaign_id)
end

# Update the maximize conversions field within the update block, so it's
# captured in the field mask
operation = client.operation.update_resource.campaign(campaign) do |c|
  c.maximize_conversions = client.resource.maximize_conversions
end

# Sends the operation in a mutate request that will result in a
# FieldMaskError.FIELD_HAS_SUBFIELDS error because empty MESSAGE fields cannot
# be included in a field mask.
response = client.service.campaign.mutate_campaigns(
  customer_id: customer_id,
  operations: [operation],
)

Poniższy kod pokazuje, jak prawidłowo zaktualizować kampanię, aby używała strategii ustalania stawek MaximizeConversions bez ustawiania żadnych jej pól podrzędnych.

# Create the operation directly from the campaign's resource name. Don't do
# anything in the block so that the field mask is empty. You could modify other
# fields in this block, just not the message field that is intended to have a
# blank subfield. We'll add that below.
campaign_resource_name = client.path.campaign(customer_id, campaign_id)
operation = client.operation.update_resource.campaign(campaign_resource_name) {}

# Manually add the maximize conversions subfield to the field mask so the API
# knows to clear it.
operation.update_mask.paths << "maximize_conversions.target_cpa_micros"

# This operation succeeds.
response = client.service.campaign.mutate_campaigns(
  customer_id: customer_id,
  operations: [operation],
)

Czyszczenie pól

Niektóre pola można wyczyścić. Podobnie jak w poprzednim przykładzie, musisz wyraźnie dodać te pola do maski pola. Załóżmy na przykład, że masz kampanię, która korzysta ze strategii ustalania stawek MaximizeConversions, a w polu target_cpa_micros ustawiona jest wartość większa niż 0.

Ten kod jest wykonywany, ale pole maximize_conversions.target_cpa_micros nie zostanie dodane do maski pola, więc w polu target_cpa_micros nie zostaną wprowadzone żadne zmiany:

# Create a campaign object representing the campaign you want to change.
campaign = client.resource.campaign do |c|
  c.resource_name = client.path.campaign(customer_id, campaign_id)
end

# The field mask in this operation will include 'maximize_conversions',
# but not 'maximize_conversions.target_cpa_micros', so it will result in an
# error.
operation = client.operation.update_resource.campaign(campaign) do |c|
  c.maximize_conversions = client.resource.maximize_conversions do |mc|
    mc.target_cpa_micros = 0
  end
end

# Operation will fail since field mask is incorrect.
response = client.service.campaign.mutate_campaigns(
  customer_id: customer_id,
  operations: [operation],
end

Poniższy kod pokazuje, jak prawidłowo wyczyścić pole target_cpa_micros w strategii ustalania stawek MaximizeConversions.

# Create a campaign including the maximize conversions fields right away, since
# we're going to manually add them to the field mask.
campaign = client.resource.campaign do |c|
  c.resource_name = client.path.campaign(customer_id, campaign_id)
  c.maximize_conversions = client.resource.maximize_conversions do |mc|
    mc.target_cpa_micros = 0
  end
end

# Create the operation with an empty field mask. You may add a block here with
# other changes that will automatically get added to the field mask.
operation = client.operation.update_resource.campaign(campaign) {}

# Add the field to the field mask so the API knows to clear it.
operation.update_mask.paths << 'maximize_conversions.target_cpa_micros'

# Operation will succeed since we specified the correct field mask.
response = client.service.campaign.mutate_campaigns(
  customer_id: customer_id,
  operations: [operation],
end

Pamiętaj, że kod „incorrect” działa zgodnie z oczekiwaniami w przypadku pól zdefiniowanych jako optional w interfejsie Google Ads API protocol buffers. Ponieważ jednak pole target_cpa_micros nie jest polem optional, kod „incorrect” nie aktualizuje strategii ustalania stawek, aby wyczyścić pole target_cpa.