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

使用GSpread将JSON写入Google Sheet遇问题,含HTTP 403错误求助

解决JSON数据写入Google Sheet及HTTP 403问题

问题拆解

  1. 初始尝试写入JSON时,因JSON包含列表等复杂数据类型,导致写入失败
  2. 修改代码后出现urllib.error.HTTPError: HTTP Error 403: Forbidden,但用requests可正常访问API,说明是urllib默认请求头被服务器拦截

解决方案

1. 替换urllib为requests获取API数据

urllib默认请求头缺少服务器认可的标识,容易被拦截。改用requests库,其默认请求头更符合服务器要求,可直接避免403错误。

2. 统一处理JSON中的复杂数据类型

Google Sheet仅支持字符串、数字等基础类型写入,需将JSON中的列表、字典等复杂类型转换为字符串格式。

修正后的完整脚本

import json
import requests
import gspread

# 初始化Google Sheet连接
gc = gspread.service_account(filename='creds.json')
sh = gc.open_by_key('1-1aiGMn2yUWRlh_jnIebcMNs-6phzUNxkktAFH7uY9o')
worksheet = sh.sheet1

# 用requests获取API数据,规避403拦截
url = 'https://api.chucknorris.io/jokes/random'
response = requests.get(url)
data_json = response.json()

# 转换JSON数据为Sheet可接受的二维列表格式
result = []
for key, value in data_json.items():
    # 处理列表类型,转为逗号分隔字符串
    if isinstance(value, list):
        processed_value = ",".join(map(str, value))
    # 处理字典类型,转为JSON字符串
    elif isinstance(value, dict):
        processed_value = json.dumps(value)
    # 其他类型直接转为字符串
    else:
        processed_value = str(value)
    result.append([key, processed_value])

# 写入Sheet,指定参数确保内容格式正确
worksheet.update('A1', result, value_input_option='USER_ENTERED')

关键细节说明

  • requests.get(url):自动适配服务器要求的请求头,解决403问题
  • 类型转换逻辑:确保所有JSON值都能被Google Sheet识别写入
  • value_input_option='USER_ENTERED':让Sheet以用户手动输入的逻辑解析内容,避免格式异常

追加数据的替代写法

如果需要每次请求后将数据追加到Sheet末尾,可替换写入部分代码:

# 获取当前Sheet最后一行,从下一行开始写入
last_row = len(worksheet.get_all_values()) + 1
worksheet.update(f'A{last_row}', result, value_input_option='USER_ENTERED')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 05:35:20