python_更新飞书多维表格的单项关联字段

python_更新飞书多维表格的单项关联字段

python 复制代码
# 使用此指令前,请确保安装必要的Python库,例如使用以下命令安装:
# pip install requests

import requests
import json

from typing import *
try:
    from xbot.app.logging import trace as print
except:
    from xbot import print


def update_bitable_link_field_fixed(app_id, app_secret, app_token, table_id, record_id, field_name, linked_record_id):
    """
    title: 更新多维表格单项关联字段
    description: 自动获取 Token 并通过 PUT 方法更新多维表格 %app_token% 中指定记录 %record_id% 的关联字段 %field_name%。
    inputs:
        - app_id (str): 飞书自建应用的 App ID,eg: "cli_a5db1166713a900c"
        - app_secret (str): 飞书自建应用的 App Secret,eg: "Imdfwys4jb2VanubbZpoqd1elIhnItKy"
        - app_token (str): 多维表格的唯一标识,eg: "GZlfwzHIDijkLNklIGNcxNo3nbd"
        - table_id (str): 数据表的唯一标识,eg: "tblAO3koPJNcP9z0"
        - record_id (str): 待更新的记录 ID,eg: "rec27qGrNWq5pB"
        - field_name (str): 关联字段的名称(注意:必须是关联类型,不能是查阅类型),eg: "客户名称"
        - linked_record_id (str): 关联表中的目标记录 ID,eg: "recbcdefg123"
    outputs:
        - result (dict): API 返回的响应结果,eg: {"code": 0, "msg": "success", "data": {...}}
    """

    def _get_tenant_access_token(aid, asecret):
        """获取飞书租户访问凭证"""
        url = "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal"
        payload = {"app_id": aid.strip(), "app_secret": asecret.strip()}
        try:
            response = requests.post(url, json=payload)
            response.raise_for_status()
            data = response.json()
            if data.get("code") != 0:
                raise Exception(f"获取 Token 失败: {data.get('msg')}")
            return data.get("tenant_access_token")
        except Exception as e:
            raise Exception(f"身份验证失败,请检查 AppID 和 Secret: {str(e)}")

    def _update_record_put(token, app_tk, tab_id, rec_id, f_name, l_rec_id):
        """使用 PUT 方法更新记录"""
        # 去除参数两端的空格,防止 URL 拼接错误导致 404
        app_tk, tab_id, rec_id = app_tk.strip(), tab_id.strip(), rec_id.strip()
        
        url = f"https://open.feishu.cn/open-apis/bitable/v1/apps/{app_tk}/tables/{tab_id}/records/{rec_id}"
        
        headers = {
            "Authorization": f"Bearer {token}",
            "Content-Type": "application/json; charset=utf-8"
        }
        
        # 关联字段必须是字符串数组格式
        # 如果 linked_record_id 为空,则传空数组 [] 以清空关联
        val_list = [l_rec_id.strip()] if l_rec_id and str(l_rec_id).strip() else []
        
        payload = {
            "fields": {
                f_name: val_list
            }
        }
        
        try:
            # 官方文档指定使用 PUT 方法
            response = requests.put(url, headers=headers, json=payload)
            
            if response.status_code == 404:
                raise Exception(f"飞书返回 404:请检查多维表格ID、数据表ID或记录ID是否正确。当前请求URL: {url}")
            
            response.raise_for_status()
            return response.json()
        except requests.exceptions.RequestException as e:
            err_msg = response.text if 'response' in locals() else str(e)
            raise Exception(f"请求飞书 API 失败: {err_msg}")

    # 1. 获取最新的 Token
    token = _get_tenant_access_token(app_id, app_secret)

    # 2. 执行更新操作
    result = _update_record_put(token, app_token, table_id, record_id, field_name, linked_record_id)
    
    if result.get("code") != 0:
        # 如果 code 为 1254405, 说明字段是只读的(如查阅字段)
        raise Exception(f"更新失败,飞书返回错误: {result.get('msg')} (错误码: {result.get('code')})")

    return result
相关推荐
啊吧怪不啊吧7 分钟前
LangChain之模型调用
python·langchain
溪语流沙8 分钟前
Django + Vue电商项目第001讲:开篇|注册登录加增删改查,那不是电商
redis·python·mysql·docker·typescript·django·vue
夜雪一千17 分钟前
如何使用BeautifulSoup库来提取HTML中的特定元素
python
努力努力再努力wz19 分钟前
【Redis进阶系列】:从主从复制到 Sentinel,一文建立故障检测、Leader 选举与 Failover 的完整心智模型
数据库·redis·缓存
IT毕设梦工厂24 分钟前
计算机毕业设计选题推荐:基于大数据的城市空气污染物浓度数据分析与可视化|毕业设计选题|计算机毕设|选题推荐|毕设指导|项目定制|源码|高质量项目
大数据·python·信息可视化·数据挖掘·数据分析·课程设计·数据可视化
达梦数据27 分钟前
DMDRS搭建部署简介与运行环境
数据库
Omics Pro29 分钟前
1个月2轮融资!长寿虚拟细胞
数据库·人工智能·算法·机器学习·自然语言处理
程序员阿黄36 分钟前
基于 Django 与 Vue 3 的智能实验室预约系统设计与实现
后端·python·mysql·django·vue·毕设
用户298698530141 小时前
Python 如何实现 Word 与 RTF 文档互转
后端·python·api
程序猿在线码字1 小时前
深度学习(一)
python·深度学习·神经网络·机器学习