本文探讨如何通过飞书的 API 来创建多维表。
通过 API 创建的多维表,会把文件夹放到共享空间,如果不想将文件夹放到共享空间,建议手动创建。
服务端 API,依次查找云文档>多维表格>多维表格>创建多维表格,或者直接点击:创建多维表API。
如果是在根目录,即我的空间创建多维表,传递多维表的参数名即可;如果是要在指定的文件下创建多维表,则需要多传递一个文件夹的 token 参数,示例如下:
{
"name":"一篇新的多维表格",
"folder_token": "fldbco*****CIMltVc"
}
如何获取文件夹的 token?参考下图:
Tips:如果是使用上一篇通过 API 创建的文件夹,则可直接使用上一篇创建完文件夹返回的 token 传递给 folder_token 参数。
这里我已经创建好了,直接使用即可。
飞书 API 调试台测试新建多维表。
我的文件夹 token 为:AYYvfPya0l60fPd9CvTcFEuFnbc,填入参数,名字就叫做飞书数据类型测试表。
调试结果是报错了,查看说明,没有云空间节点的权限。
在对应的文件查看是否有类似文档授权的方式,给应用授权,结果没找到。
查看关于云文档的权限的常见问题,找到了一个答案:需要应用启用机器人能力,然后在飞书客户端创建群组,将应用添加为群机器人。再在我的空间中找到对应的文件夹,将文件夹分享给刚刚新建的群组。
需要应用启用机器人能力。打开飞书软件,创建新的群组,将应用添加为群机器人。在飞书云文档,我的空间中找到对应的文件夹,将文件夹分享给刚刚新建的群组。
换句话说,文件夹给应用授权需要通过分享给群组,然后在群组里添加应用的机器人,怎么添加呢,需要先在应用后台开启应用的机器人能力。
具体操作见下文。
应用中心找到对应的应用,我的应用叫:飞书多维表数据传输,点击进入应用后台。
点击应用能力模块的添加应用能力>按能力添加>点击机器人下面的添加按钮。
添加好机器人之后会新增一个机器人的配置项,如下图标识1。机器人创建好之后,需要新建版本提交申请,如下图标识2,填写版本号、更新说明和申请理由便可提交申请。(注:下图是版本发布成功后的界面)。
获取群信息 API 文档,如下图,在右边的调试台,点击选择群组,可以复制 chat_id。
获取到 chat_id,可以保存下来之后反复使用。
调用添加协作者权限 API,为文件夹添加群组协作者
示例代码如下:
import requests
import json
url = "https://open.feishu.cn/open-apis/drive/v1/permissions/AYYvfPya0l60fPd9CvTcFEuFnbc/members?need_notification=true&type=folder"
payload = json.dumps({
"member_id": "oc_4db36e6b4ef56960cae2544ec9ae519c",
"member_type": "openchat",
"perm": "full_access",
"type": "chat"
})
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer t-g1046g9NIJNUNPQY2XLT2V2Q5K5XPMIJTBWKRAQL'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
结合前面新建多维表的代码,将两个 API 的请求代码封装成一个函数,传递关键参数,然后返回需要值。最终参考代码如下:
import requests
import json
def add_folder_permission(access_token,folder_token,chatid,permission_type='full_access'):
"""
功能:给群组开文件夹的协作权限
permission_type:view(阅读)、edit(编辑)、full_access(管理)
"""
url = f"https://open.feishu.cn/open-apis/drive/v1/permissions/{folder_token}/members?need_notification=true&type=folder"
payload = json.dumps({
"member_id": chatid,
"member_type": "openchat",
"perm": "full_access",
"type": "chat"
})
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:
print(f"成功为 {chatid} 开通权限。关联函数:add_folder_permission。")
else:
msg = response.json().get("msg")
raise f"创建文件夹失败,失败信息:{msg}。关联函数:add_folder_permission。"
def cre_bitable(access_token,bitable_name,folder_token=''):
url = "https://open.feishu.cn/open-apis/bitable/v1/apps"
payload = json.dumps({
"folder_token": folder_token,
"name": bitable_name
})
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:
app = response.json().get('data').get('app')
bitable_app_token = app.get('app_token')
bitable_table_id = app.get('default_table_id')
print(f"成功创建多维表,多维表 app_token:{bitable_app_token},默认数据表ID:{bitable_table_id}。关联函数:add_folder_permission。")
return bitable_app_token,bitable_table_id
else:
msg = response.json().get("msg")
raise f"创建文件夹失败,失败信息:{msg}。关联函数:add_folder_permission。"
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():
app_id = 'your_app_id'
app_secret = 'your_app_secret'
access_token = get_tenant_access_token(app_id, app_secret)
chatid = 'your_chat_id'
add_folder_permission(access_token,new_folder_token,chatid,permission_type='full_access')
bitable_name = "多维表名称"
folder_token = "your_folder_token"
bitable_app_token,bitable_table_id = cre_bitable(access_token,bitable_name,folder_token)
if __name__ == '__main__':
main()