Merchant API のリージョンは、accounts.products.regionalInventories
リソースに関連するターゲットとして使用できる地理的リージョンを表します。リージョンは、郵便番号のコレクションとして定義することも、一部の国では事前定義されたジオターゲティングを使用して定義することもできます。詳細については、リージョン
を設定するをご覧ください。
Merchant API には、リージョンを管理するためのバッチ エンドポイントが用意されています。これにより、1 回の API 呼び出しで最大 100 個のリージョンを作成、更新、削除できます。これは、地域別の在庫状況と価格(RAAP)を大規模に管理する販売者にとって理想的であり、効率の向上と統合の簡素化につながります。
概要
Batch API を使用すると、関連するメソッドで次の操作を行うことができます。
- 1 回のリクエストで複数のリージョンを作成 する:
regions:batchCreate - 複数のリージョンを一度に削除 する:
regions:batchDelete - 複数のリージョンを同時に更新 する:
regions:batchUpdate
前提条件
すべてのバッチ リクエストで認証に ADMIN ユーザー ロールが必要です。
複数のリージョンを作成する
この例では、BatchCreateRegions の 1 回の呼び出しで、郵便番号で定義されたリージョンとジオターゲティングで定義されたリージョンの 2 つの新しいリージョンを作成する方法を示します。
リクエスト
リクエスト URL は次のように作成します。
POST
https://merchantapi.googleapis.com/accounts/v1/accounts/{ACCOUNT_ID}/regions:batchCreate
リクエストの本文には requests のリストが含まれます。各オブジェクトは、作成する
regionId と region データを指定します。
{
"requests": [
{
"regionId": "seattle-area-98340",
"region": {
"displayName": "Seattle Region",
"postalCodeArea": {
"regionCode": "US",
"postalCodes": [
{
"begin": "98340"
}
]
}
}
},
{
"regionId": "co-de-states",
"region": {
"displayName": "Colorado and Delaware",
"geoTargetArea": {
"geotargetCriteriaIds": [
"21138",
"21141"
]
}
}
}
]
}
レスポンス
リクエストが成功すると、新しい region オブジェクトのリストが返されます。
{
"regions": [
{
"name": "accounts/{ACCOUNT_ID}/regions/seattle-area-98340",
"displayName": "Seattle Region",
"postalCodeArea": {
"regionCode": "US",
"postalCodes": [
{
"begin": "98340"
}
]
},
"regionalInventoryEligible": true,
"shippingEligible": true
},
{
"name": "accounts/{ACCOUNT_ID}/regions/co-de-states",
"displayName": "Colorado and Delaware",
"geotargetArea": {
"geotargetCriteriaIds": [
"21138",
"21141"
]
},
"regionalInventoryEligible": false,
"shippingEligible": false
}
]
}
次のサンプルは、バッチ リクエストで複数のリージョンを作成する方法を示しています。
Java
import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.accounts.v1.BatchCreateRegionsRequest;
import com.google.shopping.merchant.accounts.v1.BatchCreateRegionsResponse;
import com.google.shopping.merchant.accounts.v1.CreateRegionRequest;
import com.google.shopping.merchant.accounts.v1.Region;
import com.google.shopping.merchant.accounts.v1.Region.PostalCodeArea;
import com.google.shopping.merchant.accounts.v1.Region.PostalCodeArea.PostalCodeRange;
import com.google.shopping.merchant.accounts.v1.RegionsServiceClient;
import com.google.shopping.merchant.accounts.v1.RegionsServiceSettings;
import java.util.ArrayList;
import java.util.List;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;
/** This class demonstrates how to create multiple regions for a Merchant Center account. */
public class BatchCreateRegionsSample {
private static String getParent(String accountId) {
return String.format("accounts/%s", accountId);
}
public static void batchCreateRegions(Config config, List<String> regionIds) throws Exception {
// Obtains OAuth token based on the user's configuration.
GoogleCredentials credential = new Authenticator().authenticate();
// Creates service settings using the credentials retrieved above.
RegionsServiceSettings regionsServiceSettings =
RegionsServiceSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credential))
.build();
// Creates parent to identify where to insert the regions.
String parent = getParent(config.getAccountId().toString());
// Calls the API and catches and prints any network failures/errors.
try (RegionsServiceClient regionsServiceClient =
RegionsServiceClient.create(regionsServiceSettings)) {
List<CreateRegionRequest> requests = new ArrayList<>();
for (String regionId : regionIds) {
requests.add(
CreateRegionRequest.newBuilder()
.setParent(parent)
.setRegionId(regionId)
.setRegion(
Region.newBuilder()
.setDisplayName("Region " + regionId)
.setPostalCodeArea(
PostalCodeArea.newBuilder()
.setRegionCode("US")
.addPostalCodes(
PostalCodeRange.newBuilder()
.setBegin("10001")
.setEnd("10282")
.build())
.build())
.build())
.build());
}
BatchCreateRegionsRequest request =
BatchCreateRegionsRequest.newBuilder().setParent(parent).addAllRequests(requests).build();
System.out.println("Sending Batch Create Regions request");
BatchCreateRegionsResponse response = regionsServiceClient.batchCreateRegions(request);
System.out.println("Inserted Regions Names below");
// The last part of the region name will be the ID of the region.
// Format: `accounts/{account}/region/{region}`
response.getRegionsList().forEach(region -> System.out.println(region.getName()));
} catch (Exception e) {
System.out.println(e);
}
}
public static void main(String[] args) throws Exception {
Config config = Config.load();
// The unique IDs of the regions to create.
List<String> regionIds = new ArrayList<>();
regionIds.add("REGION_1");
regionIds.add("REGION_2");
regionIds.add("REGION_3");
regionIds.add("REGION_4");
regionIds.add("REGION_5");
batchCreateRegions(config, regionIds);
}
}
複数のリージョンを更新する
この例では、BatchUpdateRegions を使用して、既存の 2 つのリージョンの displayName と
postalCodeArea を更新する方法を示します。ターゲット リージョンを更新するには、region.name を指定する必要があります。
リクエスト
リクエスト URL は次のように作成します。
POST https://merchantapi.googleapis.com/accounts/v1/accounts/{ACCOUNT_ID}/regions:batchUpdate
リクエストの本文には requests のリストが含まれます。各オブジェクトは、更新する region
データを指定する必要があります。region.name フィールドには、更新するリージョンの ID(「98005」など)を含める必要があります。リソースは、name
ではなく
accounts/{ACCOUNT_ID}/regions/name として指定します。変更するフィールドを示す updateMask を含めることは省略可能です。
{
"requests": [
{
"region": {
"name": "98005",
"displayName": "Seattle Updated Region",
"postalCodeArea": {
"regionCode": "US",
"postalCodes": [
{
"begin": "98330"
}
]
}
},
"updateMask": "displayName,postalCodeArea"
},
{
"region": {
"name": "07086",
"displayName": "NewYork Updated Region",
"postalCodeArea": {
"regionCode": "US",
"postalCodes": [
{
"begin": "11*"
}
]
}
},
"updateMask": "displayName,postalCodeArea"
}
]
}
レスポンス
リクエストが成功すると、更新された region オブジェクトのリストが返されます。
{
"regions": [
{
"name": "accounts/{ACCOUNT_ID}/regions/98005",
"displayName": "Seattle Updated Region",
"postalCodeArea": {
"regionCode": "US",
"postalCodes": [
{
"begin": "98330"
}
]
},
"regionalInventoryEligible": true,
"shippingEligible": true
},
{
"name": "accounts/{ACCOUNT_ID}/regions/07086",
"displayName": "NewYork Updated Region",
"postalCodeArea": {
"regionCode": "US",
"postalCodes": [
{
"begin": "11*"
}
]
},
"regionalInventoryEligible": true,
"shippingEligible": true
}
]
}
次のサンプルは、バッチ リクエストで複数のリージョンを更新する方法を示しています。
Java
import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.protobuf.FieldMask;
import com.google.shopping.merchant.accounts.v1.BatchUpdateRegionsRequest;
import com.google.shopping.merchant.accounts.v1.BatchUpdateRegionsResponse;
import com.google.shopping.merchant.accounts.v1.Region;
import com.google.shopping.merchant.accounts.v1.RegionsServiceClient;
import com.google.shopping.merchant.accounts.v1.RegionsServiceSettings;
import com.google.shopping.merchant.accounts.v1.UpdateRegionRequest;
import java.util.ArrayList;
import java.util.List;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;
/** This class demonstrates how to update multiple regions for a Merchant Center account. */
public class BatchUpdateRegionsSample {
private static String getParent(String accountId) {
return String.format("accounts/%s", accountId);
}
private static String getRegionName(String accountId, String regionId) {
return String.format("accounts/%s/regions/%s", accountId, regionId);
}
public static void batchUpdateRegions(Config config, List<String> regionIds) throws Exception {
// Obtains OAuth token based on the user's configuration.
GoogleCredentials credential = new Authenticator().authenticate();
// Creates service settings using the credentials retrieved above.
RegionsServiceSettings regionsServiceSettings =
RegionsServiceSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credential))
.build();
// Creates parent to identify where to update the regions.
String parent = getParent(config.getAccountId().toString());
String accountId = config.getAccountId().toString();
// Calls the API and catches and prints any network failures/errors.
try (RegionsServiceClient regionsServiceClient =
RegionsServiceClient.create(regionsServiceSettings)) {
List<UpdateRegionRequest> requests = new ArrayList<>();
for (String regionId : regionIds) {
requests.add(
UpdateRegionRequest.newBuilder()
.setRegion(
Region.newBuilder()
.setName(getRegionName(accountId, regionId))
.setDisplayName("Updated Region " + regionId)
.build())
.setUpdateMask(FieldMask.newBuilder().addPaths("display_name").build())
.build());
}
BatchUpdateRegionsRequest request =
BatchUpdateRegionsRequest.newBuilder().setParent(parent).addAllRequests(requests).build();
System.out.println("Sending Batch Update Regions request");
BatchUpdateRegionsResponse response = regionsServiceClient.batchUpdateRegions(request);
System.out.println("Updated Regions Names below");
// The last part of the region name will be the ID of the region.
// Format: `accounts/{account}/region/{region}`
response.getRegionsList().forEach(region -> System.out.println(region.getName()));
} catch (Exception e) {
System.out.println(e);
}
}
public static void main(String[] args) throws Exception {
Config config = Config.load();
// The unique IDs of the regions to update.
List<String> regionIds = new ArrayList<>();
regionIds.add("REGION_1");
regionIds.add("REGION_2");
regionIds.add("REGION_3");
regionIds.add("REGION_4");
regionIds.add("REGION_5");
batchUpdateRegions(config, regionIds);
}
}
複数のリージョンを削除する
1 回の呼び出しで複数のリージョンを削除できます。
リクエスト
この例では、BatchDeleteRegions を使用して、1 回の呼び出しで 2 つのリージョンを削除する方法を示します。
POST
https://merchantapi.googleapis.com/accounts/v1/accounts/{ACCOUNT_ID}/regions:batchDelete
リクエストの本文には requests のリストが含まれます。各オブジェクトは、削除するリージョンの
name("accounts/{ACCOUNT_ID}/regions/" を除く)を指定します。
{
"requests":
[
{
"name": "98005"
},
{
"name": "07086"
}
]
}
レスポンス
リクエストが成功すると、空のレスポンス本文が返されます。これは、指定されたリージョンが削除された(または存在しなかった)ことを示します。
{}
次のサンプルは、バッチ リクエストで複数のリージョンを削除する方法を示しています。
Java
import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.accounts.v1.BatchDeleteRegionsRequest;
import com.google.shopping.merchant.accounts.v1.DeleteRegionRequest;
import com.google.shopping.merchant.accounts.v1.RegionsServiceClient;
import com.google.shopping.merchant.accounts.v1.RegionsServiceSettings;
import java.util.ArrayList;
import java.util.List;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;
/** This class demonstrates how to delete multiple regions for a Merchant Center account. */
public class BatchDeleteRegionsSample {
private static String getParent(String accountId) {
return String.format("accounts/%s", accountId);
}
private static String getRegionName(String accountId, String regionId) {
return String.format("accounts/%s/regions/%s", accountId, regionId);
}
public static void batchDeleteRegions(Config config, List<String> regionIds) throws Exception {
// Obtains OAuth token based on the user's configuration.
GoogleCredentials credential = new Authenticator().authenticate();
// Creates service settings using the credentials retrieved above.
RegionsServiceSettings regionsServiceSettings =
RegionsServiceSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credential))
.build();
// Creates parent to identify where to delete the regions.
String parent = getParent(config.getAccountId().toString());
String accountId = config.getAccountId().toString();
// Calls the API and catches and prints any network failures/errors.
try (RegionsServiceClient regionsServiceClient =
RegionsServiceClient.create(regionsServiceSettings)) {
List<DeleteRegionRequest> requests = new ArrayList<>();
for (String regionId : regionIds) {
requests.add(
DeleteRegionRequest.newBuilder().setName(getRegionName(accountId, regionId)).build());
}
BatchDeleteRegionsRequest request =
BatchDeleteRegionsRequest.newBuilder().setParent(parent).addAllRequests(requests).build();
System.out.println("Sending Batch Delete Regions request");
regionsServiceClient.batchDeleteRegions(request);
System.out.println("Regions deleted successfully");
} catch (Exception e) {
System.out.println(e);
}
}
public static void main(String[] args) throws Exception {
Config config = Config.load();
// The unique IDs of the regions to delete.
List<String> regionIds = new ArrayList<>();
regionIds.add("REGION_1");
regionIds.add("REGION_2");
regionIds.add("REGION_3");
regionIds.add("REGION_4");
regionIds.add("REGION_5");
batchDeleteRegions(config, regionIds);
}
}
制限事項
始める前に、次のルールに注意してください。
- アトミック オペレーション: バッチ リクエストはアトミックです。バッチ内のいずれかのオペレーション が失敗した場合(たとえば、1 つのリージョンが作成できなかった場合)、 バッチ全体が失敗し、変更は行われません。API は、失敗の原因を詳しく説明するエラーを返します。
- バッチの上限: 各バッチ リクエストには、最大 100 個のリージョン オペレーションを含めることができます。
- 割り当て: これらのエンドポイントは、
単一オペレーションの対応するエンドポイント(
regions.create、regions.delete、regions.update)と同じ割り当てグループを使用します。
一般的なエラーと問題
一般的な落とし穴とその解決策をいくつかご紹介します。
「バッチ内のリクエスト数が多すぎます」
このエラーは、リクエスト配列内のオペレーション数が 100 の上限を超えている場合に発生します。
"error":
{
"code": 400,
"message": "The number of requests in a batch is too large.",
"status": "INVALID_ARGUMENT"
}
この問題を解決するには、オペレーションを 100 個以下の複数のバッチ リクエストに分割します。
必須項目の値が指定されていません
このエラーは、必須フィールドが指定されていない場合に発生します。エラー メッセージには、指定されていないパラメータが示されます。
エラー メッセージは次のとおりです。
batchCreate:[regionId] Required parameter: regionIdbatchUpdate:[region.name] Required field not provided.batchDelete:[name] Required parameter: name
この問題を解決するには、各オペレーションにすべての必須フィールドが含まれていることを確認します。たとえば、batchUpdate リクエストのすべてのエントリに region.name を含める必要があります。
次のリクエストを投稿すると、エラーが発生します。
{
"requests":
[
{
"region":
{
"displayName": "An update without a region name"
},
"updateMask": "displayName"
}
]
}
「指定された ID のリージョンはすでに存在します」
すでに存在する regionId を持つリージョンを作成しようとすると、エラーが発生します。
エラー メッセージは [regionId] Region with specified id already exists. です。
この問題を解決するには、すべての regionId 値がバッチ内で一意であり、既存のリージョンと競合していないことを確認します。
「フィールド region.name または regionId に重複した値が見つかりました」
1 つのバッチ リクエスト内で同じ ID を持つ複数のリージョンを作成または更新しようとすると、エラーが発生します。
エラー メッセージは Duplicate value found for field {fieldName} in this batch
request with value {duplicated_value}. です。
この問題を解決するには、1 つのバッチ リクエスト内で、すべての regionId(batchCreate の場合)または region.name(batchUpdate の場合)の値が一意であることを確認します。
「アイテムが見つかりません」
batchUpdate を使用する場合、リクエストで指定されたリージョンが存在しないと、バッチ全体が失敗し、404 NOT_FOUND
エラーが返されます。これは、存在しないリージョンに対して成功する batchDelete とは異なります。
"error": {
"code": 404,
"message": "item not found",
"status": "NOT_FOUND"
}
この問題を解決するには、リクエストを送信する前に、更新しようとしているすべてのリージョンが存在することを確認します。