当前位置: 首页 > news >正文

飞书 API 2-4:如何使用 API 将数据写入数据表

一、引入

上一篇创建好数据表之后,接下来就是写入数据和对数据的处理。

本文主要探讨数据的插入、更新和删除操作。所有的操作都是基于上一篇(飞书 API 2-4)创建的数据表进行操作。上面最终的数据表只有 2 个字段:序号和邮箱。
序号是多维表自动填充的自增数字,所以我们处理的时候不需要处理该字段,只需要处理邮箱即可。

二、数据操作

2.1 插入数据

2.1.1 插入单条记录

💡API 文档:新增记录
插入数据也需要指定“app_token”和“table_id”,除了这两个必要参数只要,还需要提供带有字段数据的请求体。比如我要插入张三的邮箱,示例如下:

{"fields": {"邮箱": "zhangsan@qq.com"}
}

在 API 调试台选择新增记录 API 输入“app_token”、“table_id”和请求体调试一下,从响应体可以看到插入数据成功(code=0),还返回了数据的“record_id”(用于更新数据记录):
image.png

查看多维表,可以看到多了一条记录,记录张三的邮箱信息。
image.png

2.1.2 插入多条记录

如果我要插入多条数据呢?该怎么办?飞书官方提供了插入多条记录的接口。
💡API 文档:新增多条记录。
插入多条记录的数据结构相比单条记录多了一层“records”,即:{“records”:[<记录1>,<记录2>]}。
举个例子,我要新增李四、王五的邮箱,请求体示例如下:

{"records": [{"fields": {"邮箱": "lisi@qq.dom"}},{"fields": {"邮箱": "wangwu@qq.dom"}}]
}

在 API 调试台选择新增记录 API 输入“app_token”、“table_id”和请求体进行调试,结果如下,成功插入了 2 条记录。
image.png

查看多维表,可以看到多了2条记录,分别记录李四、王五的邮箱信息。
image.png

2.2 更新数据

💡API 文档:更新记录、更新多条记录
更新数据同样也有 2 个 API,一个更新单条记录,一个更新多条记录。
分两个案例来展开:

  • 【案例1】将第一条记录张三的邮箱改为赵六的邮箱;
  • 【案例2】将第二、三的邮箱后缀的 dom 纠正为 com。

“app_token”和“table_id”同插入数据,下面主要展开其他的参数和请求体。

2.2.1 更新单条记录

【案例1】使用更新单条记录来实现,该接口需要额外传递一个“record_id”参数和带更新后数据的请求体。

  • 前面新增张三记录的时候,从响应体可以看到“record_id”为“recugpFE98VUrz”。
  • 请求体参考如下,结构和插入单条数据一样。
{"fields": {"邮箱": "zhaoliu@qq.com"}
}

查看调试结果(如下),执行成功。
image.png

查看多维表记录,已将“zhangsan@qq.com”改为“zhaoliu@qq.com”。
image.png

2.2.2 更新多条记录

【案例2】使用更新多条记录的接口来实现。
接口的结构和新增记录的结构类似,比更新单条记录多了一层“records”,不同点在于,更新记录需要知道“record_id”,所以在和“fields”同级的字典,多了一个“record_id”的键值对。
基本结构:{“records”:[<记录1>,<记录2>]}(和新增记录类型),再下一层:{“records”:[{<record_id键值对>,<fields键值对>},{<record_id键值对>,<fields键值对>}]}。
另外,相比更新单条记录,更新多条记录,不用额外传递“record_id”参数,直接通过请求体传递该值。

{"records": [{"record_id": "recugpJxfd7jpK","fields": {"邮箱": "lisi@qq.com"}},{"record_id": "recugpJxfdexmw","fields": {"邮箱": "wangwu@qq.com"}}]
}

调试结果如下,执行成功。
image.png

查看多维表记录,已将“dom”改为“com”。
image.png

其实无论是单条记录还是多条记录的更新,都可以使用多条记录来实现。

2.3 删除数据

💡API 文档:删除记录、删除多条记录
删除数据同样也有 2 个 API,一个删除单条记录,一个删除多条记录。相对更新数据来说,删除数据就简单了。
只需要传递“record_id”即可。
删除单条记录,传递“record_id”参数,如删除数据表的第一条记录,如下图,传递三个参数发起调试即可删除序号为 1 的记录。
image.png

