调用Google Sheets API v4获取表格时报无法解析为XML错误如何解决
错误根因
- 你使用的
asimlqt/php-google-spreadsheet-client类库是基于 Google Sheets API v3 开发的,v3 响应格式为 XML,而你切换到的 v4 版本所有响应均为 JSON 格式,SpreadsheetFeed仍尝试将 JSON 传入SimpleXMLElement做XML解析,自然会触发解析错误,日志中出现的{字符就是JSON响应的起始标记。 - 你当前
getSpreadsheets方法调用的API端点错误:v4/spreadsheets/[指定文件ID]?fields=sheets.properties.title是用于获取单个指定电子表格的内部工作表名称,无法获取你Google Drive下所有电子表格的列表。
解决方案
方案一:改造现有代码适配v4接口
- 调整权限与请求端点
要获取Drive下所有电子表格,需要调用Google Drive API的文件列表接口,为你的Access Token添加https://www.googleapis.com/auth/drive.readonly权限,请求地址改为https://www.googleapis.com/drive/v3/files?q=mimeType='application/vnd.google-apps.spreadsheet' - 重写SpreadsheetFeed解析逻辑
将原XML解析逻辑替换为JSON解析:
public function __construct($jsonResponse) { $responseData = json_decode($jsonResponse, true); if (json_last_error() !== JSON_ERROR_NONE) { throw new \Exception("响应解析失败:" . json_last_error_msg()); } $spreadsheets = []; foreach ($responseData['files'] as $file) { // 需同步调整Spreadsheet类的构造逻辑,适配传入的数组结构 $spreadsheets[] = new Spreadsheet($file); } parent::__construct($spreadsheets); }
- 调整Spreadsheet类逻辑
原类接收SimpleXMLElement对象,改造后接收数组,表格名称直接取$file['name'],表格ID取$file['id']即可。
方案二:使用官方Google PHP Client库(更稳定)
直接使用Google官方维护的客户端库,无需手动处理响应解析,示例如下:
- 安装依赖
composer require google/apiclient:^2.0
- 调用示例
$client = new Google\Client(); $client->setAccessToken($token->access_token); $client->addScope('https://www.googleapis.com/auth/drive.readonly'); $driveService = new Google\Service\Drive($client); $fileList = $driveService->files->listFiles([ 'q' => "mimeType='application/vnd.google-apps.spreadsheet'", 'fields' => 'files(id,name)' ]); foreach ($fileList->getFiles() as $spreadsheet) { echo "表格名称:" . $spreadsheet->getName() . ",表格ID:" . $spreadsheet->getId() . "\n"; }
内容的提问来源于stack exchange,提问作者mirec
相关产品推荐
相关产品推荐

