使用PHP客户端库与Google Sheets API创建表格失败无报错
我注意到你的代码里有几个关键问题,会导致表格创建失败却没有任何错误提示,咱们一步步来解决:
1. 必须开启Session
你的代码依赖$_SESSION存储access token,但PHP默认不会自动启动Session,所以一定要在代码最开头加上:
session_start();
如果没开Session,$_SESSION['access_token']根本无法保存,后续请求要么一直跳转到授权页面,要么因为没有有效token静默失败。
2. 添加错误捕获逻辑
Google API客户端在请求失败时会抛出异常,但你的代码完全没有捕获机制,错误信息直接被隐藏了。给创建表格的代码加上try-catch块,就能看到具体问题:
try { $spreadsheet = $service->spreadsheets->create($spreadsheet, array('fields' => 'spreadsheetId')); echo 'Spreadsheet ID: ' . $spreadsheet->getSpreadsheetId(); } catch (Google_Service_Exception $e) { echo 'Google API Error: ' . $e->getMessage(); // 打印详细错误详情,方便精准排查 echo '<pre>' . print_r($e->getErrors(), true) . '</pre>'; } catch (Exception $e) { echo 'General Error: ' . $e->getMessage(); }
这一步能帮你直接定位问题,比如权限不足、token过期、请求格式错误等。
3. 补充权限范围
你当前只设置了Drive的权限,虽然创建表格需要Drive权限,但建议同时添加Sheets专属权限,避免权限限制导致的静默失败:
$client->setScopes( array( 'https://www.googleapis.com/auth/drive', 'https://www.googleapis.com/auth/spreadsheets' ) );
4. 修正重定向URI
你的$redirect_uri里的{site}需要替换成实际域名,而且路径/wp-admin/plugins.php/oauth大概率有问题——plugins.php是WordPress的插件管理页面,直接在后面加/oauth不是有效端点,建议改成专门的授权回调文件,比如/wp-admin/google-sheets-callback.php,确保这个文件存在且能正常访问。
5. 调整fields参数
你设置了'fields' => 'spreadsheetId',如果请求失败,API返回的错误信息会被这个参数过滤掉。可以先暂时移除这个参数,或者改成'fields' => '*',获取完整响应内容:
$spreadsheet = $service->spreadsheets->create($spreadsheet); // 或者 $spreadsheet = $service->spreadsheets->create($spreadsheet, array('fields' => '*'));
整合修复后的完整代码
这里把所有修复点整合到代码里,你可以直接参考:
<?php session_start(); // 开启Session require_once __DIR__ . '/vendor/autoload.php'; $client_id = '*********.apps.googleusercontent.com'; $client_secret = '**************************'; $redirect_uri = 'https://your-actual-domain.com/wp-admin/google-sheets-callback.php'; // 替换成实际地址 $client = new Google_Client(); $client->setClientId( $client_id ); $client->setClientSecret( $client_secret ); $client->setRedirectUri( $redirect_uri ); // 补充双权限范围 $client->setScopes( array( 'https://www.googleapis.com/auth/drive', 'https://www.googleapis.com/auth/spreadsheets' ) ); if ( isset( $_GET['code'] ) ) { try { $client->authenticate( $_GET['code'] ); $_SESSION['access_token'] = $client->getAccessToken(); header( 'Location: ' . filter_var( $redirect_uri, FILTER_SANITIZE_URL ) ); exit; } catch (Exception $e) { echo 'Auth Error: ' . $e->getMessage(); exit; } } if ( ! isset( $_SESSION['access_token'] ) ) { $auth_url = $client->createAuthUrl(); header( 'Location: ' . filter_var( $auth_url, FILTER_SANITIZE_URL ) ); exit; } $client->setAccessToken( $_SESSION['access_token'] ); // 自动刷新过期的token if ($client->isAccessTokenExpired()) { if ($client->getRefreshToken()) { $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken()); $_SESSION['access_token'] = $client->getAccessToken(); } else { // 无刷新token时重新引导授权 $auth_url = $client->createAuthUrl(); header( 'Location: ' . filter_var( $auth_url, FILTER_SANITIZE_URL ) ); exit; } } $service = new Google_Service_Sheets($client); $spreadsheet = new Google_Service_Sheets_Spreadsheet(array( 'properties' => array( 'title' => 'My New Spreadsheet' ), 'sheets' => array( new Google_Service_Sheets_Sheet(array( 'properties' => array( 'title' => 'Sheet1', 'gridProperties' => array( 'rowCount' => 20, 'columnCount' => 12 ) ) )) ) )); try { // 暂时移除fields参数,获取完整响应 $spreadsheet = $service->spreadsheets->create($spreadsheet); echo 'Spreadsheet ID: ' . $spreadsheet->getSpreadsheetId(); } catch (Google_Service_Exception $e) { echo 'Google API Error: ' . $e->getMessage(); echo '<pre>' . print_r($e->getErrors(), true) . '</pre>'; } catch (Exception $e) { echo 'General Error: ' . $e->getMessage(); } ?>
按照上面的步骤排查,你应该能快速找到失败原因并解决问题。
内容的提问来源于stack exchange,提问作者Shikha Negi