删除多条记录,在请求体传递“record_id”的值,放在列表即可,不需要使用键值对。如删除第2、3条记录,将它们的“record_id”放到列表中,如下:

{"records": ["recugpJxfd7jpK","recugpJxfdexmw"]
}

然后到 API 调试台发起调试,如下图,调试成功之后,便把序号为 2 和 3 的记录删除。
image.png

2.4 不同字段类型的数据示例

从上文,其实可以发现,飞书的数据的插入和更新,都是基于字段名称的,通过字段名称对字段的值进行插入和更新。
支持通过 API 写入数据的字段类型如下:

  • “type”类型支持:1、2、3、4、5、7、11、13、15、17、18、21、22、23。
  • “ui_type”类型支持:Text、Barcode、Email、Number、Progress、Currency、Rating、SingleSelect、MultiSelect、DateTime、Checkbox、User、GroupChat、Phone、Url、Attachment、SingleLink、DuplexLink、Location。

换个说法,不支持以下 4 种字段类型通过 API 创建:查找引用、公式、流程、创建时间、最后更新时间、创建人、修改人、自动编号、按钮。除了流程和按钮,其他的都有一个特征,就是会自动更新,配置好之后不需要人工维护。

不同的字段类型,要求传递的数据格式有所差异。以下是使用新增多条记录的 API 的请求体的参考示例:

{"records": [{"fields": {"多行文本": "文本","条码": "978-7-111-48565-0","email": "lisi@qq.com","数字": 100,"货币": 3,"评分": 3,"进度": 0.25,"单选": "选项2","多选": ["选项1","选项4"],"日期": 1677206443000,"复选框": true,"人员": [{"id": "ou_4007a8a82cc6e0874524edda12ce94b1"}],"群组": [{"id": "oc_4db36e6b4ef56960cae2544ec9ae519c"}],"电话号码": "13026162666","超链接": {"text": "飞书多维表格官网","link": "https://www.feishu.cn/product/base"},"附件": [{"file_token": "DRiFbwaKsoZaLax4WKZbEGCccoe"},{"file_token": "BZk3bL1Enoy4pzxaPL9bNeKqcLe"}],"单向关联": ["recugudw7J76ql"],"双向关联": ["recugudw7J76ql","recugudugm9af0"],"地理位置": "116.397755,39.903179"}}]
}

根据数据结构和类型可以分为六类:

  • 字符串:多行文本、条码、单选、电话号码、地理位置,其中,地理位置需要经纬度
  • 数字:数字、进度、货币、评分、日期,其中,日期是一个时间戳
  • 布尔值:复选框
  • 字典:超链接,需要链接名和链接
  • 列表:多选、单向关联、双向关联,其中,单向关联和双向关联必须是其他数据表的“record_id”
  • 列表嵌套字典:人员、群组、附件,其中,人员需要传递用户ID,群组需要传递群组ID,附件需要文件上传到飞书多维表之后的文件 token。
    • 需要特别注意的时,写入群组ID必须有相关的权限,比如说在群体添加应用机器人,否则会报错:“An invalid or unauthorized ‘GroupChat’ id oc_xxx can’t be provided. ”。

相对于读取而言,写入的内容比较难以统一代码,因为读取的源是飞书多维表,数据格式是固定的,但是写入的源数据格式是未知的,比如同样是字符串,地理位置写入必须是一个通过英文逗号分隔的经纬度,才能最终识别为具体的位置,但是数据的来源是不确定的,可能是一个地名。
所以最好的情况是在读取数据源之后,直接进行处理,将源数据处理为和飞书多维表要求的数据结构一致的数据,直接写入多维表。

在实践的过程中,用的比较多的通常是:文本、单选、数字、日期等类型,遇到比较多的处理通常是将数据源的日期转为毫秒的时间戳,然后插入数据。

三、小结

本文探讨了如何通过 API 操作多维表数据的新增、更新和删除:

  • 新增记录:需要“app_token”、“table_id”和字段及字段值;
  • 更新记录:需要“app_token”、“table_id”、“record_id”和字段及新的字段值;
  • 删除记录:需要“app_token”、“table_id”和“record_id”。

