You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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没有指定列范围,追加数据时很容易出现列错位
修复方案
  1. 修正属性拼写错误,将$service->spreedsheets_values改为$service->spreadsheets_values
  2. 把追加行模式的配置项直接传入append方法的参数数组,删除无用的$inset变量
  3. 调整权限配置逻辑,一次性配置所有需要的权限,不要重复调用setScopes()覆盖已有配置
  4. 把凭据路径改为相对路径,通过__DIR__定位文件,避免写死系统绝对路径
  5. 用空合并运算符给GET参数设置默认值,避免参数缺失抛出警告
  6. 给写入范围加上列标识,比如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 21:18:21