オブジェクト、メソッド、サービス

このガイドでは、一般的なキャンペーン管理タスクを例に挙げながら、AdWords API のオブジェクトとメソッドについて概要を説明します。続いて API のサービスについて説明し、参照ページへのリンクも紹介します。

AdWords API は AdWords の上級者向けツールです。AdWords の新規ユーザーや、基本コンセプトについて復習したい方は、AdWords の基本をご覧ください。

オブジェクトの階層とスコープ

すべての AdWords アカウントはオブジェクトの階層として見ることができます。

各アカウント内に、運用する広告キャンペーンを意味する Campaigns があります。

各 Campaign 内には、広告を論理的なグループにまとめた AdGroups があります。

各 AdGroup 内には複数の AdGroupAdsAdGroupCriteria があります。AdGroupAd は運用する広告を意味します。AdGroupCriterion は、広告表示のトリガーとなる条件としてのキーワードを意味します。

campaign criteria を指定することで、キャンペーン全体を対象とした広告配信のルールを定義できます。キャンペーン全体の予算や期間も指定できます。

また、キャンペーン単位の広告表示オプションで、電話番号や住所などの広告の追加情報を指定することもできます。

AdWords のすべてのオブジェクトは一意の ID で識別されます。一部の ID はすべての AdWords アカウントにまたがるグローバル レベルで一意となりますが、その他の ID は特定の範囲内でのみ一意となります。AdWords 内の各オブジェクト ID の一意性については、下記をご覧ください。

オブジェクト ID 一意性の範囲 グローバル レベルでの一意性
Budget ID グローバル あり
Campaign ID グローバル あり
AdGroup ID グローバル あり
Ad ID 広告グループ なし(AdGroupIdAdId のペアはグローバル レベルで一意)
AdGroupCriterion ID 広告グループ なし(AdGroupIdCriterionId のペアはグローバル レベルで一意)
CampaignCriterion ID キャンペーン なし(CampaignIdCriterionId のペアはグローバル レベルで一意)
Ad Extensions キャンペーン なし(CampaignIdAdExtensionId のペアはグローバル レベルで一意)
Feed ID グローバル あり
Feed Item ID グローバル あり
Feed Attribute ID フィード なし
Feed Mapping ID グローバル あり
Label ID グローバル あり

ID に関するこれらのルールは、AdWords オブジェクトを保管するローカルのデータベースを設計する際の参考になります。

別のオブジェクトから派生しているオブジェクトには、Type フィールドも含まれます。たとえば TextAd には、Ad オブジェクトから派生していることを示す Type フィールドが含まれます。動的言語を使用する場合は、このフィールドによってオブジェクトのタイプを判別できます。たとえば Ad オブジェクトのタイプが TextAd かどうかを確認できます。

メソッドとオペレーション

AdWords API では、サービスを使用して AdWords オブジェクトを管理できます。たとえば、CampaignService で Campaign を管理し、AdGroupService で AdGroup を管理するといった具合です。

これらのサービスでは、get()mutate() の 2 つの標準メソッドがエクスポーズされます。

get() メソッド

get() メソッドは、AdWords オブジェクトの取得に使用されます。たとえば、CampaignService.get() を使用するとキャンペーンのリストを取得できます。

すべての get() メソッドは、入力情報として selector を受け取り、結果として page を返します。AdWords API のデフォルトでは、オブジェクトのすべてのフィールドが返されるわけではないため、セレクタを作成する際は取得する fields のリストを指定する必要があります。

結果のフィルタリングには predicates、結果の並べ替えには ordering、結果を取得する期間の制限には dateRange を使用します。

大量のオブジェクトを取得する場合は paging も指定する必要があります。AdWords API では、ページングなしに大量のオブジェクトを取得しようとすると SizeLimitError.RESPONSE_SIZE_LIMIT_EXCEEDED エラーが発生するためです。

以下はこの概念をコードで示したもので、アカウント内のすべてのキャンペーンを取得して表示します。

Java

// Get the CampaignService.
CampaignServiceInterface campaignService =
    adWordsServices.get(session, CampaignServiceInterface.class);

int offset = 0;

// Create selector.
SelectorBuilder builder = new SelectorBuilder();
Selector selector = builder
    .fields(CampaignField.Id, CampaignField.Name)
    .orderAscBy(CampaignField.Name)
    .offset(offset)
    .limit(PAGE_SIZE)
    .build();

CampaignPage page;
do {
  // Get all campaigns.
  page = campaignService.get(selector);

  // Display campaigns.
  if (page.getEntries() != null) {
    for (Campaign campaign : page.getEntries()) {
      System.out.printf("Campaign with name '%s' and ID %d was found.%n", campaign.getName(),
          campaign.getId());
    }
  } else {
    System.out.println("No campaigns were found.");
  }

  offset += PAGE_SIZE;
  selector = builder.increaseOffsetBy(PAGE_SIZE).build();
} while (offset < page.getTotalNumEntries());

C#

