ماسک‌های فیلد

در Google Ads API، به‌روزرسانی‌ها بااستفاده از ماسک فیلد انجام می‌شود. پوشش فیلد (google.protobuf.FieldMask) حاوی فهرستی از مسیرهای فیلد در snake_case است که قصد دارید با به‌روزرسانی تغییر دهید. هر فیلد مشخص‌شده‌ای که در ماسک فیلد نباشد نادیده گرفته می‌شود، حتی اگر به سرور ارسال شده باشد.

ابزار FieldMasks

روش توصیه‌شده برای تولید ماسک‌های فیلد در کتابخانه کارخواه Java استفاده از کلاس ابزار داخلی FieldMasks است که به شما امکان می‌دهد ماسک‌های فیلد را از یک شیء اصلاح‌شده تولید کنید، به‌جای اینکه آن‌ها را از ابتدا بسازید.

در اینجا مثالی برای به‌روزرسانی پویش آورده شده است:

// Creates a Campaign object with the proper resource name and any other
// changes.
Campaign campaign =
    Campaign.newBuilder()
        .setResourceName(ResourceNames.campaign(customerId, campaignId))
        .setStatus(CampaignStatus.PAUSED)
        .build();

// Constructs an operation that updates the campaign, using the
// FieldMasks.allSetFieldsOf utility to derive the update mask. This mask tells
// the Google Ads API which attributes of the campaign you want to change.
CampaignOperation operation =
    CampaignOperation.newBuilder()
        .setUpdate(campaign)
        .setUpdateMask(FieldMasks.allSetFieldsOf(campaign))
        .build();

// Sends the operation in a mutate request.
MutateCampaignsResponse response =
    campaignServiceClient.mutateCampaigns(
        customerId.toString(), Collections.singletonList(operation));

این مثال ابتدا یک سازنده Campaign خالی ایجاد می‌کند و نام منبع آن را تنظیم می‌کند تا API بداند کدام پویش درحال به‌روزرسانی است.

سپس این نمونه FieldMasks.allSetFieldsOf() را در کمپین فراخوانی می‌کند تا به‌طور خودکار ماسک فیلدی تولید کند که همه فیلدهای تنظیم‌شده را برمی‌شمارد. می‌توانید ماسک برگردانده‌شده را مستقیماً به تماس به‌روزرسانی منتقل کنید.

اگر لازم است با شیء موجودی کار کنید و چند فیلد را به‌روز کنید، از FieldMasks.compare() به‌صورت زیر استفاده کنید:

// Assumes existingCampaign was retrieved from a previous API call.

// Creates a new campaign based on the existing campaign and updates the
// campaign by setting its status to paused.
Campaign campaignToUpdate =
    existingCampaign.toBuilder()
        .setStatus(CampaignStatus.PAUSED)
        .build();

// Constructs an operation that updates the campaign, using the
// FieldMasks.compare utility to derive the update mask. This mask tells the
// Google Ads API which attributes of the campaign you want to change.
CampaignOperation operation =
    CampaignOperation.newBuilder()
        .setUpdate(campaignToUpdate)
        .setUpdateMask(FieldMasks.compare(existingCampaign, campaignToUpdate))
        .build();

// Sends the operation in a mutate request.
MutateCampaignsResponse response =
    campaignServiceClient.mutateCampaigns(
        customerId.toString(), Collections.singletonList(operation));

برای ایجاد ماسک فیلد از ابتدا، یک FieldMask سازنده ایجاد کنید و snake_case نام هر فیلدی را که قصد تغییر آن را دارید اضافه کنید:

FieldMask fieldMask =
    FieldMask.newBuilder()
        .addPaths("status")
        .addPaths("name")
        .build();

به‌روزرسانی فیلدهای پیام و زیرفیلدهای آن‌ها

فیلدهای MESSAGE می‌توانند فیلدهای فرعی داشته باشند (مثل MaximizeConversions که target_cpa_micros، cpc_bid_ceiling_micros، و cpc_bid_floor_micros دارد)، یا می‌توانند فیلد فرعی نداشته باشند (مثل ManualCpm).

فیلدهای پیام بدون زیرفیلدهای تعریف‌شده

هنگام به‌روزرسانی فیلد MESSAGE که با هیچ زیرفیلدی تعریف نشده است، از ابزار کمکی FieldMasks برای تولید ماسک فیلد استفاده کنید، همان‌طور که در بخش قبلی توضیح داده شده است.

فیلدهای پیام با زیرفیلدهای تعریف‌شده

هنگام به‌روزرسانی فیلد MESSAGE که زیرفیلدهای تعریف‌شده‌ای دارد، بدون اینکه صریحاً هیچ‌کدام از زیرفیلدها را در آن پیام تنظیم کنید، باید هرکدام از زیرفیلدهای MESSAGE تغییرپذیر را به‌صورت دستی به FieldMask اضافه کنید، مشابه ایجاد ماسک فیلد از ابتدا.

یک نمونه رایج به‌روزرسانی راهبرد پیشنهاد قیمت پویش (فیلد oneof campaign_bidding_strategy) بدون تنظیم هیچ‌یک از فیلدها در راهبرد پیشنهاد قیمت جدید است. مثال زیر نشان می‌دهد که چگونه یک کمپین را به‌روزرسانی کنید تا از استراتژی پیشنهاد قیمت MaximizeConversions استفاده کند، بدون اینکه هیچ‌یک از زیرفیلدها را در استراتژی پیشنهاد قیمت تنظیم کنید.

