调用Sheety写入Google Sheet遇权限错误及500服务器错误求助
问题描述
我用以下Python代码同步运动数据至Google Sheet:
import requests from datetime import datetime GENDER = YOUR GENDER WEIGHT_KG = YOUR WEIGHT HEIGHT_CM = YOUR HEIGHT AGE = YOUR AGE APP_ID = YOUR NUTRITIONIX APP ID API_KEY = YOUR NUTRITIONIX API KEY exercise_endpoint = "https://trackapi.nutritionix.com/v2/natural/exercise" sheet_endpoint = YOUR SHEETY ENDPOINT exercise_text = input("Tell me which exercises you did: ") headers = { "x-app-id": APP_ID, "x-app-key": API_KEY, } parameters = { "query": exercise_text, "gender": GENDER, "weight_kg": WEIGHT_KG, "height_cm": HEIGHT_CM, "age": AGE } response = requests.post(exercise_endpoint, json=parameters, headers=headers) result = response.json() ################### Start of Step 4 Solution ###################### today_date = datetime.now().strftime("%d/%m/%Y") now_time = datetime.now().strftime("%X") for exercise in result["exercises"]: sheet_inputs = { "workout": { "date": today_date, "time": now_time, "exercise": exercise["name"].title(), "duration": exercise["duration_min"], "calories": exercise["nf_calories"] } } sheet_response = requests.post(sheet_endpoint, json=sheet_inputs) print(sheet_response.text)
执行后预期Google Sheet新增一行运动数据,但实际返回权限错误:
{ "errors": [ { "detail": "The caller does not have permission" } ] }
同时触发异常:
raise HTTPError(http_error_msg, response=self) requests.exceptions.HTTPError: 500 Server Error: Internal Server Error for url:
解决方案
权限错误修复
- 检查Sheety项目权限:
登录Sheety后台,找到对应项目,将权限设置为Anyone, even anonymous(测试阶段可用);若需认证,要在请求headers中添加正确的认证信息:- API密钥认证:添加
"Authorization": "Bearer {你的Sheety API密钥}" - 基本认证:将用户名密码转为Base64编码后,添加
"Authorization": "Basic {编码后的字符串}"
- API密钥认证:添加
- 确认Google Sheet共享权限:
打开目标Google Sheet,点击右上角「共享」,确保Sheety访问账号(或服务账号)拥有编辑权限,不能仅设置为查看。
500服务器错误修复
- 验证Sheety端点正确性:
确认sheet_endpoint格式正确,例如https://api.sheety.co/xxx/xxx/workouts,末尾无多余斜杠,且表名(代码中为workout)与Sheety后台的表名称完全匹配(大小写敏感)。 - 核对请求数据结构:
确保sheet_inputs中的键名(date、time等)与Google Sheet的列名完全一致,Sheety对大小写敏感,需严格匹配。 - 添加异常处理逻辑:
修改代码捕获请求异常,便于定位问题:for exercise in result["exercises"]: sheet_inputs = { "workout": { "date": today_date, "time": now_time, "exercise": exercise["name"].title(), "duration": exercise["duration_min"], "calories": exercise["nf_calories"] } } try: sheet_response = requests.post(sheet_endpoint, json=sheet_inputs) sheet_response.raise_for_status() print(sheet_response.text) except requests.exceptions.HTTPError as e: print(f"请求错误详情: {e}") print(f"响应内容: {sheet_response.text}") - 切换至新版Sheety API:
若使用旧版Sheety服务,可能存在兼容性问题,建议切换到新版API,确保端点为官方最新地址。
内容的提问来源于stack exchange,提问作者Kanan Ismayilov
相关产品推荐
相关产品推荐

