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

如何将access token和refresh token传入Google Sheets客户端?

问题根因
  • gapi.client.init 不支持直接传入refresh_token参数,且你自行传入的access_token不会被gapi自动加载到请求头中,导致请求缺失鉴权信息,触发401错误
  • 你在test.php中的access_token刷新逻辑有缺陷:刷新得到新的access_token后没有写回token.json文件,导致import.php读取的始终是旧的过期凭证
  • 同时传入API Key和OAuth2凭证会导致鉴权逻辑冲突,使用OAuth2访问私有接口时不需要携带API Key
修复步骤

1. 修复test.php的token持久化逻辑

在test.php中刷新access_token的代码块末尾,增加新token的持久化操作:

// 原有刷新token逻辑
$response = curl_exec($ch);
curl_close ($ch);
// 新增:把新的token写回token.json
file_put_contents('token.json', $response);

2. 修复import.php的gapi鉴权逻辑

删除init方法中无效的clientId、refresh_token、apiKey参数,手动给gapi设置全局授权头,修改后的代码如下:

function makeApiCall() {
  var params = {
    spreadsheetId: "1qBX_v***",
    range: "CSV-to-Google-Sheet", 
    valueInputOption: 'RAW',
  }
  
  var valueRangeBody = {
    "values": <?php echo '[' . implode(',', $newData) . ']'; ?>
  }; 
  var request = gapi.client.sheets.spreadsheets.values.update(params, valueRangeBody);
  request.then(function(response) {
  }, function(reason) {
    console.error('error2: ' + reason.result.error.message);
  });
} 

<?php
$response = file_get_contents('token.json');
$array = json_decode($response);
?>
var access_token = <?php  echo "'".$array->access_token."'"; ?>;

function initClient() {
  gapi.client.init({
    'discoveryDocs': ['https://sheets.googleapis.com/$discovery/rest?version=v4'],
  }).then(function() {
    // 关键:手动设置全局请求授权头
    gapi.client.setToken({
      access_token: access_token
    });
    makeApiCall();
  }); 
}
优化建议

你可以直接在PHP服务端调用Google Sheets API完成数据写入,不需要把access_token暴露到前端,安全性更高,也能避免前端鉴权的各类兼容问题。

内容的提问来源于stack exchange,提问作者DorFik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 20:54:07