同时梳理了 28 种字段类型是否支持 API 写入及支持写入的字段类型的相关数据结构:

序号typeui_type中文描述API 支持数据结构示例
11Text多行文本支持“文本”
21Barcode条码支持“978-7-111-48565-0”
31Email邮箱支持“lisi@qq.com”
42Number数字支持100
52Progress进度支持3
62Currency货币支持3
72Rating评分支持0.25
83SingleSelect单选支持“选项1”
94MultiSelect多选支持[“选项1”,“选项2”]
105DateTime日期支持1704038400000
117Checkbox复选框支持true/false
1211User人员支持[{“id”:“ou_xxx”}]
1313Phone电话号码支持“135xxx”
1415Url超链接支持{“text”:“名称”,“link”:“https:xxx”}
1517Attachment附件支持[{“file_token”:“xxx”}]
1618SingleLink单向关联支持[“recuxxx”,“recuxxx”]
1719Lookup查找引用不支持
1820Formula公式不支持
1921DuplexLink双向关联支持[“recuxxx”,“recuxxx”]
2022Location地理位置支持“116.39775,39.903179”
2123GroupChat群组支持[{“id”:“oc_xxx”}]
2224Stage流程不支持
231001CreatedTime创建时间不支持
241002ModifiedTime最后更新时间不支持
251003CreatedUser创建人不支持
261004ModifiedUser修改人不支持
271005AutoNumber自动编号不支持
283001Button按钮不支持

附录:代码小结

# 由于单条记录也可以通过多条记录的接口实现,本代码仅展示多条记录的接口。import requests
import jsondef insert_records(access_token,app_token,table_id,request_body):url = f"https://open.feishu.cn/open-apis/bitable/v1/apps/{app_token}/tables/{table_id}/records/batch_create"payload = json.dumps(request_body)headers = {'Content-Type': 'application/json','Authorization': f'Bearer {access_token}'}response = requests.request("POST", url, headers=headers, data=payload)code = response.json()['code']if code == 0:len_record = len(request_body["records"])print(f"成功插入 {len_record} 数据。关联函数:insert_records。")else:msg = response.json().get("msg")raise f"插入数据失败,失败信息:{msg}。关联函数:insert_records。"def update_records(access_token,app_token,table_id,request_body):url = f"https://open.feishu.cn/open-apis/bitable/v1/apps/{app_token}/tables/{table_id}/records/batch_update"payload = json.dumps(request_body)headers = {'Content-Type': 'application/json','Authorization': f'Bearer {access_token}'}response = requests.request("POST", url, headers=headers, data=payload)code = response.json()['code']if code == 0:len_record = len(request_body["records"])print(f"成功更新 {len_record} 数据。关联函数:update_records。")else:msg = response.json().get("msg")raise f"更新数据失败,失败信息:{msg}。关联函数:update_records。"def delete_records(access_token,app_token,table_id,request_body):url = f"https://open.feishu.cn/open-apis/bitable/v1/apps/{app_token}/tables/{table_id}/records/batch_delete"payload = json.dumps(request_body)headers = {'Content-Type': 'application/json','Authorization': f'Bearer {access_token}'}response = requests.request("POST", url, headers=headers, data=payload)code = response.json()['code']if code == 0:len_record = len(request_body["records"])print(f"成功删除 {len_record} 数据。关联函数:delete_records。")else:msg = response.json().get("msg")raise f"更新数据失败,失败信息:{msg}。关联函数:delete_records。"def get_tenant_access_token(app_id, app_secret):url = "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal"payload = json.dumps({"app_id": app_id,"app_secret": app_secret})headers = {'Content-Type': 'application/json'}response = requests.request("POST", url, headers=headers, data=payload)tenant_access_token = response.json()['tenant_access_token']print(f'成功获取tenant_access_token:{tenant_access_token}。关联函数:get_table_params。')return tenant_access_tokendef main(request_body):app_id = 'your_app_id'app_secret = 'your_app_secret'app_token = 'your_app_token'table_id = 'your_table_id'access_token = get_tenant_access_token(app_id, app_secret)# 插入数据request_body = {"records": [{"fields": {"邮箱": "lisi@qq.dom"}},{"fields": {"邮箱": "wangwu@qq.dom"}}]}insert_records(access_token,app_token,table_id,request_body)# 更新数据request_body = {"records": [{"fields": {"邮箱": "lisi@qq.com"},"record_id": "your_record_id"},{"fields": {"邮箱": "wangwu@qq.com"},"record_id": "your_record_id"}]}update_records(access_token,app_token,table_id,request_body)# 删除数据request_body = {"records": ["your_record_id","your_record_id"]}delete_records(access_token,app_token,table_id,request_body)if __name__ == '__main__':    main()

