Google Places API仅能获取5条评论问题求助
解决Google Places API仅返回5条评论的问题
我正在用Google Spreadsheet和Google Places API抓取商家评论,商家实际有800+条评论,但脚本只能拿到5条。以下是我的代码和运行日志:
function fetchAllGoogleReviews() { const apiKey = 'MY_API_KEY'; // Replace with your API key const placeId = 'MY_PLACE_ID'; // Your Place ID const url = `https://maps.googleapis.com/maps/api/place/details/json?placeid=${placeId}&fields=name,reviews&key=${apiKey}`; const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // Clear previous data but keep the header row sheet.getRange('A2:D').clearContent(); let nextPageToken = ''; let allReviews = []; let totalReviewsCount = 0; do { const requestUrl = nextPageToken ? `${url}&pagetoken=${nextPageToken}` : url; Logger.log('Requesting URL: ' + requestUrl); const response = UrlFetchApp.fetch(requestUrl); const json = JSON.parse(response.getContentText()); Logger.log('API Response: ' + JSON.stringify(json)); if (json.result && json.result.reviews) { const reviews = json.result.reviews; totalReviewsCount += reviews.length; allReviews = allReviews.concat(reviews); nextPageToken = json.next_page_token || ''; Logger.log('Retrieved ' + reviews.length + ' reviews. Total so far: ' + totalReviewsCount); Logger.log('Next Page Token: ' + nextPageToken); if (nextPageToken) { Utilities.sleep(3000); // Wait before fetching the next page Logger.log('Waiting for 3 seconds before the next request...'); } } else { Logger.log('No more reviews or next_page_token not found.'); nextPageToken = ''; } } while (nextPageToken); // Populate the sheet with all reviews if (allReviews.length > 0) { allReviews.forEach((review, index) => { const row = index + 2; // Start from the second row (A2) const reviewDate = new Date(review.time * 1000); const formattedDate = Utilities.formatDate(reviewDate, Session.getScriptTimeZone(), 'dd-MM-yyyy'); sheet.getRange(row, 1).setValue(review.author_name); // Column A: Author Name sheet.getRange(row, 2).setValue(formattedDate); // Column B: Review Date sheet.getRange(row, 3).setValue(review.rating); // Column C: Rating sheet.getRange(row, 4).setValue(review.text); // Column D: Review Text }); } else { sheet.getRange(2, 1).setValue("No reviews found."); } Logger.log('Total reviews fetched: ' + totalReviewsCount); }
运行脚本后的日志输出:
Info: Retrieved 5 reviews. Total so far: 5 Info: Next Page Token: Info: Total reviews fetched: 5
日志显示没有next_page_token,但实际商家评论远不止5条,求解决办法。
问题根源
Google Places API的Place Details端点本身存在评论返回限制:它最多仅返回5条最新的用户评论,且该端点不支持通过分页(next_page_token)获取更多评论——你看到next_page_token为空是正常现象,因为这个接口根本没提供评论分页的功能。
解决办法
要获取商家的全部评论,必须改用Google Business Profile API(原Google My Business API),这是官方唯一能获取商家所有评论的途径。具体步骤如下:
- 权限验证:你需要拥有该商家的管理权限,并且通过OAuth 2.0完成API授权(该接口需要用户权限,无法直接用API Key调用)。
- 调用正确端点:使用
accounts/{accountId}/locations/{locationId}/reviews/list端点获取所有评论,这个端点支持分页,可通过pageSize和pageToken参数遍历全部评论。 - 适配Spreadsheet脚本:在Google Apps Script中配置OAuth客户端,通过授权后的请求调用Business Profile API,再将返回的评论写入表格。
代码调整示例(Business Profile API方向)
以下是简化的实现框架(需先完成OAuth配置):
function fetchAllBusinessReviews() { const accountId = 'YOUR_ACCOUNT_ID'; const locationId = 'YOUR_LOCATION_ID'; const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); sheet.getRange('A2:D').clearContent(); let pageToken = ''; let allReviews = []; do { const url = `https://mybusiness.googleapis.com/v4/accounts/${accountId}/locations/${locationId}/reviews?pageToken=${pageToken}&pageSize=50`; // 需通过OAuth授权请求,不能直接用无认证的UrlFetchApp.fetch const response = UrlFetchApp.fetch(url, { headers: { 'Authorization': 'Bearer ' + ScriptApp.getOAuthToken() } }); const json = JSON.parse(response.getContentText()); if (json.reviews) { allReviews = allReviews.concat(json.reviews); pageToken = json.nextPageToken || ''; Utilities.sleep(1000); // 避免请求频率超限 } else { pageToken = ''; } } while (pageToken); // 将评论写入表格 allReviews.forEach((review, index) => { const row = index + 2; const reviewDate = new Date(review.updateTime); const formattedDate = Utilities.formatDate(reviewDate, Session.getScriptTimeZone(), 'dd-MM-yyyy'); sheet.getRange(row, 1).setValue(review.reviewer.displayName); sheet.getRange(row, 2).setValue(formattedDate); sheet.getRange(row, 3).setValue(review.starRating); sheet.getRange(row, 4).setValue(review.comment); }); Logger.log('Total reviews fetched: ' + allReviews.length); }
注意事项
- 需先在Google Cloud Console中启用Google Business Profile API,并配置OAuth同意屏幕和客户端ID。
- 确保你的Google账号拥有该商家的管理权限,否则无法获取评论数据。
内容的提问来源于stack exchange,提问作者user17982950
相关产品推荐
相关产品推荐

