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

news2024/10/6 12:19:37

一、引入

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

本文主要探讨数据的插入、更新和删除操作。所有的操作都是基于上一篇(飞书 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 json

def 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_token


def 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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1903212.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(完整音频)DockerHub、OpenAI、GitCode,脱钩时代,我们该如何自处?

本期主播 朱峰&#xff1a;「津津乐道播客网络」创始人&#xff0c;产品及技术专家。&#xff08;微博&#xff1a;zhufengme&#xff09;高春辉&#xff1a;「科技乱炖」主播。“中国互联网站长第一人”&#xff0c;科技、互联网领域的连续创业者。&#xff08;微博&#xff1…

SCI一区TOP|准随机分形搜索算法(QRFS)原理及实现【免费获取Matlab代码】

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年&#xff0c;LA Beltran受到分形几何、低差异序列启发&#xff0c;提出了准随机分形搜索算法&#xff08;Quasi-random Fractal Search, QRFS&#xff09;。 2.算法原理 2.1算法思…

内容营销专家刘鑫炜:网站排名需考虑哪些SEO优化技巧?

网站排名的SEO优化技巧包括&#xff1a; 1. 关键词研究&#xff1a;了解目标受众的搜索关键词&#xff0c;将这些关键词合理地应用在网站的标题、描述、正文和标签中&#xff0c;有助于提高网站排名。 2. 内容优化&#xff1a;创建高质量、有价值的内容&#xff0c;可以吸引搜…

【leetcode52-55图论、56-63回溯】

图论 回溯【56-63】 46.全排列 class Solution:def permute(self, nums):result []self.backtracking(nums, [], [False] * len(nums), result)return resultdef backtracking(self, nums, path, used, result):if len(path) len(nums):result.append(path[:])returnfor i …

【HBZ】高性能zeroCopy零拷贝与普通IO差距与原理

简介 随着IO不断地发展&#xff0c;无论哪种拷贝方式&#xff0c;DMA从磁盘拷贝数据到内核缓冲区&#xff0c;都会拷贝多一些数据, 不会只拷贝用户态的指定size的数据&#xff0c;而是会将目标数据的临近数据也都拷贝到内核缓冲区&#xff0c;以便下次IO操作可以直接从内核缓冲…

【python】python客户信息审计风险决策树算法分类预测(源码+数据集+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

unity3d:Shader知识点,矩阵,函数,坐标转换,Tags,半透明,阴影,深度,亮度,优化

基本结构 Shader "MyShaderName" {Properties {// 属性}SubShader {// 针对显卡A的SubShaderPass {// 设置渲染状态和标签Tags { "LightMode""ForwardBase" }// 开始Cg代码片段CGPROGRAM// 该代码片段的编译指令&#xff0c;例如&#xff1a;#p…

浪潮信息元脑服务器支持英特尔®至强®6能效核处理器 展现强劲性能

如今&#xff0c;服务器作为数字经济的核心基础设施&#xff0c;正面临着前所未有的挑战和机遇。作为服务器领域的领军企业&#xff0c;浪潮信息始终站在行业前沿&#xff0c;不断推陈出新&#xff0c;以满足客户日益增长的需求。近日&#xff0c;浪潮信息再次展现技术实力&…

Java学习十四—Java8特性之Lambda表达式

一、简介 Java 8 引入了 Lambda 表达式&#xff0c;它是一种更简洁、更便于使用的函数式编程特性。Lambda 表达式允许将函数作为方法的参数&#xff08;函数式接口的实例&#xff09;传递给某个方法&#xff0c;或者将代码像数据一样进行传递。 ‍ lambda是一个匿名函数&#…

Kubernetes分享

幂等性(Idempotency) 介绍 简单来说&#xff0c;幂等性幂等性(Idempotency)是计算机科学中的一个重要概念&#xff0c;特别是在分布式系统和网络应用中。指的是某个操作可以重复执行多次&#xff0c;但其结果是相同的&#xff0c;不会因为多次执行而改变系统的状态。 https://…

解决后端限制导致前端配置跨域仍请求失败报504的问题

文章目录 问题一、通过配置跨域方式二、直接真实接口请求三、解决方式四、后端这样做的原因 总结 问题 前端项目设置跨域proxy处理&#xff0c;接口请求不会报跨域&#xff0c;但是接口请求报了504&#xff0c;这种情况如何处理呢&#xff0c;后端又为何要这么做&#xff0c;下…

2007-2022年中国各企业数字化转型与供应链效率

企业数字化转型与供应链效率是现代企业管理和发展的两个关键方面。以下是对中国各企业数字化转型与供应链效率数据的介绍&#xff1a; 数据简介 企业数字化转型&#xff1a;指企业通过采用数字技术与创新方法&#xff0c;改造业务流程、组织结构和产品服务&#xff0c;以提升…

U盘非安全拔出后的格式化危机与数据拯救策略

在数字化时代&#xff0c;U盘作为便捷的数据携带工具&#xff0c;其重要性不言而喻。然而&#xff0c;许多用户在日常使用中往往忽视了安全退出的重要性&#xff0c;直接拔出U盘后再插入时可能会遭遇“需要格式化”的提示&#xff0c;这一状况不仅令人措手不及&#xff0c;更可…

STM32+ESP8266(ESP32)+MQTT+阿里云物联网平台

1、阿里云物联网平台 - 阿里云物联网平台配置 产品-设备-编辑物模型-设备端开发-查看上报数据 在产品上添加物模型&#xff0c;然后设备是继承自产品的&#xff0c;因此也具有物模型 添加产品、添加设备、产品上添加物模型 - 使用IOT Studio 绘制界面显示温度、湿度、灯开…

pdf怎么转换成图片格式文件,pdf文档怎么转换成图片格式

在数字化时代&#xff0c;pdf文件转换成图片格式是一种常见的操作&#xff0c;无论是在工作还是日常生活中&#xff0c;我们总会遇到需要将pdf文件转换为图片的需求。这可能是因为图片格式更易于分享、展示或编辑。那么&#xff0c;如何高效地将pdf转换成图片呢&#xff1f;本文…

CSRF靶场通关合集

目录 前言 CSRF漏洞总结 1.PiKachu靶场 1.1CSRF(get) 1.2 CSRF(post)请求 1.3 CSRF Token 2.DVWA靶场 难度低 难度中 难度高 前言 最近系统的将从web渗透到内网渗透的知识点做一个回顾,同时结合一些实战的案例来演示,下面是对刚开始学习时对靶场的一个总结. CSRF漏洞…

快速搭建发卡独立站(完全免费)

本文介绍如何使用开源项目&#xff0c;零成本&#xff0c;无需服务器的方式搭建一套自己的数字商品/发卡独立站&#xff0c;不需要任何开发能力&#xff0c;即便是小白用户也能搭建。 感兴趣可直接查看开源项目地址&#x1f449; https://github.com/iDataRiver/theme-basic …

sqlite 数据库 介绍

文章目录 前言一、什么是 SQLite &#xff1f;二、语法三、SQLite 场景四、磁盘文件 前言 下载 目前已经出到了&#xff0c; Version 3.46.0 SQLite&#xff0c;是一款轻型的数据库&#xff0c;是遵守ACID的关系型数据库管理系统&#xff0c;它包含在一个相对小的C库中。它是…

Node 中基于 Koa 框架的 Web 服务搭建实战

前言 在《Node之Web服务 - 掘金 (juejin.cn)》一文中,我们使用 HTTP 模块构建了后端接口,从而实现了后端服务的开发。可以对此进行进一步优化 http模块代码回顾 const http require("http");const server http.createServer((req, res) > {if (reqUrl.pathna…

Simulated Annealing

模拟退火最大值算法&#xff1a; 初始化起始解 x 0 x_0 x0​ 、温度 t 0 t_0 t0​ 以及迭代次数 steps&#xff0c;计算初始值 y 0 y_0 y0​扰动产生新解 x 1 x_1 x1​, 计算对应函数值 y 1 y_1 y1​依据 Δ y y 1 − y 0 \Delta y y_1 - y_0 Δyy1​−y0​ 决策是否接…