สถานะการเปลี่ยนแปลงเป็นวิธีการติดตาม ว่าทรัพยากรใดมีการเปลี่ยนแปลงในบัญชีในช่วงเวลาที่กำหนด ถ้า ทรัพยากรมีการเปลี่ยนแปลงหลายรายการในช่วงเวลาที่กำหนด เหลือเพียง ระบบจะแสดงการเปลี่ยนแปลงล่าสุด จากนั้นคุณจะสามารถตัดสินใจได้ว่าต้องซิงค์ ค่าของฐานข้อมูลในเครื่องที่มีการเปลี่ยนแปลงภายในช่วงระยะเวลา
ตัวอย่างเช่น ถ้าในระหว่างระยะเวลาที่กำหนด คุณเพิ่ม และอัปเดต
แคมเปญ เฉพาะสถานะการเปลี่ยนแปลงของ UPDATE
เท่านั้น ไม่ใช่ ADD
แสดง หากคุณย้ายจุดสิ้นสุดของกรอบเวลาไปก่อนช่วงเวลา
อัปเดต คุณจะเห็นการดำเนินการ ADD
หากคุณต้องการผลลัพธ์แบบฟิลด์ต่อฟิลด์ที่มีมุมมองโดยละเอียดคล้ายกับ หน้าเว็บประวัติการเปลี่ยนแปลง โปรดดูเหตุการณ์การเปลี่ยนแปลง
เปลี่ยนประเภทสถานะ
แหล่งข้อมูลต่อไปนี้
ประเภท ได้แก่
ติดตามแล้ว โปรดทราบว่ารหัสประเภททรัพยากรแตกต่างจากค่า enum
ดัชนีของ
ChangeStatusResourceType
ประเภททรัพยากร | ค่า | รหัสประเภททรัพยากร |
---|---|---|
เอนทิตีหลัก | ||
กลุ่มโฆษณา | AD_GROUP | 2 |
โฆษณาในกลุ่มโฆษณา | AD_GROUP_AD | 3 |
ตัวปรับการเสนอราคาระดับกลุ่มโฆษณา | AD_GROUP_BID_MODIFIER | 11 |
เกณฑ์ของกลุ่มโฆษณา | AD_GROUP_CRITERION | 4 |
ฟีดกลุ่มโฆษณา | AD_GROUP_FEED | 12 |
กลุ่มชิ้นงาน | ASSET_BUNDLE | 19 |
แคมเปญ | แคมเปญ | 5 |
เกณฑ์แคมเปญ | CAMPAIGN_CRITERION | 6 |
ฟีด | ||
ฟีดแคมเปญ | CAMPAIGN_FEED | 9 |
ฟีด | ฟีด | 8 |
รายการฟีด | FEED_ITEM | 10 |
ชุดที่ใช้ร่วมกัน | ||
ชุดที่ใช้ร่วมกัน | SHARED_SET | 17 |
ชุดแคมเปญที่ใช้งานร่วมกัน | CAMPAIGN_SHARED_SET | 18 |
ชิ้นงาน | ||
ชิ้นงาน | ชิ้นงาน | 13 |
ชิ้นงานของลูกค้า | CUSTOMER_ASSET | 14 |
ชิ้นงานของแคมเปญ | CAMPAIGN_ASSET | 15 |
ชิ้นงานของกลุ่มโฆษณา | AD_GROUP_ASSET | 16 |
กำลังระบุประเภททรัพยากรตามรหัส
Google Ads API สามารถแสดงแถวที่มีค่าประเภททรัพยากร UNKNOWN
สำหรับก่อนหน้า
เวอร์ชัน API ซึ่งหมายความว่าประเภทดังกล่าวจะได้รับการสนับสนุนใน
Google Ads API แต่ไม่ได้รับการสนับสนุนอย่างเต็มรูปแบบขณะที่เวอร์ชันปัจจุบันของคุณคือ
เผยแพร่แล้ว เมื่อเกิดกรณีนี้ขึ้น คุณยังสามารถระบุประเภททรัพยากรของ
โดยการแยกวิเคราะห์ resource_name
ที่แสดงผล
รูปแบบของชื่อทรัพยากรคือ
customers/{customer_id}/changeStatus/{timestamp}-{resource_type_id}-{additional_ids}
อาจมีรหัสเพิ่มเติมอย่างน้อย 1 รายการโดยคั่นด้วยอักขระ -
แต่
รหัสที่เกี่ยวข้องคือ resource_type_id
ซึ่งเป็นรหัสที่ 2 ที่ตามหลัง
เครื่องหมายทับปิดท้าย ตารางก่อนหน้าแสดงรหัสประเภททรัพยากรทั้งหมด
เรียกข้อมูลการเปลี่ยนแปลง
คุณสามารถกรองรายการการเปลี่ยนแปลงตามวันที่และตามประเภททรัพยากร
การดำเนินการในทรัพยากรที่ระบุเป็นหนึ่งใน
ADDED
CHANGED
,
หรือ
REMOVED
คุณเรียกข้อมูลรายการการเปลี่ยนแปลงทั้งหมดสำหรับทรัพยากรทุกประเภทได้ ผลลัพธ์
resource_type
คือช่องที่
มีการเปลี่ยนแปลง ระบบจะป้อนข้อมูลในช่องระดับบนสุดทั้งหมดด้วย ตัวอย่างเช่น หาก
ad_group_criterion
เปลี่ยนแปลงแล้ว
ช่อง ad_group
จะเป็น
ป้อนข้อมูลแล้ว
ระบบอาจใช้เวลาถึง 3 นาทีจึงจะแสดงการเปลี่ยนแปลงในสถานะการเปลี่ยนแปลง ผลลัพธ์
การค้นหาต้องกรองวันที่ภายใน 90 วันที่ผ่านมา และสามารถเลือกเวลาได้
และต้องมีเงื่อนไข LIMIT
ที่กำหนดผลลัพธ์ไม่เกิน 10,000 รายการ
Java
private void runExample(GoogleAdsClient googleAdsClient, long customerId) { String query = "SELECT change_status.resource_name, " + "change_status.last_change_date_time, " + "change_status.resource_status, " + "change_status.resource_type, " + "change_status.ad_group, " + "change_status.ad_group_ad, " + "change_status.ad_group_bid_modifier, " + "change_status.ad_group_criterion, " + "change_status.ad_group_feed, " + "change_status.campaign, " + "change_status.campaign_criterion, " + "change_status.campaign_feed, " + "change_status.feed, " + "change_status.feed_item " + "FROM change_status " + "WHERE change_status.last_change_date_time DURING LAST_14_DAYS " + "ORDER BY change_status.last_change_date_time " + "LIMIT 10000"; try (GoogleAdsServiceClient client = googleAdsClient.getLatestVersion().createGoogleAdsServiceClient()) { SearchPagedResponse response = client.search(String.valueOf(customerId), query); for (GoogleAdsRow row : response.iterateAll()) { Optional<String> resourceNameOfChangedEntity = getResourceNameForResourceType(row.getChangeStatus()); System.out.printf( "On '%s', change status '%s' shows a resource type of '%s' " + "with resource name '%s' was '%s'.%n", row.getChangeStatus().getLastChangeDateTime(), row.getChangeStatus().getResourceName(), row.getChangeStatus().getResourceType().name(), resourceNameOfChangedEntity.orElse(""), row.getChangeStatus().getResourceStatus().name()); } } }
C#
public void Run(GoogleAdsClient client, long customerId) { // Get the GoogleAdsService. GoogleAdsServiceClient googleAdsService = client.GetService( Services.V17.GoogleAdsService); string searchQuery = @" SELECT change_status.resource_name, change_status.last_change_date_time, change_status.resource_type, change_status.campaign, change_status.ad_group, change_status.resource_status, change_status.ad_group_ad, change_status.ad_group_criterion, change_status.campaign_criterion FROM change_status WHERE change_status.last_change_date_time DURING LAST_14_DAYS ORDER BY change_status.last_change_date_time LIMIT 10000"; // Create a request that will retrieve all changes. SearchGoogleAdsRequest request = new SearchGoogleAdsRequest() { Query = searchQuery, CustomerId = customerId.ToString() }; try { // Issue the search request. PagedEnumerable<SearchGoogleAdsResponse, GoogleAdsRow> searchPagedResponse = googleAdsService.Search(request); // Iterate over all rows in all pages and prints the requested field values for the // campaign in each row. foreach (GoogleAdsRow googleAdsRow in searchPagedResponse) { Console.WriteLine("Last change: {0}, Resource type: {1}, " + "Resource name: {2}, Resource status: {3}, Specific resource name: {4}", googleAdsRow.ChangeStatus.LastChangeDateTime, googleAdsRow.ChangeStatus.ResourceType, googleAdsRow.ChangeStatus.ResourceName, googleAdsRow.ChangeStatus.ResourceStatus, SpecificResourceName(googleAdsRow.ChangeStatus.ResourceType, googleAdsRow)); } } catch (GoogleAdsException e) { Console.WriteLine("Failure:"); Console.WriteLine($"Message: {e.Message}"); Console.WriteLine($"Failure: {e.Failure}"); Console.WriteLine($"Request ID: {e.RequestId}"); throw; } } /// <summary> /// Return the name of the most specific resource that changed. /// </summary> /// <param name="resourceType">Type of the resource.</param> /// <param name="row">Each returned row contains all possible changed fields</param> /// <returns>The resource name of the changed field based on the resource type. /// The changed field's parent is also populated, but is not used.</returns> private string SpecificResourceName(ChangeStatusResourceType resourceType, GoogleAdsRow row) { string resourceName; switch (resourceType) { case ChangeStatusResourceType.AdGroup: resourceName = row.ChangeStatus.AdGroup; break; case ChangeStatusResourceType.AdGroupAd: resourceName = row.ChangeStatus.AdGroupAd; break; case ChangeStatusResourceType.AdGroupCriterion: resourceName = row.ChangeStatus.AdGroupCriterion; break; case ChangeStatusResourceType.Campaign: resourceName = row.ChangeStatus.Campaign; break; case ChangeStatusResourceType.CampaignCriterion: resourceName = row.ChangeStatus.CampaignCriterion; break; case ChangeStatusResourceType.Unknown: case ChangeStatusResourceType.Unspecified: default: resourceName = ""; break; } return resourceName; }
PHP
public static function runExample(GoogleAdsClient $googleAdsClient, int $customerId) { $googleAdsServiceClient = $googleAdsClient->getGoogleAdsServiceClient(); // Creates a query to find information about changed resources in your account. $query = 'SELECT change_status.resource_name, ' . 'change_status.last_change_date_time, ' . 'change_status.resource_status, ' . 'change_status.resource_type, ' . 'change_status.ad_group, ' . 'change_status.ad_group_ad, ' . 'change_status.ad_group_bid_modifier, ' . 'change_status.ad_group_criterion, ' . 'change_status.ad_group_feed, ' . 'change_status.campaign, ' . 'change_status.campaign_criterion, ' . 'change_status.campaign_feed, ' . 'change_status.feed, ' . 'change_status.feed_item ' . 'FROM change_status ' . 'WHERE change_status.last_change_date_time DURING LAST_14_DAYS ' . 'ORDER BY change_status.last_change_date_time ' . 'LIMIT 10000'; // Issues a search request. $response = $googleAdsServiceClient->search( SearchGoogleAdsRequest::build($customerId, $query) ); // Iterates over all rows in all pages and prints the requested field values for // the change status in each row. foreach ($response->iterateAllElements() as $googleAdsRow) { /** @var GoogleAdsRow $googleAdsRow */ printf( "On %s, change status '%s' shows resource '%s' with type '%s' and status '%s'.%s", $googleAdsRow->getChangeStatus()->getLastChangeDateTime(), $googleAdsRow->getChangeStatus()->getResourceName(), self::getResourceNameForResourceType($googleAdsRow->getChangeStatus()), ChangeStatusResourceType::name( $googleAdsRow->getChangeStatus()->getResourceType() ), ChangeStatusOperation::name($googleAdsRow->getChangeStatus()->getResourceStatus()), PHP_EOL ); } } /** * Gets the resource name for the resource type of the change status object. * * Each returned row contains all possible changed resources, only one of which is populated * with the name of the changed resource. This function returns the resource name of the * changed resource based on the resource type. * * @param ChangeStatus $changeStatus the change status object for getting changed resource * @return string the name of the resource that changed */ private static function getResourceNameForResourceType( ChangeStatus $changeStatus ) { $resourceType = $changeStatus->getResourceType(); $resourceName = ''; // Default value for UNSPECIFIED or UNKNOWN resource type. switch ($resourceType) { case ChangeStatusResourceType::AD_GROUP: $resourceName = $changeStatus->getAdGroup(); break; case ChangeStatusResourceType::AD_GROUP_AD: $resourceName = $changeStatus->getAdGroupAd(); break; case ChangeStatusResourceType::AD_GROUP_BID_MODIFIER: $resourceName = $changeStatus->getAdGroupBidModifier(); break; case ChangeStatusResourceType::AD_GROUP_CRITERION: $resourceName = $changeStatus->getAdGroupCriterion(); break; case ChangeStatusResourceType::AD_GROUP_FEED: $resourceName = $changeStatus->getAdGroupFeed(); break; case ChangeStatusResourceType::CAMPAIGN: $resourceName = $changeStatus->getCampaign(); break; case ChangeStatusResourceType::CAMPAIGN_CRITERION: $resourceName = $changeStatus->getCampaignCriterion(); break; case ChangeStatusResourceType::CAMPAIGN_FEED: $resourceName = $changeStatus->getCampaignFeed(); break; case ChangeStatusResourceType::FEED: $resourceName = $changeStatus->getFeed(); break; case ChangeStatusResourceType::FEED_ITEM: $resourceName = $changeStatus->getFeedItem(); break; } return $resourceName; }
Python
def main(client, customer_id): ads_service = client.get_service("GoogleAdsService") # Construct a query to find information about changed resources in your # account. query = """ SELECT change_status.resource_name, change_status.last_change_date_time, change_status.resource_type, change_status.campaign, change_status.ad_group, change_status.resource_status, change_status.ad_group_ad, change_status.ad_group_criterion, change_status.campaign_criterion FROM change_status WHERE change_status.last_change_date_time DURING LAST_14_DAYS ORDER BY change_status.last_change_date_time LIMIT 10000""" search_request = client.get_type("SearchGoogleAdsRequest") search_request.customer_id = customer_id search_request.query = query response = ads_service.search(request=search_request) for row in response: cs = row.change_status resource_type = cs.resource_type.name if resource_type == "AD_GROUP": resource_name = cs.ad_group elif resource_type == "AD_GROUP_AD": resource_name = cs.ad_group_ad elif resource_type == "AD_GROUP_CRITERION": resource_name = cs.ad_group_criterion elif resource_type == "CAMPAIGN": resource_name = cs.campaign elif resource_type == "CAMPAIGN_CRITERION": resource_name = cs.campaign_criterion else: resource_name = "UNKNOWN" resource_status = cs.resource_status.name print( f"On '{cs.last_change_date_time}', change status " f"'{cs.resource_name}' shows that a resource type of " f"'{resource_type}' with resource name '{resource_name}' was " f"{resource_status}" )
Ruby
def get_change_summary(customer_id) # GoogleAdsClient will read a config file from # ENV['HOME']/google_ads_config.rb when called without parameters client = Google::Ads::GoogleAds::GoogleAdsClient.new # Construct a query to find information about changed resources in your # account. query = <<~QUERY SELECT change_status.resource_name, change_status.last_change_date_time, change_status.resource_type, change_status.campaign, change_status.ad_group, change_status.resource_status, change_status.ad_group_ad, change_status.ad_group_criterion, change_status.campaign_criterion FROM change_status WHERE change_status.last_change_date_time DURING LAST_14_DAYS ORDER BY change_status.last_change_date_time LIMIT 10000 QUERY # Execute the query. response = client.service.google_ads.search( customer_id: customer_id, query: query, page_size: PAGE_SIZE ) # Process the results. response.each do |row| cs = row.change_status resource_name = case cs.resource_type when :AD_GROUP cs.ad_group when :AD_GROUP_AD cs.ad_group_ad when :AD_GROUP_CRITERION cs.ad_group_criterion when :CAMPAIGN cs.campaign when :CAMPAIGN_CRITERION cs.campaign_criterion else "UNKNOWN" end puts "On #{cs.last_change_date_time}, change status #{cs.resource_name} " \ "shows a resource type of #{cs.resource_type} " \ "with resource name #{resource_name} was #{cs.resource_status}." end end
Perl
sub get_change_summary { my ($api_client, $customer_id) = @_; # Construct a search query to find information about changed resources in your # account. my $search_query = "SELECT change_status.resource_name, change_status.last_change_date_time, " . "change_status.resource_status, " . "change_status.resource_type, " . "change_status.ad_group, " . "change_status.ad_group_ad, " . "change_status.ad_group_bid_modifier, " . "change_status.ad_group_criterion, " . "change_status.ad_group_feed, " . "change_status.campaign, " . "change_status.campaign_criterion, " . "change_status.campaign_feed, " . "change_status.feed, " . "change_status.feed_item " . "FROM change_status " . "WHERE change_status.last_change_date_time DURING LAST_14_DAYS " . "ORDER BY change_status.last_change_date_time " . "LIMIT 10000"; # Create a search Google Ads request that will retrieve all change statuses using # pages of the specified page size. my $search_request = Google::Ads::GoogleAds::V17::Services::GoogleAdsService::SearchGoogleAdsRequest ->new({ customerId => $customer_id, query => $search_query }); # Get the GoogleAdsService. my $google_ads_service = $api_client->GoogleAdsService(); my $iterator = Google::Ads::GoogleAds::Utils::SearchGoogleAdsIterator->new({ service => $google_ads_service, request => $search_request }); # Iterate over all rows in all pages and print the requested field values for # the change status in each row. while ($iterator->has_next) { my $google_ads_row = $iterator->next; my $change_status = $google_ads_row->{changeStatus}; printf "On %s, change status '%s' shows a resource type of '%s' " . "with resource name '%s' was '%s'.\n", $change_status->{lastChangeDateTime}, $change_status->{resourceName}, $change_status->{resourceType}, __get_resource_name_for_resource_type($change_status), $change_status->{resourceStatus}; } return 1; } # This method returns the resource name of the changed field based on the # resource type. The changed field's parent is also populated but is not used. sub __get_resource_name_for_resource_type { my $change_status = shift; my $resource_type = $change_status->{resourceType}; if ($resource_type eq AD_GROUP) { return $change_status->{adGroup}; } elsif ($resource_type eq AD_GROUP_AD) { return $change_status->{adGroupAd}; } elsif ($resource_type eq AD_GROUP_BID_MODIFIER) { return $change_status->{adGroupBidModifier}; } elsif ($resource_type eq AD_GROUP_CRITERION) { return $change_status->{adGroupCriterion}; } elsif ($resource_type eq AD_GROUP_FEED) { return $change_status->{adGroupFeed}; } elsif ($resource_type eq CAMPAIGN) { return $change_status->{campaign}; } elsif ($resource_type eq CAMPAIGN_CRITERION) { return $change_status->{campaignCriterion}; } elsif ($resource_type eq CAMPAIGN_FEED) { return $change_status->{campaignFeed}; } elsif ($resource_type eq FEED) { return $change_status->{feed}; } elsif ($resource_type eq FEED_ITEM) { return $change_status->{feedItem}; } else { return ""; } }
ซิงค์ในเครื่อง
เมื่อ resource_name
ที่แน่นอนคือ
ควรมีการสร้างการค้นหาใหม่ที่ใช้ชื่อทรัพยากรนี้เพื่อรับ
ค่าปัจจุบันของทรัพยากร ไม่มีการติดตามการเปลี่ยนแปลงสถานะสำหรับ
ค่าที่มีการเปลี่ยนแปลงของทรัพยากร เฉพาะทรัพยากรที่มีการเปลี่ยนแปลงเท่านั้น กำลังตรวจสอบ
ความแตกต่างระหว่างค่าก่อนหน้าและค่าปัจจุบันเป็นความรับผิดชอบของ
ผ่านโปรแกรมโทรศัพท์
เปลี่ยนเวลา
last_change_date_time
ระบุเวลาที่มีการเปลี่ยนแปลงล่าสุดกับแหล่งข้อมูล ดังนั้น
คุณสามารถเปรียบเทียบความใหม่ของข้อมูลที่แคชไว้ในเครื่องกับค่าของช่องนี้เพื่อช่วย
ระบุว่าข้อมูลในตัวเครื่องล้าสมัยหรือไม่
โปรดทราบว่าช่องนี้กรองได้เช่นกัน ซึ่งหมายความว่าใช้ได้ในWHERE
ของข้อความค้นหา Google Ads Query Language (GAQL) ที่ช่วยให้คุณค้นหา
การเปลี่ยนแปลงในทรัพยากรที่เกิดขึ้นก่อนหรือหลังเวลาที่ระบุ
เช่น การค้นหาการเปลี่ยนแปลงทั้งหมดที่เกิดขึ้นกับทรัพยากรบางประเภท สามารถทำได้ภายในสัปดาห์ที่ผ่านมาด้วยภาคแสดง GAQL ต่อไปนี้ วรรค:
WHERE change_status.last_change_date_time DURING LAST_7_DAYS