アカウントの問題は、商品の表示頻度や、Merchant Center のさまざまなプログラムへの参加に影響します。Accounts サブ API を使用すると、販売者アカウントに影響する問題のリストを取得できます。これにより、問題を事前に特定して対処できます。
ショッピング広告と無料リスティングに関するポリシーを遵守する責任はお客様にあります。Google ショッピングは、これらのポリシーを適用し、ポリシーに違反するコンテンツや行為が認められた場合は適切な措置をとる権利を有します。
各 AccountIssue
には、次のような詳細情報が表示されます。
title
: 問題の概要。severity
: 問題の重大度。次に例を示します。CRITICAL
: オファーが配信されない原因となる問題。ERROR
: オファーに影響する可能性のある問題、または問題を示す問題。SUGGESTION
: 改善の推奨事項。
impactedDestinations
: 問題の影響を受けるプログラム(ショッピング広告や無料リスティングなど)と地域、およびそれらのコンテキストにおける重大度。detail
: 問題に関するコンテキストを含むメッセージ。documentationUri
: 問題の解決方法に関するヘルプセンター記事へのリンク。
特記事項
- 国際化(i18n): アカウントの問題を一覧表示するときに、リクエストで
language_code
(「en-US」、「fr-FR」など)とtime_zone
(「America/Los_Angeles」、「Europe/Paris」など)を指定できます。これにより、問題のdetail
など、レスポンス内の人が読める文字列が適切にローカライズされていることを確認します。これらのフィールドを指定しない場合、API はデフォルトで英語(「en-US」)と「America/Los_Angeles」(太平洋標準時)のタイムゾーンを使用します。 - ページネーション: API は、
ListAccountIssuesRequest
のpage_size
パラメータとpage_token
パラメータを使用してページネーションをサポートします。これにより、管理しやすいチャンクで問題を取得できます。最大page_size
は 1, 000 で、デフォルトは 50 です。 - 順序: API から返される問題は、通常、Merchant Center で表示される方法と同様に、重大度と内部優先度で並べ替えられます。なお、この API はカスタム並べ替えをサポートしていません。
- データソース: Accounts サブ API は、Merchant Center の [診断] ページで使用されているのと同じバックエンドからデータを取得します。
アカウントの問題を取得する
アカウントの問題を一覧表示するには、accounts.issues.list
メソッドに GET
リクエストを送信します。
GET https://merchantapi.googleapis.com/accounts/v1/accounts/{ACCOUNT_ID}/issues?language_code=en-GB&time_zone.id=Europe/London&page_size=10
「ランディング ページが機能していない」という違反で一時停止されたサブアカウントのレスポンスの例を次に示します。
{
"accountIssues": [
{
"name": "accounts/ACCOUNT_ID/issues/home-page-issue",
"title": "Online store not confirmed",
"severity": "CRITICAL",
"impactedDestinations": [
{
"reportingContext": "SHOPPING_ADS",
"impacts": [
{
"regionCode": "001",
"severity": "CRITICAL"
}
]
}
],
"detail": "The ownership of the online store must be verified through Merchant Center",
"documentationUri": "https://support.google.com/merchants/answer/176793?hl=en-US"
},
{
"name": "accounts/ACCOUNT_ID/issues/editorial-and-professional-standards-destination-url-down-policy",
"title": "Landing page not working",
"severity": "CRITICAL",
"impactedDestinations": [
{
"reportingContext": "SHOPPING_ADS",
"impacts": [
{
"regionCode": "ES",
"severity": "CRITICAL"
}
]
},
{
"reportingContext": "DEMAND_GEN_ADS",
"impacts": [
{
"regionCode": "ES",
"severity": "CRITICAL"
}
]
},
{
"reportingContext": "VIDEO_ADS",
"impacts": [
{
"regionCode": "ES",
"severity": "CRITICAL"
}
]
}
],
"detail": "Broken landing pages or broken links in your online store are not allowed",
"documentationUri": "https://support.google.com/merchants/answer/12079604?hl=en-US"
},
{
"name": "accounts/ACCOUNT_ID/issues/pending-phone-verification",
"title": "Your phone number needs to be verified",
"severity": "CRITICAL",
"detail": "Verify your phone number to confirm your identity",
"documentationUri": "https://support.google.com/merchants/answer/12471579?hl=en-US"
},
{
"name": "accounts/ACCOUNT_ID/issues/pending-address-and-phone",
"title": "Missing business address",
"severity": "CRITICAL",
"detail": "Provide a valid business address in Merchant Center",
"documentationUri": "https://support.google.com/merchants/answer/12471579?hl=en-US"
}
]
}
特定のアカウントに関する問題の一覧を取得する
このユースケースでは、特定の Merchant Center アカウントのアカウント単位の問題をすべて取得する方法を示します。返された情報は、アカウントのパフォーマンスやさまざまなプログラムの利用資格に影響する問題を特定して解決するのに役立ちます。
AppsScript
/**
* Lists all issues for a given Merchant Center account.
*/
function listAccountIssues() {
// IMPORTANT:
// Enable the Merchant API Accounts sub-API Advanced Service and call it
// "MerchantApiAccounts"
// Replace this with your Merchant Center ID.
const accountId = "<MERCHANT_CENTER_ID>";
// Construct the parent name
const parent = 'accounts/' + accountId;
try {
console.log('Sending list Account Issues request');
// Set pageSize to the maximum value (default: 50)
let pageSize = 100;
let pageToken;
let count = 0;
// Call the Account.Issues.list API method. Use the pageToken to iterate
// through all pages of results.
do {
response = MerchantApiAccounts.Accounts.Issues.list(parent, {pageSize, pageToken});
for (const issue of response.accountIssues) {
console.log(issue);
count++;
}
pageToken = response.nextPageToken;
} while (pageToken); // Exits when there is no next page token.
console.log('The following count of Account Issues were returned: ', count);
} catch (e) {
console.log('ERROR!');
console.log(e);
}
}
Java
import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.accounts.v1.AccountIssue;
import com.google.shopping.merchant.accounts.v1.AccountIssueServiceClient;
import com.google.shopping.merchant.accounts.v1.AccountIssueServiceClient.ListAccountIssuesPagedResponse;
import com.google.shopping.merchant.accounts.v1.AccountIssueServiceSettings;
import com.google.shopping.merchant.accounts.v1.AccountName;
import com.google.shopping.merchant.accounts.v1.ListAccountIssuesRequest;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;
/**
* This class demonstrates how to list all the account issues of an account.
*
* <p>If you want to query the account issues of all the sub-accounts of an advanced account, see
* ListAdvancedAccountIssuesSampleAsync.
*/
public class ListAccountIssuesSample {
public static void listAccountIssues(Config config) throws Exception {
// Obtains OAuth token based on the user's configuration.
GoogleCredentials credential = new Authenticator().authenticate();
// Creates service settings using the credentials retrieved above.
AccountIssueServiceSettings accountIssueServiceSettings =
AccountIssueServiceSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credential))
.build();
// Calls the API and catches and prints any network failures/errors.
try (AccountIssueServiceClient accountIssueServiceClient =
AccountIssueServiceClient.create(accountIssueServiceSettings)) {
// Gets the account ID from the config file.
String accountId = config.getAccountId().toString();
// Creates account name to identify account.
String name = AccountName.newBuilder().setAccount(accountId).build().toString();
ListAccountIssuesRequest request =
ListAccountIssuesRequest.newBuilder().setParent(name).build();
System.out.println("Sending list account issues request:");
ListAccountIssuesPagedResponse response =
accountIssueServiceClient.listAccountIssues(request);
int count = 0;
// Iterates over all rows in all pages and prints the issue in each row.
// Automatically uses the `nextPageToken` if returned to fetch all pages of data.
for (AccountIssue accountIssue : response.iterateAll()) {
System.out.println(accountIssue);
count++;
}
System.out.print("The following count of account issues were returned: ");
System.out.println(count);
} catch (Exception e) {
System.out.println("An error has occured: ");
System.out.println(e);
}
}
public static void main(String[] args) throws Exception {
Config config = Config.load();
listAccountIssues(config);
}
}
PHP
use Google\ApiCore\ApiException;
use Google\Shopping\Merchant\Accounts\V1\Client\AccountIssueServiceClient;
use Google\Shopping\Merchant\Accounts\V1\ListAccountIssuesRequest;
/**
* Lists all the account issues of an account.
*/
class ListAccountIssues
{
/**
* A helper function to create the parent string.
*
* @param array $accountId
* The account.
*
* @return string The parent has the format: `accounts/{account_id}`
*/
private static function getParent($accountId)
{
return sprintf("accounts/%s", $accountId);
}
/**
* Lists all the account issues for a given Merchant Center account.
*
* @param array $config
* The configuration data used for authentication and getting the acccount ID.
* @return void
*/
public static function listAccountIssuesSample($config): void
{
// Gets the OAuth credentials.
$credentials = Authentication::useServiceAccountOrTokenFile();
// Creates options config.
$options = ['credentials' => $credentials];
// Creates a client.
$accountIssueServiceClient = new AccountIssueServiceClient($options);
// Creates parent.
$parent = self::getParent($config['accountId']);
// Creates the request.
$request = new ListAccountIssuesRequest(['parent' => $parent]);
// Calls the API and catches and prints any network failures/errors.
try {
print "Sending list account issues request:\n";
$response = $accountIssueServiceClient->listAccountIssues($request);
$count = 0;
// Iterates over all elements and prints the issue in each row.
foreach ($response->iterateAllElements() as $accountIssue) {
print_r($accountIssue);
$count++;
}
print "The following count of account issues were returned: ";
print $count . "\n";
} catch (ApiException $e) {
print "An error has occured: \n";
print $e->getMessage() . "\n";
}
}
/**
* Helper to execute the sample.
*
* @return void
*/
public function callSample(): void
{
$config = Config::generateConfig();
// Lists the account issues.
self::listAccountIssuesSample($config);
}
}
// Run the script
$sample = new ListAccountIssues();
$sample->callSample();
Python
from examples.authentication import configuration
from examples.authentication import generate_user_credentials
from google.shopping.merchant_accounts_v1 import AccountIssueServiceClient
from google.shopping.merchant_accounts_v1 import ListAccountIssuesRequest
_ACCOUNT = configuration.Configuration().read_merchant_info()
_PARENT = f"accounts/{_ACCOUNT}"
def list_account_issues():
"""Lists all the account issues of an account."""
# Gets OAuth Credentials.
credentials = generate_user_credentials.main()
# Creates a client.
client = AccountIssueServiceClient(credentials=credentials)
request = ListAccountIssuesRequest(parent=_PARENT)
print("Sending list account issues request:")
# Makes the request and catches and prints any error messages.
try:
response = client.list_account_issues(request=request)
count = 0
for account_issue in response:
print(account_issue)
count += 1
print("The following count of account issues were returned: ")
print(count)
except RuntimeError as e:
print("An error has occured: ")
print(e)
if __name__ == "__main__":
list_account_issues()
cURL
curl -X GET \
"https://merchantapi.googleapis.com/accounts/v1/accounts/{ACCOUNT_ID}/issues?language_code=en-US&time_zone.id=America/Los_Angeles&page_size=50" \
--header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
--header "Accept: application/json"
高度なアカウントのすべてのサブアカウントのアカウントに関する問題を一覧表示する
アドバンス アカウントを管理している場合は、すべてのサブアカウントで問題を確認する必要がある場合があります。この例では、サブアカウントを一覧表示し、各サブアカウントのアカウントの問題を非同期で取得する方法を示します。このアプローチは、複数のアカウントを処理するのに効率的です。
Java
import static com.google.api.core.ApiFutures.transform;
import com.google.api.core.ApiFuture;
import com.google.api.core.ApiFutureCallback;
import com.google.api.core.ApiFutures;
import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.common.util.concurrent.MoreExecutors;
import com.google.shopping.merchant.accounts.v1.AccountIssueServiceClient;
import com.google.shopping.merchant.accounts.v1.AccountIssueServiceSettings;
import com.google.shopping.merchant.accounts.v1.AccountName;
import com.google.shopping.merchant.accounts.v1.AccountsServiceClient;
import com.google.shopping.merchant.accounts.v1.AccountsServiceClient.ListSubAccountsPagedResponse;
import com.google.shopping.merchant.accounts.v1.AccountsServiceSettings;
import com.google.shopping.merchant.accounts.v1.ListAccountIssuesRequest;
import com.google.shopping.merchant.accounts.v1.ListAccountIssuesResponse;
import com.google.shopping.merchant.accounts.v1.ListSubAccountsRequest;
import java.io.IOException;
import java.util.AbstractMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.Executor;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;
/**
* This class demonstrates how to list the account issues of all the sub-accounts of an advanced
* account.
*/
public class ListAdvancedAccountIssuesAsyncSample {
/** Returns the list of issues for the given account. */
private static ApiFuture<ListAccountIssuesResponse> getAccountIssues(
AccountIssueServiceClient accountIssueServiceClient, String account) {
return accountIssueServiceClient
.listAccountIssuesCallable()
.futureCall(ListAccountIssuesRequest.newBuilder().setParent(account).build());
}
/**
* Returns a map of account issues where key is the sub-account resource name and the value is the
* list of issues for each sub-account. Takes the API clients and the name of the advanced account
* as input.
*/
private static ApiFuture<Map<String, ListAccountIssuesResponse>> getSubAccountIssues(
AccountsServiceClient accountsServiceClient,
AccountIssueServiceClient accountIssueServiceClient,
String advancedAccount)
throws IOException {
// Creates a direct executor to run the transform functions.
Executor executor = MoreExecutors.directExecutor();
// The parent has the format: accounts/{account}
ListSubAccountsRequest request =
ListSubAccountsRequest.newBuilder().setProvider(advancedAccount).build();
System.out.println("Sending list subaccounts request:");
// Lists all sub-accounts of the advanced account.
ListSubAccountsPagedResponse listSubAccountsResponse =
accountsServiceClient.listSubAccounts(request);
// Iterates over all subAccounts and lists account issues for each.
// Automatically uses the `nextPageToken` if returned to fetch all pages of data.
List<ApiFuture<AbstractMap.SimpleEntry<String, ListAccountIssuesResponse>>>
accountIssuesFutures =
StreamSupport.stream(listSubAccountsResponse.iterateAll().spliterator(), false)
.map(
account ->
transform(
getAccountIssues(accountIssueServiceClient, account.getName()),
(ListAccountIssuesResponse response) ->
new AbstractMap.SimpleEntry<>(account.getName(), response),
executor))
.collect(Collectors.toList());
// Collects all the responses into a single future.
ApiFuture<List<AbstractMap.SimpleEntry<String, ListAccountIssuesResponse>>> accountIssuesList =
ApiFutures.allAsList(accountIssuesFutures);
// Transforms the list of responses into a map.
return transform(
accountIssuesList,
(List<AbstractMap.SimpleEntry<String, ListAccountIssuesResponse>> list) ->
list.stream()
.collect(
Collectors.toMap(
AbstractMap.SimpleEntry::getKey,
AbstractMap.SimpleEntry::getValue,
(a, b) -> a)),
executor);
}
public static void listAccountIssues(Config config) throws Exception {
// Obtains OAuth token based on the user's configuration.
GoogleCredentials credential = new Authenticator().authenticate();
// Gets the account ID from the config file.
// Make sure to use the advanced account ID here, otherwise the API will return an error.
String accountId = config.getAccountId().toString();
// Creates account name to identify account.
String parent = AccountName.newBuilder().setAccount(accountId).build().toString();
// Creates service settings using the credentials retrieved above.
AccountsServiceSettings accountsServiceSettings =
AccountsServiceSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credential))
.build();
// Creates service settings using the credentials retrieved above.
AccountIssueServiceSettings accountIssueServiceSettings =
AccountIssueServiceSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credential))
.build();
// Calls the API and catches and prints any network failures/errors.
try (AccountsServiceClient accountsServiceClient =
AccountsServiceClient.create(accountsServiceSettings);
AccountIssueServiceClient accountIssueServiceClient =
AccountIssueServiceClient.create(accountIssueServiceSettings)) {
ApiFuture<Map<String, ListAccountIssuesResponse>> subAccountIssues =
getSubAccountIssues(accountsServiceClient, accountIssueServiceClient, parent);
ApiFutures.addCallback(
subAccountIssues,
new ApiFutureCallback<Map<String, ListAccountIssuesResponse>>() {
@Override
public void onSuccess(Map<String, ListAccountIssuesResponse> results) {
System.out.println("Account Issues");
for (Entry<String, ListAccountIssuesResponse> entry : results.entrySet()) {
System.out.println("Issues for account " + entry.getKey());
System.out.println(entry.getValue());
}
}
@Override
public void onFailure(Throwable throwable) {
System.out.println(throwable);
}
},
MoreExecutors.directExecutor());
} catch (Exception e) {
System.out.println("An error has occured: ");
System.out.println(e);
}
}
public static void main(String[] args) throws Exception {
Config config = Config.load();
listAccountIssues(config);
}
}
cURL
アドバンス アカウントのサブアカウントの問題を一覧表示するには、まずサブアカウントを一覧表示し(accounts.listSubaccounts
などを使用)、各サブアカウント ID を反復処理して accounts.issues.list
メソッドを呼び出します。次の curl の例は、単一のサブアカウントの問題を一覧表示する方法を示しています。サブアカウント ID ごとにこのリクエストを繰り返します。
curl -X GET \
"https://merchantapi.googleapis.com/accounts/v1/accounts/{SUB_ACCOUNT_ID}/issues?language_code=en-US&time_zone.id=America/Los_Angeles&page_size=50" \
--header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
--header "Accept: application/json"
```