PHP调用Google Sheets API报属性未定义、append()空值错误
问题根因
两个报错是同一个拼写错误引发的连锁反应:
- 你写的属性名
spreedsheets_values存在拼写错误,Google Sheets PHP SDK中对应值操作资源的正确属性名是spreadsheets_values(正确拼写为spread,你错写成spreed,a和e位置写反),PHP找不到该属性时会默认返回null,同时抛出Undefined property警告 - 对
null值调用append()方法,就触发了后续调用空对象成员函数的致命错误
除此之外代码里还有几个隐藏问题,就算修正了拼写也大概率无法正常运行:
- 定义了
$inset变量想配置INSERT_ROWS追加行模式,但没有把该参数传入append方法,默认逻辑会覆盖已有单元格内容而非追加新行 - 权限配置逻辑错误:先给客户端添加了Drive权限,后面又调用
setScopes()把权限重置为仅Sheets权限,之前配置的Drive权限直接失效 - 凭据路径写死为本地桌面的Windows绝对路径,代码换目录、换机器部署时会直接找不到凭据文件
- 直接从
$_GET读取参数没有做兜底处理,前端漏传参数时会抛出PHP警告 - 写入范围只填了工作表名
Form Responses 1没有指定列范围,追加数据时很容易出现列错位
修复方案
- 修正属性拼写错误,将
$service->spreedsheets_values改为$service->spreadsheets_values - 把追加行模式的配置项直接传入append方法的参数数组,删除无用的
$inset变量 - 调整权限配置逻辑,一次性配置所有需要的权限,不要重复调用
setScopes()覆盖已有配置 - 把凭据路径改为相对路径,通过
__DIR__定位文件,避免写死系统绝对路径 - 用空合并运算符给GET参数设置默认值,避免参数缺失抛出警告
- 给写入范围加上列标识,比如
Form Responses 1!A:J,明确从A列开始写入,匹配你要写入的10个字段,避免列错位
修正后可运行代码
<?php // GET参数默认值兜底,避免参数缺失报错 $time = time(); $name = $_GET['cname'] ?? ''; $invoiceNumber = $_GET['invoice'] ?? ''; $date = $_GET['date'] ?? ''; $percentage = $_GET['percentage'] ?? 0; $taxableValue = $_GET['taxableValue'] ?? 0; $discount = $_GET['discount'] ?? 0; $invoictotoal = $_GET['total'] ?? 0; $sgst = $percentage * $taxableValue / 100; require __DIR__ . '/vendor/autoload.php'; /** * 返回授权后的API客户端 * @return \Google\Client */ function getClient() { $client = new \Google_Client(); $client->setApplicationName('Google Sheets API PHP Quickstart'); // 一次性配置所有需要的权限,不要后续重复调用setScopes覆盖 $client->setScopes([ \Google_Service_Sheets::SPREADSHEETS, \Google_Service_Drive::DRIVE ]); // 用相对路径定位凭据文件,不要写死系统绝对路径 $client->setAuthConfig(__DIR__ . '/credentials.json'); $client->setAccessType('offline'); return $client; } $client = getClient(); $service = new Google\Service\Sheets($client); try{ $spreadsheetId = '1H6EHEHGsHyRZTE-j8er9DrZjj-b9TkRg0p96K-h90Pc'; // 明确指定写入列范围,匹配10个写入字段 $range = 'Form Responses 1!A:J'; $valuetoinsert = [ [$time,$name,$invoiceNumber,$date,$percentage,$invoictotoal,$taxableValue,$discount,$sgst,$sgst], ]; $body = new Google_Service_Sheets_ValueRange([ 'values' => $valuetoinsert ]); $params = [ 'valueInputOption' => 'RAW', 'insertDataOption' => 'INSERT_ROWS' // 配置追加行模式 ]; // 修正属性拼写,传入所有配置参数 $result = $service->spreadsheets_values->append( $spreadsheetId, $range, $body, $params ); echo "数据写入成功,更新范围:" . $result->getUpdates()->getUpdatedRange(); } catch(Exception $e) { echo "写入失败:" . $e->getMessage(); } ?>
运行注意事项
- 将
credentials.json凭据文件放到和insert.php同目录下,不要放在桌面等系统路径 - 首次运行需要跳转到Google授权页完成授权,确保使用的账号有目标表格的编辑权限
- 如果提示权限不足,需要把凭据对应的服务账号邮箱添加为表格协作者,授予编辑权限
内容的提问来源于stack exchange,提问作者RAHUL MITTAL
相关产品推荐
相关产品推荐