using (CampaignService campaignService =
    (CampaignService) user.GetService(AdWordsService.v201802.CampaignService)) {

  // Create the selector.
  Selector selector = new Selector() {
    fields = new string[] {
      Campaign.Fields.Id, Campaign.Fields.Name, Campaign.Fields.Status
    },
    paging = Paging.Default
  };

  CampaignPage page = new CampaignPage();

  try {
    do {
      // Get the campaigns.
      page = campaignService.get(selector);

      // Display the results.
      if (page != null && page.entries != null) {
        int i = selector.paging.startIndex;
        foreach (Campaign campaign in page.entries) {
          Console.WriteLine("{0}) Campaign with id = '{1}', name = '{2}' and " +
              "status = '{3}' was found.", i + 1, campaign.id,
              campaign.name, campaign.status);
          i++;
        }
      }
      selector.paging.IncreaseOffset();
    } while (selector.paging.startIndex < page.totalNumEntries);
    Console.WriteLine("Number of campaigns found: {0}", page.totalNumEntries);
  } catch (Exception e) {
    throw new System.ApplicationException("Failed to retrieve campaigns", e);
  }

Python

# Initialize appropriate service.
campaign_service = client.GetService('CampaignService', version='v201802')

# Construct selector and get all campaigns.
offset = 0
selector = {
    'fields': ['Id', 'Name', 'Status'],
    'paging': {
        'startIndex': str(offset),
        'numberResults': str(PAGE_SIZE)
    }
}

more_pages = True
while more_pages:
  page = campaign_service.get(selector)

  # Display results.
  if 'entries' in page:
    for campaign in page['entries']:
      print ('Campaign with id "%s", name "%s", and status "%s" was '
             'found.' % (campaign['id'], campaign['name'],
                         campaign['status']))
  else:
    print 'No campaigns were found.'
  offset += PAGE_SIZE
  selector['paging']['startIndex'] = str(offset)
  more_pages = offset < int(page['totalNumEntries'])

PHP

$campaignService = $adWordsServices->get($session, CampaignService::class);

// Create selector.
$selector = new Selector();
$selector->setFields(['Id', 'Name']);
$selector->setOrdering([new OrderBy('Name', SortOrder::ASCENDING)]);
$selector->setPaging(new Paging(0, self::PAGE_LIMIT));

$totalNumEntries = 0;
do {
    // Make the get request.
    $page = $campaignService->get($selector);

    // Display results.
    if ($page->getEntries() !== null) {
        $totalNumEntries = $page->getTotalNumEntries();
        foreach ($page->getEntries() as $campaign) {
            printf(
                "Campaign with ID %d and name '%s' was found.\n",
                $campaign->getId(),
                $campaign->getName()
            );
        }
    }

    // Advance the paging index.
    $selector->getPaging()->setStartIndex(
        $selector->getPaging()->getStartIndex() + self::PAGE_LIMIT
    );
} while ($selector->getPaging()->getStartIndex() < $totalNumEntries);

printf("Number of results found: %d\n", $totalNumEntries);

Perl

# Create selector.
my $paging = Google::Ads::AdWords::v201802::Paging->new({
    startIndex    => 0,
    numberResults => PAGE_SIZE
});
my $selector = Google::Ads::AdWords::v201802::Selector->new({
    fields   => ["Id", "Name"],
    ordering => [
      Google::Ads::AdWords::v201802::OrderBy->new({
          field     => "Name",
          sortOrder => "ASCENDING"
        })
    ],
    paging => $paging
  });

# Paginate through results.
# The contents of the subroutine will be executed for each campaign.
Google::Ads::AdWords::Utilities::PageProcessor->new({
    client   => $client,
    service  => $client->CampaignService(),
    selector => $selector
  }
  )->process_entries(
  sub {
    my ($campaign) = @_;
    printf "Campaign with name \"%s\" and id \"%d\" was found.\n",
      $campaign->get_name(), $campaign->get_id();
  });

Ruby

campaign_srv = adwords.service(:CampaignService, API_VERSION)

# Get all the campaigns for this account.
selector = {
  :fields => ['Id', 'Name', 'Status'],
  :ordering => [
    {:field => 'Name', :sort_order => 'ASCENDING'}
  ],
  :paging => {
    :start_index => 0,
    :number_results => PAGE_SIZE
  }
}

# Set initial values.
offset, page = 0, {}

begin
  page = campaign_srv.get(selector)
  if page[:entries]
    page[:entries].each do |campaign|
      puts "Campaign ID %d, name '%s' and status '%s'" %
          [campaign[:id], campaign[:name], campaign[:status]]
    end
    # Increment values to request the next page.
    offset += PAGE_SIZE
    selector[:paging][:start_index] = offset
  end
end while page[:total_num_entries] > offset

if page.include?(:total_num_entries)
  puts "\tTotal number of campaigns found: %d." % [page[:total_num_entries]]
end

VB.NET

Using campaignService As CampaignService = CType(user.GetService(
    AdWordsService.v201802.CampaignService), CampaignService)

  ' Create the selector.
  Dim selector As New Selector
  selector.fields = New String() {
    Campaign.Fields.Id, Campaign.Fields.Name, Campaign.Fields.Status
  }
  selector.paging = Paging.Default

  Dim page As New CampaignPage

  Try
    Do
      ' Get the campaigns.
      page = campaignService.get(selector)

      ' Display the results.
      If ((Not page Is Nothing) AndAlso (Not page.entries Is Nothing)) Then
        Dim i As Integer = selector.paging.startIndex
        For Each campaign As Campaign In page.entries
          Console.WriteLine("{0}) Campaign with id = '{1}', name = '{2}' and status = " &
            "'{3}' was found.", i + 1, campaign.id, campaign.name, campaign.status)
          i += 1
        Next
      End If
      selector.paging.IncreaseOffset()
    Loop While (selector.paging.startIndex < page.totalNumEntries)
    Console.WriteLine("Number of campaigns found: {0}", page.totalNumEntries)
  Catch e As Exception
    Throw New System.ApplicationException("Failed to retrieve campaign(s).", e)
  End Try

サービスごとの使用可能なセレクタのフィールドについては、セレクタのフィールドに関する参考ページをご覧ください。

クライアント ライブラリには、すべてのキャンペーン管理サービスの get() メソッドのコードのサンプルが含まれています。各言語のクライアント ライブラリで利用できるキャンペーン管理サービスのサンプルについては、以下をご覧ください。

query() メソッド

query() メソッドは get() メソッドの代わりとなるもので、セレクタではなく AdWords クエリ言語(AWQL)という SQL と同様の言語を使用します。多くの場合、同じリクエストでも AWQL でコーディングすると簡素化されます。query() メソッドは一般的なサービスのほとんどに対応していますが、AWQL は変換データをサポートしていません。

AWQL の有効性を上記の例で考えてみましょう。セレクタでは 4 行のコードを記述しますが、AWQL なら同一の情報を 1 つの文字列にまとめることができます。

Java

String query = "SELECT Id, Name, Status ORDER BY Name";

C#

// Create the query.
string query = "SELECT Id, Name, Status ORDER BY Name";

Python

query = (adwords.ServiceQueryBuilder()
         .Select('Id', 'Name', 'Status')
         .Where('Status').EqualTo('ENABLED')
         .OrderBy('Name')
         .Limit(0, PAGE_SIZE)
         .Build())

PHP

$query = (new ServiceQueryBuilder())
    ->select(['Id', 'Name', 'Status'])
    ->orderByAsc('Name')
    ->limit(0, self::PAGE_LIMIT)
    ->build();

Perl

my $query =
  Google::Ads::AdWords::Utilities::ServiceQueryBuilder->new(
  {client => $client})
  ->select(["Id", "Name", "Status"])
  ->order_by("Name")
  ->build();

Ruby

# Get all the campaigns for this account.
query_builder = adwords.service_query_builder do |b|
  b.select('Id', 'Name', 'Status')
  b.order_by_asc('Name')
  b.limit(0, PAGE_SIZE)
end
query = query_builder.build

VB.NET

' Create the query.
Dim query As String = "SELECT Id, Name, Status ORDER BY Name"

FROM 句がない点に留意してください。これは、query() メソッドを使用しているサービスによって、選択元がすでに指定されるためです。レポートで使用する場合にのみ、AWQL は FROM 句に対応します。この文字列を使用するには、サービスの query メソッドを呼び出します。

Java

CampaignPage page = null;
do {
  String pageQuery = query + String.format(" LIMIT %d, %d", offset, PAGE_SIZE);
  // Get all campaigns.
  page = campaignService.query(pageQuery);

  // Display campaigns.
  if (page.getEntries() != null) {
    for (Campaign campaign : page.getEntries()) {
      System.out.printf("Campaign with name '%s' and ID %d was found.%n", campaign.getName(),
          campaign.getId());
    }
  } else {
    System.out.println("No campaigns were found.");
  }

  offset += PAGE_SIZE;
} while (offset < page.getTotalNumEntries());

C#

int offset = 0;
int pageSize = 500;

CampaignPage page = new CampaignPage();

try {
  do {
    string queryWithPaging = string.Format("{0} LIMIT {1}, {2}", query, offset, pageSize);

    // Get the campaigns.
    page = campaignService.query(queryWithPaging);

    // Display the results.
    if (page != null && page.entries != null) {
      int i = offset;
      foreach (Campaign campaign in page.entries) {
        Console.WriteLine("{0}) Campaign with id = '{1}', name = '{2}' and status = " +
            "'{3}' was found.", i + 1, campaign.id, campaign.name, campaign.status);
        i++;
      }
    }
    offset += pageSize;
  } while (offset < page.totalNumEntries);
  Console.WriteLine("Number of campaigns found: {0}", page.totalNumEntries);
} catch (Exception e) {
  throw new System.ApplicationException("Failed to retrieve campaigns", e);
}

Python

for page in query.Pager(campaign_service):
  # Display results.
  if 'entries' in page:
    for campaign in page['entries']:
      print ('Campaign with id "%s", name "%s", and status "%s" was '
             'found.' % (campaign['id'], campaign['name'],
                         campaign['status']))
  else:
    print 'No campaigns were found.'

PHP

do {

    // Advance the paging offset in subsequent iterations only.
    if (isset($page)) {
        $query->nextPage();
    }

    // Make a request using an AWQL string. This request will return the
    // first page containing up to `self::PAGE_LIMIT` results
    $page = $campaignService->query(sprintf('%s', $query));

    // Display results from second and subsequent pages.
    if ($page->getEntries() !== null) {
        foreach ($page->getEntries() as $campaign) {
            printf(
                "Campaign with ID %d and name '%s' was found.\n",
                $campaign->getId(),
                $campaign->getName()
            );
        }
    }
} while ($query->hasNext($page));

printf("Number of results found: %d\n",
    $page->getTotalNumEntries());

Perl

Google::Ads::AdWords::Utilities::PageProcessor->new({
    client    => $client,
    service   => $client->CampaignService(),
    query     => $query,
    page_size => PAGE_SIZE
  }
  )->process_entries(
  sub {
    my ($campaign) = @_;
    printf "Campaign with name \"%s\" and id \"%d\" was found.\n",
      $campaign->get_name(), $campaign->get_id();
  });

Ruby

loop do
  page_query = query.to_s
  page = campaign_srv.query(page_query)
  if page[:entries]
    page[:entries].each do |campaign|
      puts "Campaign ID %d, name '%s' and status '%s'" %
          [campaign[:id], campaign[:name], campaign[:status]]
    end
  end
  break unless query.has_next(page)
  query.next_page
end

if page.include?(:total_num_entries)
  puts "\tTotal number of campaigns found: %d." % page[:total_num_entries]
end

VB.NET

Dim offset As Long = 0
Dim pageSize As Long = 500

Dim page As New CampaignPage()

Try
  Do
    Dim queryWithPaging As String = String.Format("{0} LIMIT {1}, {2}", query, offset,
        pageSize)

    ' Get the campaigns.
    page = campaignService.query(queryWithPaging)

    ' Display the results.
    If ((Not page Is Nothing) AndAlso (Not page.entries Is Nothing)) Then
      Dim i As Integer = CInt(offset)
      For Each campaign As Campaign In page.entries
        Console.WriteLine("{0}) Campaign with id = '{1}', name = '{2}' and status = " &
            "'{3}' was found.", i, campaign.id, campaign.name, campaign.status)
        i += 1
      Next
    End If
    offset = offset + pageSize
  Loop While (offset < page.totalNumEntries)
  Console.WriteLine("Number of campaigns found: {0}", page.totalNumEntries)
Catch e As Exception
  Throw New System.ApplicationException("Failed to retrieve campaign(s).", e)
End Try

上記のコードは、get() メソッドの呼び出しと同じ結果を生成します。AWQL では、同じリクエストを get() 呼び出しよりも簡潔で直感的に記述できます。詳しくは、AWQL ガイドをご覧ください。

mutate() メソッド

mutate() メソッドは、AdWords オブジェクトの変換(作成、更新、削除)に使用します。

オブジェクトを変換するには、そのための Operation オブジェクトを作成する必要があります。たとえば Campaign を変換する場合は CampaignOperation を作成します。

operator フィールドでは、実行するオペレーションのタイプ(ADDSET、または REMOVE)を指定します。operand フィールドでは変換するオブジェクトを指定します。キャンペーンを追加するコード スニペットは以下のようになります。

Java

// Get the CampaignService.
CampaignServiceInterface campaignService =
    adWordsServices.get(session, CampaignServiceInterface.class);

// Create campaign.
Campaign campaign = new Campaign();
campaign.setName("Interplanetary Cruise #" + System.currentTimeMillis());

// Recommendation: Set the campaign to PAUSED when creating it to prevent
// the ads from immediately serving. Set to ENABLED once you've added
// targeting and the ads are ready to serve.
campaign.setStatus(CampaignStatus.PAUSED);

BiddingStrategyConfiguration biddingStrategyConfiguration = new BiddingStrategyConfiguration();
biddingStrategyConfiguration.setBiddingStrategyType(BiddingStrategyType.MANUAL_CPC);

// You can optionally provide a bidding scheme in place of the type.
ManualCpcBiddingScheme cpcBiddingScheme = new ManualCpcBiddingScheme();
biddingStrategyConfiguration.setBiddingScheme(cpcBiddingScheme);

campaign.setBiddingStrategyConfiguration(biddingStrategyConfiguration);

// You can optionally provide these field(s).
campaign.setStartDate(new DateTime().plusDays(1).toString("yyyyMMdd"));
campaign.setEndDate(new DateTime().plusDays(30).toString("yyyyMMdd"));
campaign.setFrequencyCap(new FrequencyCap(5L, TimeUnit.DAY, Level.ADGROUP));

// Only the budgetId should be sent, all other fields will be ignored by CampaignService.
Budget budget = new Budget();
budget.setBudgetId(budgetId);
campaign.setBudget(budget);

campaign.setAdvertisingChannelType(AdvertisingChannelType.SEARCH);

// Set the campaign network options to Search and Search Network.
NetworkSetting networkSetting = new NetworkSetting();
networkSetting.setTargetGoogleSearch(true);
networkSetting.setTargetSearchNetwork(true);
networkSetting.setTargetContentNetwork(false);
networkSetting.setTargetPartnerSearchNetwork(false);
campaign.setNetworkSetting(networkSetting);

// Set options that are not required.
GeoTargetTypeSetting geoTarget = new GeoTargetTypeSetting();
geoTarget.setPositiveGeoTargetType(GeoTargetTypeSettingPositiveGeoTargetType.DONT_CARE);
campaign.setSettings(new Setting[] {geoTarget});

// You can create multiple campaigns in a single request.
Campaign campaign2 = new Campaign();
campaign2.setName("Interplanetary Cruise banner #" + System.currentTimeMillis());
campaign2.setStatus(CampaignStatus.PAUSED);
BiddingStrategyConfiguration biddingStrategyConfiguration2 = new BiddingStrategyConfiguration();
biddingStrategyConfiguration2.setBiddingStrategyType(BiddingStrategyType.MANUAL_CPC);
campaign2.setBiddingStrategyConfiguration(biddingStrategyConfiguration2);

Budget budget2 = new Budget();
budget2.setBudgetId(budgetId);
campaign2.setBudget(budget2);

campaign2.setAdvertisingChannelType(AdvertisingChannelType.DISPLAY);

// Create operations.
CampaignOperation operation = new CampaignOperation();
operation.setOperand(campaign);
operation.setOperator(Operator.ADD);
CampaignOperation operation2 = new CampaignOperation();
operation2.setOperand(campaign2);
operation2.setOperator(Operator.ADD);

CampaignOperation[] operations = new CampaignOperation[] {operation, operation2};

// Add campaigns.
CampaignReturnValue result = campaignService.mutate(operations);

// Display campaigns.
for (Campaign campaignResult : result.getValue()) {
  System.out.printf("Campaign with name '%s' and ID %d was added.%n", campaignResult.getName(),
      campaignResult.getId());
}

C#

List<CampaignOperation> operations = new List<CampaignOperation>();

for (int i = 0; i < NUM_ITEMS; i++) {
  // Create the campaign.
  Campaign campaign = new Campaign();
  campaign.name = "Interplanetary Cruise #" + ExampleUtilities.GetRandomString();
  campaign.advertisingChannelType = AdvertisingChannelType.SEARCH;

  // Recommendation: Set the campaign to PAUSED when creating it to prevent
  // the ads from immediately serving. Set to ENABLED once you've added
  // targeting and the ads are ready to serve.
  campaign.status = CampaignStatus.PAUSED;

  BiddingStrategyConfiguration biddingConfig = new BiddingStrategyConfiguration();
  biddingConfig.biddingStrategyType = BiddingStrategyType.MANUAL_CPC;
  campaign.biddingStrategyConfiguration = biddingConfig;

  campaign.budget = new Budget();
  campaign.budget.budgetId = budget.budgetId;

  // Set the campaign network options.
  campaign.networkSetting = new NetworkSetting();
  campaign.networkSetting.targetGoogleSearch = true;
  campaign.networkSetting.targetSearchNetwork = true;
  campaign.networkSetting.targetContentNetwork = false;
  campaign.networkSetting.targetPartnerSearchNetwork = false;

  // Set the campaign settings for Advanced location options.
  GeoTargetTypeSetting geoSetting = new GeoTargetTypeSetting();
  geoSetting.positiveGeoTargetType = GeoTargetTypeSettingPositiveGeoTargetType.DONT_CARE;
  geoSetting.negativeGeoTargetType = GeoTargetTypeSettingNegativeGeoTargetType.DONT_CARE;

  campaign.settings = new Setting[] { geoSetting };

  // Optional: Set the start date.
  campaign.startDate = DateTime.Now.AddDays(1).ToString("yyyyMMdd");

  // Optional: Set the end date.
  campaign.endDate = DateTime.Now.AddYears(1).ToString("yyyyMMdd");

  // Optional: Set the frequency cap.
  FrequencyCap frequencyCap = new FrequencyCap();
  frequencyCap.impressions = 5;
  frequencyCap.level = Level.ADGROUP;
  frequencyCap.timeUnit = TimeUnit.DAY;
  campaign.frequencyCap = frequencyCap;

  // Create the operation.
  CampaignOperation operation = new CampaignOperation();
  operation.@operator = Operator.ADD;
  operation.operand = campaign;

  operations.Add(operation);
}

try {
  // Add the campaign.
  CampaignReturnValue retVal = campaignService.mutate(operations.ToArray());

  // Display the results.
  if (retVal != null && retVal.value != null && retVal.value.Length > 0) {
    foreach (Campaign newCampaign in retVal.value) {
      Console.WriteLine("Campaign with name = '{0}' and id = '{1}' was added.",
          newCampaign.name, newCampaign.id);
    }
  } else {
    Console.WriteLine("No campaigns were added.");
  }
} catch (Exception e) {
  throw new System.ApplicationException("Failed to add campaigns.", e);
}

Python

operations = [{
    'operator': 'ADD',
    'operand': {
        'name': 'Interplanetary Cruise #%s' % uuid.uuid4(),
        # Recommendation: Set the campaign to PAUSED when creating it to
        # stop the ads from immediately serving. Set to ENABLED once you've
        # added targeting and the ads are ready to serve.
        'status': 'PAUSED',
        'advertisingChannelType': 'SEARCH',
        'biddingStrategyConfiguration': {
            'biddingStrategyType': 'MANUAL_CPC',
        },
        'endDate': (datetime.datetime.now() +
                    datetime.timedelta(365)).strftime('%Y%m%d'),
        # Note that only the budgetId is required
        'budget': {
            'budgetId': budget_id
        },
        'networkSetting': {
            'targetGoogleSearch': 'true',
            'targetSearchNetwork': 'true',
            'targetContentNetwork': 'false',
            'targetPartnerSearchNetwork': 'false'
        },
        # Optional fields
        'startDate': (datetime.datetime.now() +
                      datetime.timedelta(1)).strftime('%Y%m%d'),
        'frequencyCap': {
            'impressions': '5',
            'timeUnit': 'DAY',
            'level': 'ADGROUP'
        },
        'settings': [
            {
                'xsi_type': 'GeoTargetTypeSetting',
                'positiveGeoTargetType': 'DONT_CARE',
                'negativeGeoTargetType': 'DONT_CARE'
            }
        ]
    }
}, {
    'operator': 'ADD',
    'operand': {
        'name': 'Interplanetary Cruise banner #%s' % uuid.uuid4(),
        'status': 'PAUSED',
        'biddingStrategyConfiguration': {
            'biddingStrategyType': 'MANUAL_CPC'
        },
        'endDate': (datetime.datetime.now() +
                    datetime.timedelta(365)).strftime('%Y%m%d'),
        # Note that only the budgetId is required
        'budget': {
            'budgetId': budget_id
        },
        'advertisingChannelType': 'DISPLAY'
    }
}]
campaigns = campaign_service.mutate(operations)

# Display results.
for campaign in campaigns['value']:
  print ('Campaign with name "%s" and id "%s" was added.'
         % (campaign['name'], campaign['id']))

PHP

$campaignService = $adWordsServices->get($session, CampaignService::class);

$operations = [];

// Create a campaign with required and optional settings.
$campaign = new Campaign();
$campaign->setName('Interplanetary Cruise #' . uniqid());
$campaign->setAdvertisingChannelType(AdvertisingChannelType::SEARCH);

// Set shared budget (required).
$campaign->setBudget(new Budget());
$campaign->getBudget()->setBudgetId($budget->getBudgetId());

// Set bidding strategy (required).
$biddingStrategyConfiguration = new BiddingStrategyConfiguration();
$biddingStrategyConfiguration->setBiddingStrategyType(
    BiddingStrategyType::MANUAL_CPC
);

// You can optionally provide a bidding scheme in place of the type.
$biddingScheme = new ManualCpcBiddingScheme();
$biddingStrategyConfiguration->setBiddingScheme($biddingScheme);

$campaign->setBiddingStrategyConfiguration($biddingStrategyConfiguration);

// Set network targeting (optional).
$networkSetting = new NetworkSetting();
$networkSetting->setTargetGoogleSearch(true);
$networkSetting->setTargetSearchNetwork(true);
$networkSetting->setTargetContentNetwork(true);
$campaign->setNetworkSetting($networkSetting);

// Set additional settings (optional).
// Recommendation: Set the campaign to PAUSED when creating it to stop
// the ads from immediately serving. Set to ENABLED once you've added
// targeting and the ads are ready to serve.
$campaign->setStatus(CampaignStatus::PAUSED);
$campaign->setStartDate(date('Ymd', strtotime('+1 day')));
$campaign->setEndDate(date('Ymd', strtotime('+1 month')));

// Set frequency cap (optional).
$frequencyCap = new FrequencyCap();
$frequencyCap->setImpressions(5);
$frequencyCap->setTimeUnit(TimeUnit::DAY);
$frequencyCap->setLevel(Level::ADGROUP);
$campaign->setFrequencyCap($frequencyCap);

// Set advanced location targeting settings (optional).
$geoTargetTypeSetting = new GeoTargetTypeSetting();
$geoTargetTypeSetting->setPositiveGeoTargetType(
    GeoTargetTypeSettingPositiveGeoTargetType::DONT_CARE
);
$geoTargetTypeSetting->setNegativeGeoTargetType(
    GeoTargetTypeSettingNegativeGeoTargetType::DONT_CARE
);
$campaign->setSettings([$geoTargetTypeSetting]);

// Create a campaign operation and add it to the operations list.
$operation = new CampaignOperation();
$operation->setOperand($campaign);
$operation->setOperator(Operator::ADD);
$operations[] = $operation;

// Create a campaign with only required settings.
$campaign = new Campaign();
$campaign->setName('Interplanetary Cruise #' . uniqid());
$campaign->setAdvertisingChannelType(AdvertisingChannelType::DISPLAY);

// Set shared budget (required).
$campaign->setBudget(new Budget());
$campaign->getBudget()->setBudgetId($budget->getBudgetId());

// Set bidding strategy (required).
$biddingStrategyConfiguration = new BiddingStrategyConfiguration();
$biddingStrategyConfiguration->setBiddingStrategyType(
    BiddingStrategyType::MANUAL_CPC
);
$campaign->setBiddingStrategyConfiguration($biddingStrategyConfiguration);

$campaign->setStatus(CampaignStatus::PAUSED);

// Create a campaign operation and add it to the operations list.
$operation = new CampaignOperation();
$operation->setOperand($campaign);
$operation->setOperator(Operator::ADD);
$operations[] = $operation;

// Create the campaigns on the server and print out some information for
// each created campaign.
$result = $campaignService->mutate($operations);
foreach ($result->getValue() as $campaign) {
    printf(
        "Campaign with name '%s' and ID %d was added.\n",
        $campaign->getName(),
        $campaign->getId()
    );
}

Perl

# Create campaigns.
my $num_campaigns = 2;
my @operations    = ();
for (my $i = 0 ; $i < $num_campaigns ; $i++) {
  my (undef, undef, undef, $mday, $mon, $year) = localtime(time);
  my $today = sprintf("%d%02d%02d", ($year + 1900), ($mon + 1), $mday);
  (undef, undef, undef, $mday, $mon, $year) = localtime(time + 60 * 60 * 24);
  my $tomorrow = sprintf("%d%02d%02d", ($year + 1900), ($mon + 1), $mday);
  my $campaign = Google::Ads::AdWords::v201802::Campaign->new({
      name => "Interplanetary Cruise #" . uniqid(),
      # Bidding strategy (required).
      biddingStrategyConfiguration =>
        Google::Ads::AdWords::v201802::BiddingStrategyConfiguration->new({
          biddingStrategyType => "MANUAL_CPC",
          # You can optionally provide a bidding scheme in place of the type.
        }
        ),
      # Budget (required) - note only the budgetId is required.
      budget =>
        Google::Ads::AdWords::v201802::Budget->new({budgetId => $budgetId}),
      # Create a Search Network with Display Select campaign.
      # To create a Display Only campaign, omit networkSetting and use the
      # DISPLAY advertisingChannelType.
      # NetworkSetting (optional).
      networkSetting => Google::Ads::AdWords::v201802::NetworkSetting->new({
          targetGoogleSearch         => 1,
          targetSearchNetwork        => 1,
          targetContentNetwork       => 1,
          targetPartnerSearchNetwork => 0
        }
      ),
      # Advertising channel type (required).
      advertisingChannelType => "SEARCH",
      # Frequency cap (non-required).
      frequencyCap => Google::Ads::AdWords::v201802::FrequencyCap->new({
          impressions => 5,
          timeUnit    => "DAY",
          level       => "ADGROUP"
        }
      ),
      settings => [
        # Advanced location targeting settings (non-required).
        Google::Ads::AdWords::v201802::GeoTargetTypeSetting->new({
            positiveGeoTargetType => "DONT_CARE",
            negativeGeoTargetType => "DONT_CARE"
          }
        ),
      ],
      # Additional properties (non-required).
      startDate                   => $today,
      endDate                     => $tomorrow,
      # Recommendation: Set the campaign to PAUSED when creating it to stop
      # the ads from immediately serving. Set to ENABLED once you've added
      # targeting and the ads are ready to serve.
      status                      => "PAUSED"
    });

  # Create operation.
  my $campaign_operation =
    Google::Ads::AdWords::v201802::CampaignOperation->new({
      operator => "ADD",
      operand  => $campaign
    });
  push @operations, $campaign_operation;
}

# Add campaigns.
my $result = $client->CampaignService()->mutate({operations => \@operations});

# Display campaigns.
foreach my $campaign (@{$result->get_value()}) {
  printf "Campaign with name \"%s\" and id \"%s\" was added.\n",
    $campaign->get_name(), $campaign->get_id();
}

Ruby

campaign_srv = adwords.service(:CampaignService, API_VERSION)

# Create campaigns.
campaigns = [
  {
    :name => "Interplanetary Cruise #%d" % (Time.new.to_f * 1000).to_i,
    # Recommendation: Set the campaign to PAUSED when creating it to stop the
    # ads from immediately serving. Set to ENABLED once you've added
    # targeting and the ads are ready to serve.
    :status => 'PAUSED',
    :bidding_strategy_configuration => {
      :bidding_strategy_type => 'MANUAL_CPC'
    },
    # Budget (required) - note only the budget ID is required.
    :budget => {:budget_id => budget_id},
    :advertising_channel_type => 'SEARCH',
    # Optional fields:
    :start_date =>
        DateTime.parse((Date.today + 1).to_s).strftime('%Y%m%d'),
    :network_setting => {
      :target_google_search => true,
      :target_search_network => true,
      :target_content_network => true
    },
    :settings => [
      {
        :xsi_type => 'GeoTargetTypeSetting',
        :positive_geo_target_type => 'DONT_CARE',
        :negative_geo_target_type => 'DONT_CARE'
      }
    ],
    :frequency_cap => {
      :impressions => '5',
      :time_unit => 'DAY',
      :level => 'ADGROUP'
    }
  },
  {
    :name => "Interplanetary Cruise banner #%d" % (Time.new.to_f * 1000).to_i,
    :status => 'PAUSED',
    :bidding_strategy_configuration => {
      :bidding_strategy_type => 'MANUAL_CPC'
    },
    :budget => {:budget_id => budget_id},
    :advertising_channel_type => 'DISPLAY'
  }
]

# Prepare for adding campaign.
operations = campaigns.map do |campaign|
  {:operator => 'ADD', :operand => campaign}
end

# Add campaign.
response = campaign_srv.mutate(operations)
if response and response[:value]
  response[:value].each do |campaign|
    puts "Campaign with name '%s' and ID %d was added." %
        [campaign[:name], campaign[:id]]
  end
else
  raise new StandardError, 'No campaigns were added.'
end

VB.NET

  Dim operations As New List(Of CampaignOperation)

  For i As Integer = 1 To NUM_ITEMS
    ' Create the campaign.
    Dim campaign As New Campaign
    campaign.name = "Interplanetary Cruise #" & ExampleUtilities.GetRandomString
    campaign.advertisingChannelType = AdvertisingChannelType.SEARCH

    ' Recommendation: Set the campaign to PAUSED when creating it to prevent
    ' the ads from immediately serving. Set to ENABLED once you've added
    ' targeting and the ads are ready to serve.
    campaign.status = CampaignStatus.PAUSED

    Dim biddingConfig As New BiddingStrategyConfiguration()
    biddingConfig.biddingStrategyType = BiddingStrategyType.MANUAL_CPC
    campaign.biddingStrategyConfiguration = biddingConfig

    ' Set the campaign budget.
    campaign.budget = New Budget
    campaign.budget.budgetId = budget.budgetId

    ' Set the campaign network options.
    campaign.networkSetting = New NetworkSetting
    campaign.networkSetting.targetGoogleSearch = True
    campaign.networkSetting.targetSearchNetwork = True
    campaign.networkSetting.targetContentNetwork = False
    campaign.networkSetting.targetPartnerSearchNetwork = False

    ' Set the campaign geo target and keyword match settings.
    Dim geoSetting As New GeoTargetTypeSetting
    geoSetting.positiveGeoTargetType = GeoTargetTypeSettingPositiveGeoTargetType.DONT_CARE
    geoSetting.negativeGeoTargetType = GeoTargetTypeSettingNegativeGeoTargetType.DONT_CARE

    campaign.settings = New Setting() {geoSetting}

    ' Optional: Set the start date.
    campaign.startDate = DateTime.Now.AddDays(1).ToString("yyyyMMdd")

    ' Optional: Set the end date.
    campaign.endDate = DateTime.Now.AddYears(1).ToString("yyyyMMdd")

    ' Optional: Set the frequency cap.
    Dim frequencyCap As New FrequencyCap
    frequencyCap.impressions = 5
    frequencyCap.level = Level.ADGROUP
    frequencyCap.timeUnit = TimeUnit.DAY
    campaign.frequencyCap = frequencyCap

    ' Create the operation.
    Dim operation As New CampaignOperation
    operation.operator = [Operator].ADD
    operation.operand = campaign
    operations.Add(operation)
  Next

  Try
    ' Add the campaign.
    Dim retVal As CampaignReturnValue = campaignService.mutate(operations.ToArray())

    ' Display the results.
    If ((Not retVal Is Nothing) AndAlso (Not retVal.value Is Nothing) AndAlso
      (retVal.value.Length > 0)) Then
      For Each newCampaign As Campaign In retVal.value
        Console.WriteLine("Campaign with name = '{0}' and id = '{1}' was added.",
            newCampaign.name, newCampaign.id)
      Next
    Else
      Console.WriteLine("No campaigns were added.")
    End If
  Catch e As Exception
    Throw New System.ApplicationException("Failed to add campaigns.", e)
  End Try
End Using

AdWords API のクライアント ライブラリには、すべてのキャンペーン管理サービスに対応する mutate() メソッドを使用するコードのサンプルが用意されています。

AdWords アカウントで変換できるオブジェクトの数には、タイプごとに上限があります。AdWords オブジェクトのタイプごとの変換数の上限については、ヘルプセンターの記事をご覧ください。ただし、この上限はキャンペーンをプランニングする際の目安としてのみ使用し、アプリケーションには書き込まないでください。

mutate() の呼び出しを実行する際は、1 回のリクエストで 1 つのオペレーションを送る操作を何度も繰り返すより、1 回のリクエストで複数のオペレーションを送信した方が効率的です。これにより、サーバーとやり取りする回数が減るため、アプリケーションのパフォーマンスが向上します。

また、単一の親エンティティに対するオペレーションをグループ化することも最適化のポイントなります。たとえば広告を追加する場合は、複数の広告グループに対して広告の追加を個別にリクエストするのではなく、同じ広告グループに対する広告の追加を 1 つのリクエストにまとめます。詳しくは、おすすめの方法をご覧ください。

operator フィールド

前述したように、operator フィールドでは実行する変換オペレーションのタイプとして ADDSET、または REMOVE を指定します。

ADD は新しいオブジェクトの作成、SET は既存のオブジェクトの更新、REMOVE は既存のオブジェクトの削除に使用します。ただしサービスによっては一部の演算子を使用できない場合があります。

たとえば、いったん作成した AdWords キャンペーンを完全に削除することはできず、REMOVED マークを付けることができるだけです。REMOVED されたオブジェクトでも、詳細情報と統計データを取得することはできます。

AdWords API の CampaignService は REMOVE 演算子には対応していないため、SET 演算子を使ってステータスを REMOVED に変更して Campaign を更新する必要があります。

また、キャンペーンのターゲットのオブジェクトは変更できず、ADDREMOVE のみ使用できます。

以下の表では、AdWords オブジェクトのタイプごとに、ステータスを変更する際の処理方法をまとめています。

タイプ 新しいオブジェクトの追加 アクティブ 一時停止 削除 / 無効化
Campaign アクション: mutate()
オペレーション: ADD
ステータス: ENABLED
アクション: mutate()
オペレーション: SET
ステータス: ENABLED
アクション: mutate()
オペレーション: SET
ステータス: PAUSED
アクション: mutate()
オペレーション: SET
ステータス: REMOVED
Budget アクション: mutate()
オペレーション: ADD
ステータス: ENABLED
該当なし 該当なし アクション: mutate()
オペレーション: SET
ステータス: REMOVED
AdGroup アクション: mutate()
オペレーション: ADD
ステータス: ENABLED
アクション: mutate()
オペレーション: SET
ステータス: ENABLED
アクション: mutate()
オペレーション: SET
ステータス: PAUSED
アクション: mutate()
オペレーション: SET
ステータス: REMOVED
AdGroupAd アクション: mutate()
オペレーション: ADD
ステータス: ENABLED
アクション: mutate()
オペレーション: SET
ステータス: ENABLED
アクション: mutate()
オペレーション: SET
ステータス: PAUSED
アクション: mutate()
オペレーション: REMOVE
ステータス: DISABLED
BiddableAdGroupCriterion アクション: mutate()
オペレーション: ADD
ステータス: ENABLED
アクション: mutate()
オペレーション: SET
ステータス: ENABLED
アクション: mutate()
オペレーション: SET
ステータス: PAUSED
アクション: mutate
オペレーション: REMOVE
ステータス: REMOVED
UserList アクション: mutate()
オペレーション: ADD
ステータス: OPEN
該当なし 該当なし アクション: mutate()
オペレーション: SET
ステータス: CLOSED
Feed アクション: mutate()
オペレーション: ADD
ステータス: ENABLED
該当なし 該当なし アクション: mutate()
オペレーション: REMOVE
ステータス: REMOVED
FeedMapping アクション: mutate()
オペレーション: ADD
ステータス: ENABLED
該当なし 該当なし アクション: mutate()
オペレーション: REMOVE
ステータス: REMOVED
FeedItem アクション: mutate
オペレーション: ADD
ステータス: ENABLED
該当なし 該当なし アクション: mutate()
オペレーション: REMOVE
ステータス: REMOVED
CustomerFeed アクション: mutate()
オペレーション: ADD
ステータス: ENABLED
該当なし 該当なし アクション: mutate()
オペレーション: REMOVE
ステータス: REMOVED
CampaignFeed アクション: mutate()
オペレーション: ADD
ステータス: ENABLED
該当なし 該当なし アクション: mutate()
オペレーション: REMOVE
ステータス: REMOVED
AdGroupFeed アクション: mutate()
オペレーション: ADD
ステータス: ENABLED
該当なし 該当なし アクション: mutate()
オペレーション: REMOVE
ステータス: REMOVED

同時変換

複数のユーザーがアプリケーションを使って同一のオブジェクトに変更を加える場合や、処理能力を高めるために複数のスレッドを使用して同時並行で AdWords オブジェクトを変換する場合は、AdWords が同一のオブジェクトに対する同時変換をどう処理しているのかを把握することが重要になります。

AdWords オブジェクトには、複数のソースから同時並行で変更を加えることはできません。同一のアプリケーションや異なるアプリケーションの複数のスレッド(アプリケーションと AdWords Editor の同時セッションなど)で同じオブジェクトを更新する場合などがこれに該当します。AdWords API では、オブジェクトの更新前にロックをかけることはできません。2 つのソースによって同時にオブジェクトが変換された場合は、CONCURRENT_MODIFICATION_ERROR というエラーが発生します。

AdWords API の同時変換の詳細については、こちらのブログ記事をご覧ください。

非同期変換と同期変換

AdWords API の mutate() メソッドは同期型です。API 呼び出しを行うと、オブジェクト変換が完了した後に応答が返されるため、リクエストのたびに応答を待つ必要があります。この手法ではコードが比較的簡素になりますが、負荷分散に悪影響が生じたり、呼び出しの完了を待つ間にリソースの浪費が生じたりすることがあります。

別のアプローチとして、BatchJobService を使用してオブジェクトを非同期的に変換する方法もあります。この方法では複数のサービスでオペレーションの完了を待たずにバッチ処理を実行できます。バッチ処理が送信されると、AdWords API サーバーによってオペレーションが非同期的に実行されるためマシンに他のオペレーションを実行する余地が生まれ、ジョブの完了まで定期的にステータスを確認できるようになります。

非同期型のオペレーションの詳細については、バッチ処理に関するガイドをご覧ください。

変換の検証

validateOnly SOAP ヘッダーを使用すると、実際のデータに呼び出しを実行することなく、API 呼び出しをテストできます。実際の処理を行う前にパラメータの不足やフィールドの値の正確性をチェックすることができます。

この機能を使用するには、RequestHeadervalidateOnly フィールドを true に設定します。クライアント ライブラリでは、このフィールドはデフォルトで false に設定されます。

この機能ではリクエストが実行されたかのように完全に検証されますが、最終的な実行はスキップされます。エラーが検出されなかった場合は空の応答が返されます。検証に失敗した場合は、失敗の内容を示すエラー メッセージが返されます。

Java のライブラリで validateOnly を設定する方法の例は以下のとおりです。

Credential oAuth2Credential = new OfflineCredentials.Builder()
    .forApi(Api.ADWORDS)
    .fromFile()
    .build()
    .generateCredential();

AdWordsSession session = new AdWordsSession.Builder()
    .fromFile()
    .withOAuth2Credential(oAuth2Credential)
    .build();

session.setValidateOnly(true);

このセッションで実行された API 呼び出しは、すべて validateOnly ヘッダーが true に設定されます。

validateOnly ヘッダーは、広告に一般的なポリシー違反が含まれていないかチェックする際に特に役立ちます。特定の語句や句読点、大文字の使用、長さなどの点でポリシー違反が含まれている広告は、自動的に不承認になります。広告を一括でアップロードしようとした際に問題のある広告が 1 つでもあると他の広告もすべてアップロードに失敗する可能性があります。新しい広告を validateOnly でテストすることで不承認になる広告を簡単に確認できます。具体例については、ポリシー違反エラーを処理するためのコードのサンプルをご覧ください。

クライアント ライブラリを使用しない場合は、適切な SOAP ヘッダーを設定すれば mutate() リクエストを検証できます。

AdWords API サービス

このセクションでは、AdWords API で利用できるサービスについて解説します。各サービスの詳細情報が記載されたページへのリンクも用意しています。

AdWords API のサービスは、機能によって 4 つのカテゴリに分類できます。

キャンペーンのデータ管理

キャンペーンのデータ管理サービスでは、AdWords キャンペーンとそれに関連するエンティティに操作を加えることができます。各キャンペーンのデータ管理サービスは、キャンペーンのデータ階層内のエンティティに対応しています。

サービス 説明
CampaignService キャンペーンを作成、更新、削除します。キャンペーンは広告グループで構成され、それぞれに予算と入札戦略、配信期間、ターゲット設定があります。
AdGroupService 広告グループを作成、更新、削除します。広告グループは広告と条件のセットで構成され、その条件のデフォルトの入札単価も指定できます。
AdGroupAdService 広告を作成、更新、削除します。
CampaignExtensionSettingService 広告表示オプションを作成、更新、削除します。キャンペーンの広告表示オプションを利用すると、所在地や追加リンク、電話番号などの補完情報をキャンペーン内のすべての標準のテキスト広告に追加できます。
CampaignCriterionService
AdGroupCriterionService
条件を作成、更新、削除します。条件とは、広告を表示するかどうかを決める条件のことを指します。
ConversionTrackerService
OfflineConversionFeedService
ユーザーが広告をクリックした後の行動を調べることで、広告とキーワードの有効性を測定します。OfflineConversionFeedService では、オフライン コンバージョンのデータのインポートを処理します。
DataService 指定された条件を基に広告キャンペーンの管理データを取得します。
FeedService
FeedItemService
FeedMappingService
AdGroupFeedService
CampaignFeedService
カスタムのデータフィードを作成してサイトリンク表示オプションや電話番号表示オプション、アプリリンク表示オプションを管理します。
AdwordsUserListService ユーザーリストを作成、更新、削除します。ユーザーリストとユーザーリストの条件を使用することで、ウェブサイト上でコンバージョンに至ったことがあるユーザーに広告を表示できます。
BudgetService 予算を作成、更新、削除します。複数のキャンペーン全体で共有する予算を管理できます。

最適化

最適化サービスでは、掲載結果データを取得して新しい条件設定の参考にすることができます。

サービス 説明
ReportDefinitionService さまざまな掲載結果レポートを作成、ダウンロードします。
TargetingIdeaService 指定したパラメータを基にして新しいキーワードとプレースメントの候補を生成します。
TrafficEstimatorService 提案されたキャンペーン、広告グループ、キーワードのトラフィックの推定値を取得します。
DraftService および TrialService キャンペーンの設定をテストするための新しい Draft と Trial を作成します。詳細については、こちらのガイドをご覧ください。

アカウントの管理

アカウント管理サービスを使用してアカウントのアクティビティをトラッキングできます。

サービス 説明
CustomerService クライアント アカウントの基本情報を取得します。
CustomerSyncService 指定した期間内におけるキャンペーンの変更履歴データを取得します。
ManagedCustomerService クライアント アカウントと、MCC アカウントとクライアント アカウントのリンク設定を管理します。

ユーティリティ

以下のユーティリティ サービスを使用すると、AdWords API によって有用性の高いさまざまなタスクを実行できます。

サービス 説明
BatchJobService 大量のキャンペーンのデータ オペレーションを非同期的に実行します。バッチ処理は、標準のウェブサービスに対する同期的な呼び出しよりも完了に時間がかかりますが、その他の点でメリットがあります。詳しくは、バッチ処理に関するガイドをご覧ください。
MediaService メディアベースの広告(イメージ広告や動画広告)で使用するメディアの ID をアップロード、取得します。
ConstantDataService API で使用する定数値を取得します。
LocationCriterionService 地域に関する条件の ID を取得します。

キャンペーン データ

キャンペーン データの処理は、AdWords API を使って実行する基本的なタスクのひとつです。以下の表では、キャンペーン データの各エンティティと、他のキャンペーン データとそのエンティティとの関係性をまとめています。

エンティティ
子エンティティ(数量)
データのタイプ 説明
キャンペーン
広告グループ(1 以上)
キャンペーンのターゲットのリスト(7)
キャンペーンの広告表示オプション(0 以上)
キャンペーンの条件(0 以上)
Campaign キャンペーンは広告グループで構成され、それぞれに予算と入札戦略、配信期間があります。
広告グループ
広告(1 以上)
条件(1 以上)
AdGroup
広告グループは広告と条件のセットで構成され、その条件のデフォルトの入札単価も指定できます。
広告
広告表示オプションの上書き(0 以上)
AdGroupAd 利用できる広告のタイプは API リファレンスにまとめられており、抽象型の Ad タイプのサブクラスとなります。
条件
なし
AdGroupCriterionCampaignCriterion 条件とは、広告を表示する場合(入札可能な条件)と表示しない場合(除外条件)を決める条件を指します。 広告グループの条件は、親の広告グループ内の広告に影響します。常に除外条件となるキャンペーンの条件では、キャンペーンの広告を表示しない条件を定義します。
広告表示オプション
なし
CampaignExtensionSetting キャンペーンの広告表示オプションを利用すると、所在地や追加リンク、電話番号などの補完情報をキャンペーン内のすべての標準のテキスト広告に追加できます。
フィード
なし
Feed フィードはデータと広告表示オプション(サイトリンク、アプリリンク、電話番号)をつなぐパイプの役目を果たします。
ユーザーリスト
なし
UserList ユーザーリストを使用すると、ウェブサイトで関心を示したことがあるユーザーをトラッキングできます。ユーザーリスト条件を作成して既存のユーザーリストにリンクさせることで、このグループのユーザーを広告のターゲットに設定できます。
予算
なし
Budget 予算は、キャンペーンの広告掲載費用を管理するために使用します。予算は複数のキャンペーン全体で共有できます。その場合は最適な予算配分が自動的に行われます。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。