Update Menggunakan Mask Kolom

Di Google Ads API, pembaruan dilakukan menggunakan mask kolom. Mask kolom mencantumkan semua kolom yang ingin Anda ubah dengan pembaruan, dan setiap kolom tertentu yang tidak ada dalam mask kolom akan diabaikan, meskipun dikirim ke server.

FieldMaskUtil

Cara yang direkomendasikan untuk menghasilkan mask kolom adalah menggunakan utilitas mask kolom bawaan kami yang menyembunyikan banyak detail spesifik dan memungkinkan Anda membuat mask kolom secara otomatis dengan memantau perubahan yang dibuat pada kolom entity.

Berikut cara membuat mask kolom untuk memperbarui kampanye:

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

Kode tersebut terlebih dahulu membuat objek Kampanye kosong, lalu menetapkan nama resource-nya untuk memberi tahu API kampanye yang sedang diperbarui.

Contoh ini menggunakan metode client.field_mask.with pada kampanye untuk memulai blok yang mencakup pembaruan. Di akhir blok ini, utilitas akan membandingkan status kampanye saat ini setelah pemblokiran dengan status awal kampanye sebelum blok, dan otomatis menghasilkan mask kolom yang menguraikan kolom yang diubah. Anda dapat memberikan mask kolom tersebut ke operasi saat membuatnya untuk panggilan mutate seperti berikut:

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

Metode ini direkomendasikan saat Anda melakukan operasi yang rumit dan ingin kontrol yang sangat baik atas setiap langkahnya. Namun, untuk sebagian besar kasus, Anda dapat menggunakan utilitas library Ruby yang lebih sederhana:

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

Metode ini otomatis membuat resource kampanye kosong baru, membuat mask kolom berdasarkan perubahan yang Anda lakukan dalam blok, membangun operasi update, dan menampilkan operasi akhir dengan update dan update_mask sudah terisi. Anda juga dapat meneruskan kampanye ke metode campaign untuk menentukan status awal kampanye. Pola ini berfungsi untuk semua resource yang mendukung operasi update.

Membuat mask secara manual

Untuk membuat mask kolom dari awal, tanpa menggunakan utilitas library, Anda harus membuat Google::Protobuf::FieldMask terlebih dahulu, lalu membuat array yang terisi dengan nama semua kolom yang ingin Anda ubah, dan terakhir menetapkan array ke kolom path mask kolom.

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

Memperbarui kolom pesan dan subkolomnya

Kolom MESSAGE dapat memiliki subkolom (seperti MaximizeConversions yang memiliki tiga: target_cpa_micros, cpc_bid_ceiling_micros, dan cpc_bid_floor_micros), atau kolom tersebut dapat tidak memiliki subkolom sama sekali (seperti ManualCpm).

Kolom pesan tanpa subkolom yang ditentukan

Saat memperbarui kolom MESSAGE yang tidak ditentukan dengan subkolom apa pun, gunakan FieldMaskUtil untuk membuat mask kolom, seperti yang ditampilkan sebelumnya.

Kolom pesan dengan subkolom yang ditentukan

Saat memperbarui kolom MESSAGE yang ditentukan dengan subkolom tanpa secara eksplisit menetapkan salah satu subkolom pada pesan tersebut, Anda harus menambahkan secara manual setiap subkolom MESSAGE yang dapat diubah ke FieldMask, mirip dengan contoh sebelumnya yang membuat mask kolom dari awal.

Salah satu contoh umumnya adalah memperbarui strategi bidding kampanye tanpa menetapkan salah satu kolom di strategi bidding baru. Contoh berikut menunjukkan cara memperbarui kampanye untuk menggunakan strategi bidding MaximizeConversions tanpa menetapkan subkolom apa pun di strategi bidding.

Untuk contoh ini, menggunakan perbandingan bawaan dengan FieldMaskUtil tidak mencapai tujuan yang dimaksudkan.

Kode berikut menghasilkan mask kolom yang menyertakan maximize_conversions. Namun, Google Ads API tidak mengizinkan perilaku ini agar kolom tidak dihapus secara tidak sengaja dan menghasilkan error 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],
)

Kode berikut menunjukkan cara memperbarui kampanye dengan benar untuk menggunakan strategi bidding MaximizeConversions tanpa menetapkan subkolomnya.

# 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],
)

Mengosongkan kolom

Beberapa kolom dapat dihapus secara eksplisit. Serupa dengan contoh sebelumnya, Anda harus menambahkan kolom ini secara eksplisit ke mask kolom. Misalnya, Anda memiliki kampanye yang menggunakan strategi bidding MaximizeConversions dan kolom target_cpa_micros ditetapkan dengan nilai yang lebih besar dari 0.

Kode berikut berjalan; tetapi, maximize_conversions.target_cpa_micros tidak akan ditambahkan ke mask kolom sehingga tidak ada perubahan yang dilakukan pada kolom target_cpa_micros:

# 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

Kode berikut menunjukkan cara menghapus kolom target_cpa_micros dengan benar pada strategi bidding 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

Perhatikan bahwa kode yang "salah" berfungsi sebagaimana mestinya untuk kolom yang ditentukan sebagai optional di protocol buffers Google Ads API. Namun, karena target_cpa_micros bukan kolom optional, kode yang "salah" tidak memperbarui strategi bidding untuk menghapus kolom target_cpa.