相关文章:

飞书 API 2-4:如何使用 API 将数据写入数据表

一、引入 上一篇创建好数据表之后&#xff0c;接下来就是写入数据和对数据的处理。 本文主要探讨数据的插入、更新和删除操作。所有的操作都是基于上一篇&#xff08;飞书 API 2-4&#xff09;创建的数据表进行操作。上面最终的数据表只有 2 个字段&#xff1a;序号和邮箱。序…...

系统设计题-日活月活统计

一、题目描述 根据访问日志统计接口的日活和月活。日志格式为 yyyy-mm-dd|clientIP|url|result 其中yyyy-mm-dd代表年月日&#xff0c;一个日志文件中时间跨度保证都在同一个月内&#xff0c;但不保证每行是按照日期顺序。 clientIP为合法的点分十进制ipv4地址(1.1.1.1和1.01.…...

在CentOS7云服务器下搭建MySQL网络服务详细教程

目录 0.说明 1.卸载不要的环境 1.1查看当前环境存在的服务mysql或者mariadb 1.2卸载不要的环境 1.2.1先关闭相关的服务 1.2.2查询曾经下载的安装包 1.2.3卸载安装包 1.2.4检查是否卸载干净 2.配置MySQLyum源 2.1获取mysql关外yum源 2.2 查看当前系统结合系统配置yum…...

【数据结构与算法】快速排序霍尔版

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注 ​...

无人机5公里WiFi低延迟图传模组,抗干扰、长距离、低延迟,飞睿智能无线通信新标杆

在科技日新月异的今天&#xff0c;我们见证了无数通信技术的飞跃。从开始的电报、电话&#xff0c;到如今的4G、5G网络&#xff0c;再到WiFi的广泛应用&#xff0c;每一次技术的革新都极大地改变了人们的生活方式。飞睿智能5公里WiFi低延迟图传模组&#xff0c;它以其独特的优势…...

Kappa架构

1.Kappa架构介绍 Kappa架构由Jay Kreps提出&#xff0c;不同于Lambda同时计算和批计算并合并视图&#xff0c;Kappa只会通过流计算一条的数据链路计算并产生视图。Kappa同样采用了重新处理事件的原则&#xff0c;对于历史数据分析类的需求&#xff0c;Kappa要求数据的长期存储能…...

护网在即,助力安服仔漏洞扫描~

整合了个漏扫系统&#xff0c;安服仔必备~ 使用场景 网前布防&#xff0c;漏洞扫描&#xff0c;资产梳理 使用方法&#xff1a; 启动虚拟机后运行命令&#xff1a; ./StartSystemScript.sh 输入密码attack 启动完成后浏览器打开网站&#xff1a; http://IP:5000 相关账户…...

3C电子制造行业MES系统,提高企业生产效率

随着科技的不断进步&#xff0c;3C电子制造行业正迎来传统工厂向数字化工厂转型的阶段。在这场变革中&#xff0c;MES系统发挥着重要的作用&#xff0c;成为了企业变革的“智慧大脑”&#xff0c;引领着生产流程的优化和升级。 那么&#xff0c;MES系统究竟有哪些功能&#xf…...

C++ 多态和虚函数

参考C&#xff1a;多态 详解_c多态-CSDN博客 C多态——虚函数_c的a* a new b()是什么意思-CSDN博客 一.多态的概念 多态是在不同继承关系的类对象&#xff0c;去调用同一函数&#xff0c;产生了不同的行为。比如 Student 继承了 Person。 Person 对象买票全价&#xff0c;…...

七月记录上半

7.5 运行mysql脚本 mysql -u root -p 数据库名 < 脚本名 7.6 使用screen在服务器后台长期运行一个程序&#xff1a; screen -S 窗口名&#xff1a;创建窗口 执行程序脚本 ctrlad&#xff1a;退出窗口 screen -ls &#xff1a;查看所有窗口 screen -r 窗口号 &#…...

