Sau khi thêm sản phẩm vào tài khoản Merchant Center, bạn có thể truy xuất trạng thái cuối cùng đã được xử lý của sản phẩm, bao gồm cả trạng thái hiện tại và mọi vấn đề về chất lượng dữ liệu. Nhờ đó, bạn có thể theo dõi kho hàng, chẩn đoán vấn đề và xác minh rằng sản phẩm của bạn đủ điều kiện xuất hiện trên Google.
Hướng dẫn này giải thích cách liệt kê các sản phẩm và vấn đề liên quan bằng cách sử dụng các API phụ Products
và Reports
.
Điều kiện tiên quyết
Bạn phải có sản phẩm trong tài khoản Merchant Center. Để tìm hiểu cách thêm sản phẩm, hãy xem hướng dẫn Thêm và quản lý sản phẩm.
Các điểm cần cân nhắc đặc biệt
- Trễ trong quá trình xử lý: Thường thì sẽ có một khoảng trễ (vài phút) giữa thời điểm bạn chèn hoặc cập nhật một
productInput
và thời điểm các thay đổi được phản ánh trongproduct
đã xử lý cuối cùng do các phương thức truy xuất của sản phẩm trả về. - Sản phẩm không có vị trí xuất hiện: Những sản phẩm không có vị trí xuất hiện dự kiến sẽ tự động bị xoá sau khoảng một tuần. Một sản phẩm không có đích đến dự kiến nào nếu danh sách
destinationStatuses
trong trườngproductStatus
của sản phẩm đó trống. Bạn nên thường xuyên kiểm tra trạng thái này để tránh trường hợp xoá sản phẩm ngoài ý muốn.
Liệt kê tất cả sản phẩm đã được xử lý
Để lấy danh sách tất cả các sản phẩm đã được xử lý và cuối cùng, hãy sử dụng phương thức products.list
. Phương thức này trả về tài nguyên Product
, đại diện cho sản phẩm khi sản phẩm xuất hiện trong Merchant Center sau khi tất cả các quy tắc và nguồn dữ liệu hợp nhất đã được áp dụng.
Phản hồi được phân trang. Sử dụng tham số pageSize
để chỉ định số lượng sản phẩm cần trả về trên mỗi trang và pageToken
từ phản hồi để truy xuất các trang tiếp theo.
GET https://merchantapi.googleapis.com/products/v1/accounts/{ACCOUNT_ID}/products?pageSize=2
Một lệnh gọi thành công sẽ trả về danh sách được phân trang gồm các tài nguyên Product
.
{
"products": [
{
"name": "accounts/{ACCOUNT_ID}/products/en~US~SKU12345",
"offerId": "SKU12345",
"contentLanguage": "en",
"feedLabel": "US",
"dataSource": "accounts/{ACCOUNT_ID}/dataSources/12345",
"productAttributes": {
"title": "Classic Cotton T-Shirt",
"price": {
"amountMicros": "15990000",
"currencyCode": "USD"
}
},
"productStatus": {
"destinationStatuses": [
{
"reportingContext": "SHOPPING_ADS",
"approvedCountries": [
"US"
]
}
]
}
},
{
"name": "accounts/{ACCOUNT_ID}/products/en~US~SKU67890",
"offerId": "SKU67890",
"contentLanguage": "en",
"feedLabel": "US",
"dataSource": "accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}",
"productAttributes": {
"title": "Modern Linen Trousers",
"price": {
"amountMicros": "49990000",
"currencyCode": "USD"
},
"gtins": [
"123456789012"
]
},
"productStatus": {
"destinationStatuses": [
{
"reportingContext": "SHOPPING_ADS",
"disapprovedCountries": [
"US"
]
}
],
"itemLevelIssues": [
{
"code": "invalid_gtin",
"severity": "DISAPPROVED",
"resolution": "merchant_action",
"attribute": "gtins",
"reportingContext": "SHOPPING_ADS",
"description": "Invalid GTIN",
"detail": "The value provided for the gtin attribute is not a valid GTIN.",
"documentation": "https://support.google.com/merchants/answer/6324461",
"applicableCountries": [
"US"
]
}
]
}
}
],
"nextPageToken": "CiAKGjZhY2NvdW50cy8xMjM0NS9wcm9kdWN0cy9vbmxpbmV"
}
Các mã mẫu sau đây cho biết cách liệt kê tất cả sản phẩm.
Java
import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.products.v1.ListProductsRequest;
import com.google.shopping.merchant.products.v1.Product;
import com.google.shopping.merchant.products.v1.ProductsServiceClient;
import com.google.shopping.merchant.products.v1.ProductsServiceClient.ListProductsPagedResponse;
import com.google.shopping.merchant.products.v1.ProductsServiceSettings;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;
/** This class demonstrates how to list all the products for a given merchant center account */
public class ListProductsSample {
private static String getParent(String accountId) {
return String.format("accounts/%s", accountId);
}
public static void listProducts(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.
ProductsServiceSettings productsServiceSettings =
ProductsServiceSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credential))
.build();
// Creates parent to identify the account from which to list all products.
String parent = getParent(config.getAccountId().toString());
// Calls the API and catches and prints any network failures/errors.
try (ProductsServiceClient productsServiceClient =
ProductsServiceClient.create(productsServiceSettings)) {
// The parent has the format: accounts/{account}
// Page size is set to the maximum value. If you are returned more
// responses than your page size, this code will automatically
// re-call the service with the `pageToken` until all responses
// are returned.
ListProductsRequest request =
ListProductsRequest.newBuilder().setParent(parent).setPageSize(1000).build();
System.out.println("Sending list products request:");
ListProductsPagedResponse response = productsServiceClient.listProducts(request);
int count = 0;
// Iterates over all rows in all pages and prints the datasource in each row.
// Automatically uses the `nextPageToken` if returned to fetch all pages of data.
for (Product product : response.iterateAll()) {
System.out.println(product); // The product includes the `productStatus` field
// That shows approval and disapproval information.
count++;
}
System.out.print("The following count of products 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();
listProducts(config);
}
}
PHP
use Google\ApiCore\ApiException;
use Google\ApiCore\PagedListResponse;
use Google\Shopping\Merchant\Products\V1\ListProductsRequest;
use Google\Shopping\Merchant\Products\V1\Product;
use Google\Shopping\Merchant\Products\V1\Client\ProductsServiceClient;
/**
* This class demonstrates how list all products in your Merchant Center account.
*/
class ListProducts
{
/**
* A helper function to create the parent string.
*
* @param array $accountId
* The account that owns the product.
*
* @return string The parent has the format: `accounts/{account_id}`
*/
private static function getParent($accountId)
{
return sprintf("accounts/%s", $accountId);
}
/**
* Lists all products in your Merchant Center account.
*
* @param array $config
* The configuration data used for authentication and getting the acccount
* ID.
*/
public static function listProductsSample($config)
{
// Obtains OAuth token based on the user's configuration.
$credentials = Authentication::useServiceAccountOrTokenFile();
// Creates options config containing credentials for the client to use.
$options = ['credentials' => $credentials];
// Creates a client.
$productsServiceClient = new ProductsServiceClient($options);
// Creates parent to identify the account from which to list all products.
$parent = self::getParent($config['accountId']);
// Creates the request.
// Page size is set to the maximum value. If you are returned more
// responses than your page size, this code will automatically
// re-call the service with the `pageToken` until all responses
// are returned.
$request = new ListProductsRequest(['parent' => $parent, 'page_size' => 1000]);
// Calls the API and catches and prints any network failures/errors.
try {
echo "Sending list products request:\n";
/**
* Call the listProducts service and get back a response object
* with all products.
*
* @var PagedListResponse $response
*/
$response = $productsServiceClient->listProducts($request);
/**
* Loop through every product and print out its data.
*
* @var Product $product
*/
foreach ($response as $product) {
// The product includes the `productStatus` field that shows approval
// and disapproval information.
printf(
'Product data: %s%s',
$product->serializeToJsonString(), PHP_EOL
);
}
} catch (ApiException $e) {
printf('Call failed with message: %s%s', $e->getMessage(), PHP_EOL);
}
}
/**
* Helper to execute the sample.
*
* @return void
*/
public function callSample(): void
{
$config = Config::generateConfig();
self::listProductsSample($config);
}
}
// Run the script
$sample = new ListProducts();
$sample->callSample();
Python
from examples.authentication import configuration
from examples.authentication import generate_user_credentials
from google.shopping import merchant_products_v1
_ACCOUNT = configuration.Configuration().read_merchant_info()
_PARENT = f"accounts/{_ACCOUNT}"
def list_products():
"""Lists the `Product` resources for a given account."""
# Gets OAuth Credentials.
credentials = generate_user_credentials.main()
# Creates a client.
client = merchant_products_v1.ProductsServiceClient(
credentials=credentials
)
# Creates the request. Set the page size to the maximum value.
request = merchant_products_v1.ListProductsRequest(
parent=_PARENT, page_size=1000
)
# Makes the request and catches and prints any error messages.
try:
response = client.list_products(request=request)
for product in response:
print(product)
print("List request successful!")
except RuntimeError as e:
print("List request failed")
print(e)
if __name__ == "__main__":
list_products()
Apps_Script
/**
* Lists all products for a given Merchant Center account.
*/
function productList() {
// IMPORTANT:
// Enable the Merchant API Products sub-API Advanced Service and call it
// "MerchantApiProducts"
// 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 Products request');
let pageToken;
// Set the page size to 1000. This is the maximum allowed page size.
let pageSize = 1000;
console.log('Retrieved products below:');
// Call the Products.list API method. Use the pageToken to iterate through
// all pages of results.
do {
response = MerchantApiProducts.Accounts.Products.list(parent, {pageToken, pageSize});
console.log(response);
pageToken = response.nextPageToken;
} while (pageToken); // Exits when there is no next page token.
} catch (e) {
console.log('ERROR!');
console.log(e);
}
}
cURL
curl -X GET \
"https://merchantapi.googleapis.com/products/v1/accounts/{ACCOUNT_ID}/products?pageSize=2" \
-H "Authorization: Bearer <API_TOKEN>"
Kiểm tra trạng thái và vấn đề của sản phẩm
Merchant API cung cấp nhiều cách để xem các vấn đề về sản phẩm và tài khoản của bạn.
Chọn phương thức phù hợp để xem vấn đề
Sau đây là thông tin so sánh về các phương thức báo cáo vấn đề:
- Trạng thái chi tiết của sản phẩm: Sử dụng
products.list
để nhận thông tin chi tiết về trạng thái sản phẩm cho sản phẩm trên tất cả các vị trí xuất hiện. Để biết thêm thông tin, hãy xem phần sau Kiểm tra trạng thái của một sản phẩm bằngproductStatus
. - Trạng thái tổng hợp của sản phẩm: Sử dụng
aggregateProductStatuses.list
để xem thông tin tổng quan về tình trạng dữ liệu sản phẩm, bao gồm cả thông tin tóm tắt về sản phẩm theo trạng thái và các loại vấn đề phổ biến nhất. Hãy xem bài viết Xem số liệu thống kê và vấn đề về sản phẩm để biết thêm thông tin. - Lọc sản phẩm theo trạng thái: Truy vấn
productView
trongreports.search
để lọc sản phẩm theo trạng thái. Hãy xem phần Lọc sản phẩm để biết thêm thông tin. - Kết xuất các vấn đề về tài khoản và sản phẩm cho giao diện người dùng: Sử dụng
renderaccountissue
vàrenderproductissue
để nhận nội dung mô tả chi tiết, dễ đọc và đường liên kết đến tài liệu cho một vấn đề cụ thể. Sử dụng phương thức này để tạo giao diện người dùng cho người dùng cuối thấy các vấn đề về sản phẩm và tài khoản. Hãy xem bài viết Các vấn đề và giải pháp hiển thị cho doanh nghiệp để biết thêm thông tin. - Liệt kê các vấn đề về tài khoản: Sử dụng
accountissues.list
để kiểm tra các vấn đề ảnh hưởng đến toàn bộ tài khoản Merchant Center của bạn, chẳng hạn như lỗi vi phạm chính sách.
Kiểm tra trạng thái của một sản phẩm bằng cách sử dụng biểu tượng productStatus
Để kiểm tra trạng thái của một sản phẩm, hãy kiểm tra trường productStatus
trong tài nguyên Product
do products.list
hoặc products.get
trả về. Trường này chứa thông tin tổng hợp về trạng thái của sản phẩm trên tất cả các vị trí xuất hiện. Nguồn cấp dữ liệu này cũng chứa các vấn đề liên quan đến kho hàng (tại địa phương và khu vực) được đính kèm với một sản phẩm nhất định.
Trường productStatus
bao gồm:
destinationStatuses
: Một mảng cho biết trạng thái phê duyệt của sản phẩm cho từng vị trí xuất hiện (chẳng hạn nhưSHOPPING_ADS
). Mảng này liệt kê các quốc gia nơi sản phẩm được phê duyệt, đang chờ xử lý hoặc bị từ chối.itemLevelIssues
: Một mảng chứa mọi vấn đề về xác thực dữ liệu hoặc chính sách được phát hiện cho sản phẩm. Mỗi vấn đề đều có nội dung mô tả, mức độ nghiêm trọng, thuộc tính bị ảnh hưởng và tài liệu để giúp bạn giải quyết vấn đề.
Dưới đây là ví dụ về một productStatus
cho một sản phẩm bị từ chối đối với quảng cáo Mua sắm ở Hoa Kỳ do GTIN không hợp lệ:
{
"productStatus": {
"destinationStatuses": [
{
"reportingContext": "SHOPPING_ADS",
"disapprovedCountries": [
"US"
]
}
],
"itemLevelIssues": [
{
"code": "invalid_gtin",
"severity": "DISAPPROVED",
"resolution": "merchant_action",
"attribute": "gtins",
"reportingContext": "SHOPPING_ADS",
"description": "Invalid GTIN",
"detail": "The value provided for the gtin attribute is not a valid GTIN.",
"documentation": "https://support.google.com/merchants/answer/6324461",
"applicableCountries": [
"US"
]
}
]
}
}
Lọc sản phẩm
Bạn có thể lọc sản phẩm một cách hiệu quả bằng cách sử dụng phương thức reports.search
từ API phụ Báo cáo thay vì liệt kê tất cả sản phẩm và lọc chúng ở phía bạn.
Ví dụ: để chỉ truy xuất danh sách sản phẩm bị từ chối, bạn có thể tạo một truy vấn reports.search
trên bảng ProductView
để chọn những sản phẩm có aggregated_reporting_context_status
là NOT_ELIGIBLE_OR_DISAPPROVED
. Bạn cũng có thể lọc theo các thuộc tính khác, ví dụ: availability
hoặc language_code
. Để biết thêm thông tin về cách tạo các chức năng lọc, hãy xem phần hướng dẫn Lọc sản phẩm.
POST https://merchantapi.googleapis.com/reports/v1/accounts/{ACCOUNT_ID}/reports:search
{
"query": "SELECT offer_id, id, title FROM product_view WHERE aggregated_reporting_context_status = 'NOT_ELIGIBLE_OR_DISAPPROVED'"
}
Các mẫu mã sau đây cho biết cách lọc các sản phẩm bị từ chối.
Java
import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.products.v1.GetProductRequest;
import com.google.shopping.merchant.products.v1.Product;
import com.google.shopping.merchant.products.v1.ProductsServiceClient;
import com.google.shopping.merchant.products.v1.ProductsServiceSettings;
import com.google.shopping.merchant.reports.v1.ReportRow;
import com.google.shopping.merchant.reports.v1.ReportServiceClient;
import com.google.shopping.merchant.reports.v1.ReportServiceClient.SearchPagedResponse;
import com.google.shopping.merchant.reports.v1.ReportServiceSettings;
import com.google.shopping.merchant.reports.v1.SearchRequest;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;
/**
* This class demonstrates how to get the list of all the disapproved products for a given merchant
* center account.
*/
public class FilterDisapprovedProductsSample {
// Gets the product details for a given product using the GetProduct method.
public static void getProduct(GoogleCredentials credential, Config config, String productName)
throws Exception {
// Creates service settings using the credentials retrieved above.
ProductsServiceSettings productsServiceSettings =
ProductsServiceSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credential))
.build();
// Calls the API and catches and prints any network failures/errors.
try (ProductsServiceClient productsServiceClient =
ProductsServiceClient.create(productsServiceSettings)) {
// The name has the format: accounts/{account}/products/{productId}
GetProductRequest request = GetProductRequest.newBuilder().setName(productName).build();
Product response = productsServiceClient.getProduct(request);
System.out.println(response);
} catch (Exception e) {
System.out.println(e);
}
}
// Filters the disapproved products for a given Merchant Center account using the Reporting API.
// Then, it prints the product details for each disapproved product.
public static void filterDisapprovedProducts(Config config) throws Exception {
GoogleCredentials credential = new Authenticator().authenticate();
ReportServiceSettings reportServiceSettings =
ReportServiceSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credential))
.build();
try (ReportServiceClient reportServiceClient =
ReportServiceClient.create(reportServiceSettings)) {
// The parent has the format: accounts/{accountId}
String parent = String.format("accounts/%s", config.getAccountId().toString());
// The query below is an example of a query for the productView that gets product informations
// for all disapproved products.
String query =
"SELECT offer_id,"
+ "id,"
+ "title,"
+ "price"
+ " FROM product_view"
// aggregated_reporting_context_status can be one of the following values:
// NOT_ELIGIBLE_OR_DISAPPROVED, ELIGIBLE, PENDING, ELIGIBLE_LIMITED,
// AGGREGATED_REPORTING_CONTEXT_STATUS_UNSPECIFIED
+ " WHERE aggregated_reporting_context_status = 'NOT_ELIGIBLE_OR_DISAPPROVED'";
// Create the search report request.
SearchRequest request = SearchRequest.newBuilder().setParent(parent).setQuery(query).build();
System.out.println("Sending search report request for Product View.");
// Calls the Reports.search API method.
SearchPagedResponse response = reportServiceClient.search(request);
System.out.println("Received search reports response: ");
// Iterates over all report rows in all pages and prints each report row in separate line.
// Automatically uses the `nextPageToken` if returned to fetch all pages of data.
for (ReportRow row : response.iterateAll()) {
System.out.println("Printing data from Product View:");
System.out.println(row);
// Optionally, you can get the full product details by calling the GetProduct method.
String productName =
"accounts/"
+ config.getAccountId().toString()
+ "/products/"
+ row.getProductView().getId();
System.out.println("Getting full product details by calling GetProduct method:");
getProduct(credential, config, productName);
}
} catch (Exception e) {
System.out.println("Failed to search reports for Product View.");
System.out.println(e);
}
}
public static void main(String[] args) throws Exception {
Config config = Config.load();
filterDisapprovedProducts(config);
}
}
PHP
use Google\ApiCore\ApiException;
use Google\Shopping\Merchant\Products\V1\Client\ProductsServiceClient;
use Google\Shopping\Merchant\Products\V1\GetProductRequest;
use Google\Shopping\Merchant\Reports\V1\Client\ReportServiceClient;
use Google\Shopping\Merchant\Reports\V1\SearchRequest;
/**
* This class demonstrates how to get the list of all the disapproved products for a given merchant
* center account.
*/
class FilterDisapprovedProducts
{
/**
* Gets the product details for a given product using the GetProduct method.
*
* @param mixed $credentials The OAuth credentials.
* @param array $config The configuration data, including 'accountId'.
* @param string $productName The full resource name of the product to retrieve.
* Format: accounts/{account}/products/{product}
*/
private static function getProduct(
$credentials,
array $config,
string $productName
): void {
// Creates options config containing credentials for the client to use.
$options = ['credentials' => $credentials];
// Creates a ProductsServiceClient.
$productsServiceClient = new ProductsServiceClient($options);
// Calls the API and catches and prints any network failures/errors.
try {
// Construct the GetProductRequest.
// The name has the format: accounts/{account}/products/{productId}
$request = new GetProductRequest(['name' => $productName]);
// Make the API call.
$response = $productsServiceClient->getProduct($request);
// Prints the retrieved product.
// Protobuf messages are printed as JSON strings for readability.
print $response->serializeToJsonString() . "\n";
} catch (ApiException $e) {
// Prints any errors that occur during the API call.
printf("ApiException was thrown: %s\n", $e->getMessage());
}
}
/**
* Filters disapproved products for a given Merchant Center account using the Reporting API,
* then prints the details for each disapproved product.
*
* @param array $config The configuration data used for authentication and
* getting the account ID.
*/
public static function filterDisapprovedProductsSample(array $config): void
{
// Gets the OAuth credentials to make the request.
$credentials = Authentication::useServiceAccountOrTokenFile();
// Creates options config containing credentials for the Report client to use.
$reportClientOptions = ['credentials' => $credentials];
// Creates a ReportServiceClient.
$reportServiceClient = new ReportServiceClient($reportClientOptions);
// The parent resource name for the report.
// Format: accounts/{accountId}
$parent = sprintf("accounts/%s", $config['accountId']);
// The query to select disapproved products from the product_view.
// This query retrieves offer_id, id, title, and price for products
// that are 'NOT_ELIGIBLE_OR_DISAPPROVED'.
$query = "SELECT offer_id, id, title, price FROM product_view"
. " WHERE aggregated_reporting_context_status = 'NOT_ELIGIBLE_OR_DISAPPROVED'";
// Create the search report request.
$request = new SearchRequest([
'parent' => $parent,
'query' => $query
]);
print "Sending search report request for Product View.\n";
// Calls the Reports.search API method.
try {
$response = $reportServiceClient->search($request);
print "Received search reports response: \n";
// Iterates over all report rows in all pages.
// The client library automatically handles pagination.
foreach ($response->iterateAllElements() as $row) {
print "Printing data from Product View:\n";
// Prints the ReportRow object as a JSON string.
print $row->serializeToJsonString() . "\n";
// Get the full product resource name from the report row.
// The `id` field in ProductView is the product's full resource name.
// Format: `accounts/{account}/products/{product}`
$productName = $parent . "/products/" . $row->getProductView()->getId();
// OPTIONAL: Call getProduct to retrieve and print full product details.
// Pass the original credentials and config.
print "Getting full product details by calling GetProduct method:\n";
self::getProduct($credentials, $config, $productName);
}
} catch (ApiException $e) {
// Prints any errors that occur during the API call.
printf("ApiException was thrown: %s\n", $e->getMessage());
}
}
/**
* Helper to execute the sample.
*/
public function callSample(): void
{
$config = Config::generateConfig();
self::filterDisapprovedProductsSample($config);
}
}
// Run the script
$sample = new FilterDisapprovedProducts();
$sample->callSample();
Python
from examples.authentication import configuration
from examples.authentication import generate_user_credentials
from google.shopping.merchant_products_v1 import GetProductRequest
from google.shopping.merchant_products_v1 import ProductsServiceClient
from google.shopping.merchant_reports_v1 import ReportServiceClient
from google.shopping.merchant_reports_v1 import SearchRequest
# Read the merchant account ID from the configuration file.
# This is a global variable used by the functions below.
_ACCOUNT_ID = configuration.Configuration().read_merchant_info()
def get_product(credentials, product_name: str):
"""Gets the product details for a given product name.
Args:
credentials: The OAuth2 credentials.
product_name: The full resource name of the product, e.g.,
"accounts/{account}/products/{product}".
"""
# Create a Products API client.
products_service_client = ProductsServiceClient(credentials=credentials)
# Prepare the GetProduct request.
# The name has the format: accounts/{account}/products/{productId}
request = GetProductRequest(name=product_name)
# Call the API and print the response or any errors.
try:
response = products_service_client.get_product(request=request)
print(response)
except RuntimeError as e:
print(f"Failed to get product {product_name}:")
print(e)
def filter_disapproved_products():
"""Filters disapproved products and prints their details."""
# Get OAuth2 credentials.
credentials = generate_user_credentials.main()
# Create a Report API client.
report_service_client = ReportServiceClient(credentials=credentials)
# Construct the parent resource name for the account.
# The parent has the format: accounts/{accountId}
parent = f"accounts/{_ACCOUNT_ID}"
# Define the query to select disapproved products.
# This query retrieves product information for all disapproved products.
# aggregated_reporting_context_status can be one of the following values:
# NOT_ELIGIBLE_OR_DISAPPROVED, ELIGIBLE, PENDING, ELIGIBLE_LIMITED,
# AGGREGATED_REPORTING_CONTEXT_STATUS_UNSPECIFIED
query = (
"SELECT offer_id, id, title, price "
"FROM product_view "
"WHERE aggregated_reporting_context_status ="
"'NOT_ELIGIBLE_OR_DISAPPROVED'"
)
# Create the search report request.
request = SearchRequest(parent=parent, query=query)
print("Sending search report request for Product View.")
try:
# Call the Reports.search API method.
response = report_service_client.search(request=request)
print("Received search reports response: ")
# Iterate over all report rows.
# The client library automatically handles pagination.
for row in response:
print("Printing data from Product View:")
print(row)
# Construct the full product resource name using the product_view.id
# (which is the REST ID like "online~en~GB~123") from the report.
# The product_view.id from the report is the {product_id} part.
product_name = (
f"accounts/{_ACCOUNT_ID}/products/{row.product_view.id}"
)
# OPTIONAL, get full product details by calling the GetProduct method.
print("Getting full product details by calling GetProduct method:")
get_product(credentials, product_name)
except RuntimeError as e:
print(e)
if __name__ == "__main__":
filter_disapproved_products()
Apps_Script
/**
* Demonstrates how to filter disapproved products using the Merchant API Reports service.
*/
function filterDisapprovedProducts() {
// IMPORTANT:
// Enable the Merchant API Reports sub-API Advanced Service and call it
// "MerchantApiReports"
// Enable the Merchant API Products sub-API Advanced Service and call it
// "MerchantApiProducts"
// Replace this with your Merchant Center ID.
const accountId = '<INSERT_MERCHANT_CENTER_ID>';
// Construct the parent name
const parent = 'accounts/' + accountId;
try {
console.log('Sending search Report request');
// Set pageSize to the maximum value (default: 1000)
let pageSize = 1000;
let pageToken;
// The query below is an example of a query for the productView that gets product informations
// for all disapproved products.
let query = 'SELECT offer_id,' +
'id,' +
'price,' +
'title' +
' FROM product_view' +
' WHERE aggregated_reporting_context_status = "NOT_ELIGIBLE_OR_DISAPPROVED"';
// Call the Reports.search API method. Use the pageToken to iterate through
// all pages of results.
do {
response =
MerchantApiReports.Accounts.Reports.search({query, pageSize, pageToken}, parent);
for (const reportRow of response.results) {
console.log("Printing data from Product View:");
console.log(reportRow);
// OPTIONALLY, you can get the full product details by calling the GetProduct method.
let productName = parent + "/products/" + reportRow.getProductView().getId();
product = MerchantApiProducts.Accounts.Products.get(productName);
console.log(product);
}
pageToken = response.nextPageToken;
} while (pageToken); // Exits when there is no next page token.
} catch (e) {
console.log('ERROR!');
console.log('Error message:' + e.message);
}
}
cURL
curl -X POST "https://merchantapi.googleapis.com/reports/v1/accounts/{ACCOUNT_ID}/reports:search" \
-H "Authorization: Bearer <API_TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"query": "SELECT offer_id, id, title FROM product_view WHERE aggregated_reporting_context_status = \"NOT_ELIGIBLE_OR_DISAPPROVED\""
}'