در این مورد، استفاده از روش‌های allSetFieldsOf() و compare() FieldMasks به‌تنهایی به هدف موردنظر نمی‌رسد.

مثال زیر ماسک فیلدی تولید می‌کند که شامل maximize_conversions است. بااین‌حال، Google Ads API به مسیرهای پیام سطح بالا که دارای زیرفیلد در ماسک به‌روزرسانی هستند اجازه نمی‌دهد (برای جلوگیری از پاک شدن تصادفی زیرفیلدها) و خطای FieldMaskError.FIELD_HAS_SUBFIELDS را برمی‌گرداند.

// Creates a campaign with the proper resource name and an empty
// MaximizeConversions field.
Campaign campaign =
    Campaign.newBuilder()
        .setResourceName(ResourceNames.campaign(customerId, campaignId))
        .setMaximizeConversions(MaximizeConversions.newBuilder().build())
        .build();

// Constructs an operation using FieldMasks.allSetFieldsOf to derive the update
// mask. The field mask includes 'maximize_conversions', which produces a
// FieldMaskError.FIELD_HAS_SUBFIELDS error.
CampaignOperation operation =
    CampaignOperation.newBuilder()
        .setUpdate(campaign)
        .setUpdateMask(FieldMasks.allSetFieldsOf(campaign))
        .build();

// Sends the operation in a mutate request that results in a
// FieldMaskError.FIELD_HAS_SUBFIELDS error because empty MESSAGE fields with
// subfields cannot be included directly in a field mask.
MutateCampaignsResponse response =
    campaignServiceClient.mutateCampaigns(
        customerId.toString(), Collections.singletonList(operation));

مثال زیر نشان می‌دهد که چگونه یک پویش را به‌درستی به‌روز کنید تا از MaximizeConversions راهبرد پیشنهاد قیمت بدون تنظیم هیچ‌یک از زیرفیلدهای آن استفاده کند. درباره اختصاص دادن استراتژی‌های پیشنهاد قیمت استاندارد و سبد سهام بیشتر بدانید.

// Creates a Campaign object with the proper resource name.
Campaign campaign =
    Campaign.newBuilder()
        .setResourceName(ResourceNames.campaign(customerId, campaignId))
        .build();

// Creates a field mask from the campaign and adds the mutable subfield
// ('maximize_conversions.target_cpa_micros') on the MaximizeConversions
// bidding strategy to the field mask. Because this subfield is included in the
// field mask while excluded from the campaign object, the Google Ads API
// switches the campaign's bidding strategy oneof to MaximizeConversions with
// target_cpa_micros unset.
FieldMask fieldMask =
    FieldMasks.allSetFieldsOf(campaign).toBuilder()
        .addPaths("maximize_conversions.target_cpa_micros")
        .build();

// Creates an operation to update the campaign with the specified fields.
CampaignOperation operation =
    CampaignOperation.newBuilder()
        .setUpdate(campaign)
        .setUpdateMask(fieldMask)
        .build();

پاک کردن فیلدها

برخی‌از فیلدها را می‌توان به‌طور صریح پاک کرد. مشابه مثال قبلی، باید این فیلدها را به‌طور صریح به ماسک فیلد اضافه کنید و آن‌ها را در شیء پیام تنظیم‌نشده باقی بگذارید. برای مثال، فرض کنید کمپینی دارید که از استراتژی پیشنهاد قیمت MaximizeConversions استفاده می‌کند و فیلد target_cpa_micros با مقداری بزرگ‌تر از 0 تنظیم شده است.

کد زیر اجرا می‌شود، اما maximize_conversions.target_cpa_micros طبق انتظار پاک نمی‌شود:

// Creates a campaign with the proper resource name and a MaximizeConversions
// object with target_cpa_micros set to 0L.
Campaign campaign =
    Campaign.newBuilder()
        .setResourceName(ResourceNames.campaign(customerId, campaignId))
        .setMaximizeConversions(
            MaximizeConversions.newBuilder().setTargetCpaMicros(0L).build())
        .setStatus(CampaignStatus.PAUSED)
        .build();

// Constructs an operation using FieldMasks.allSetFieldsOf to derive the
// update mask.
CampaignOperation operation =
    CampaignOperation.newBuilder()
        .setUpdate(campaign)
        .setUpdateMask(FieldMasks.allSetFieldsOf(campaign))
        .build();

// Sends the operation in a mutate request that does not clear the field
// cleanly.
MutateCampaignsResponse response =
    campaignServiceClient.mutateCampaigns(
        customerId.toString(), Collections.singletonList(operation));

مثال بعدی نشان می‌دهد که چگونه فیلد target_cpa_micros را در استراتژی پیشنهاد قیمت MaximizeConversions به‌درستی پاک کنید.

// Creates a Campaign object with the proper resource name.
Campaign campaign =
    Campaign.newBuilder()
        .setResourceName(ResourceNames.campaign(customerId, campaignId))
        .build();

// Constructs a field mask from the campaign and adds the
// 'maximize_conversions.target_cpa_micros' field to the field mask, which
// clears this field from the bidding strategy without impacting any other
// fields on the bidding strategy.
FieldMask fieldMask =
    FieldMasks.allSetFieldsOf(campaign).toBuilder()
        .addPaths("maximize_conversions.target_cpa_micros")
        .build();

// Creates an operation to update the campaign with the specified field.
CampaignOperation operation =
    CampaignOperation.newBuilder()
        .setUpdate(campaign)
        .setUpdateMask(fieldMask)
        .build();