Wing FTP Server

文章目录 1.Wing FTP Server简介1.1主要特点1.2使用教程 2.高级用法2.1Lua脚本,案例1 1.Wing FTP Server简介 Wing FTP Server&#xff0c;是一个专业的跨平台FTP服务器端&#xff0c;它拥有不错的速度、可靠性和一个友好的配置界面。它除了能提供FTP的基本服务功能以外&#…...

【Linux进阶】文件系统6——理解文件操作

目录 1.文件的读取 1.1.目录 1.2.文件 1.3.目录树读取 1.4.文件系统大小与磁盘读取性能 2.增添文件 2.1.数据的不一致&#xff08;Inconsistent&#xff09;状态 2.2.日志式文件系统&#xff08;Journaling filesystem&#xff09; 3.Linux文件系统的运行 4、文件的删…...

Python编译器的选择

了解如何使用一个集成开发环境&#xff08;IDE&#xff09;对于 Python 编程是非常重要的。IDE 提供了代码编辑、运行、调试、版本控制等多种功能&#xff0c;可以极大地提升开发效率。以下是一些流行的 Python IDE 和代码编辑器的介绍&#xff0c;以及如何开始使用它们&#x…...

Java | Leetcode Java题解之第217题存在重复元素

题目&#xff1a; 题解&#xff1a; class Solution {public boolean containsDuplicate(int[] nums) {Set<Integer> set new HashSet<Integer>();for (int x : nums) {if (!set.add(x)) {return true;}}return false;} }...

python基础语法 006 内置函数

1 内置函数 材料参考&#xff1a;内置函数 — Python 3.12.4 文档 Python 解释器内置了很多函数和类型&#xff0c;任何时候都能直接使用 内置函数有无返回值&#xff0c;是python自己定义&#xff0c;不能以偏概全说都有返回值 以下为较为常用的内置函数&#xff0c;欢迎补充…...

ABAP中BAPI_CURRENCY_CONV_TO_EXTERNAL函数详细的使用方法

在ABAP&#xff08;SAP的应用程序开发语言&#xff09;中&#xff0c;BAPI_CURRENCY_CONV_TO_EXTERNAL函数用于将SAP系统内部存储的货币金额转换为外部显示的格式。这个函数在处理财务报告、用户界面显示或与其他系统集成时非常有用。以下是该函数的详细使用方法&#xff1a; …...

Mac本地部署大模型-单机运行

前些天在一台linux服务器&#xff08;8核&#xff0c;32G内存&#xff0c;无显卡&#xff09;使用ollama运行阿里通义千问Qwen1.5和Qwen2.0低参数版本大模型&#xff0c;Qwen2-1.5B可以运行&#xff0c;但是推理速度有些慢。 一直还没有尝试在macbook上运行测试大模型&#xf…...

Qt:8.QWidget属性介绍(focuspolicy属性-控件焦点、stylesheet属性-为控件设置样式)

目录 一、focuspolicy属性-控件焦点&#xff1a; 1.1focuspolicy属性介绍&#xff1a; 1.2设置焦点策略——setFocusPolicy()&#xff1a; 1.3获取控件的焦点策略——focusPolicy()&#xff1a; 二、stylesheet属性——为控件设置样式&#xff1a; 2.1 stylesheet属性介绍…...

R可视化数据必要格式——长格式

一、引言 我们在对数据进行可视化时遇到最头疼、最常见的问题是什么&#xff1f;数据问题。 因为我们往往不会从零自己编程进行可视化&#xff0c;往往是现有模板或积累&#xff0c;而正确的数据格式对应正确的图形包要求&#xff0c;一定会正确出图&#xff0c;所以只有一个问…...

Android计算器界面的设计——表格布局TableLayout实操

目录 任务目标任务分析任务实施 任务目标 使用TextView、Button等实现一个计算器界面&#xff0c;界面如图1所示。 图1 计算器界面效果图 任务分析 界面整体使用表格布局&#xff0c;第一行使用一个TextView控件&#xff0c;横跨4列&#xff0c;中间4行4列&#xff0c;最后一…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...