影刀RPA 飞书多维表格自动化读写数据与自动同步实战作者林焱写在前面飞书多维表格Base是当下很多团队用来管理数据的核心工具——项目跟踪、销售线索、内容日历都在里面。影刀可以通过飞书开放平台API直接读写多维表格实现自动同步数据、批量更新记录、定时生成报告。本文聚焦多维表格搞清楚API调用的核心逻辑和三个实战场景。一、准备工作获取飞书API权限创建飞书应用打开飞书开放平台https://open.feishu.cn创建自建应用企业内部应用在权限管理中开启bitable:app— 读取多维表格拼多多店群自动化报活动上架bitable:app:readonly— 只读按需选发布应用并让管理员审批获取Access Tokenimportrequestsdefget_feishu_token(app_id,app_secret):urlhttps://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internalpayload{app_id:app_id,app_secret:app_secret}responserequests.post(url,jsonpayload)dataresponse.json()returndata.get(tenant_access_token)TOKENget_feishu_token(cli_xxxxxxxx,xxxxxxxxxxxxxxxx)HEADERS{Authorization:fBearer{TOKEN},Content-Type:application/json}二、多维表格基本操作读取数据表中的记录deflist_records(app_token,table_id,page_size100,filter_formulaNone): 获取多维表格中的记录 app_token: 多维表格的token从URL中获取 table_id: 数据表IDtblXXXXXX filter_formula: 筛选公式如 CurrentValue.[状态]进行中 urlfhttps://open.feishu.cn/open-apis/bitable/v1/apps/{app_token}/tables/{table_id}/recordsparams{page_size:page_size}iffilter_formula:params[filter]filter_formula all_records[]page_tokenNonewhileTrue:ifpage_token:params[page_token]page_token responserequests.get(url,headersHEADERS,paramsparams)dataresponse.json()ifdata.get(code)!0:raiseException(fAPI错误{data})itemsdata.get(data,{}).get(items,[])all_records.extend(items)# 检查是否有下一页has_moredata.get(data,{}).get(has_more,False)ifnothas_more:breakpage_tokendata.get(data,{}).get(page_token)returnall_records# 读取所有进行中的项目recordslist_records(app_tokenIlqXbtxxxxxxxxx,table_idtblxxxxxxxxx,filter_formulaCurrentValue.[状态]进行中)print(f共{len(records)}条记录)forrecinrecords[:3]:print(rec.get(fields))新增记录defcreate_records(app_token,table_id,records_data): 批量新增记录 records_data: 列表每项是一个字段字典 urlfhttps://open.feishu.cn/open-apis/bitable/v1/apps/{app_token}/tables/{table_id}/records/batch_create# 每次最多500条batch_size500created_count0foriinrange(0,len(records_data),batch_size):batchrecords_data[i:ibatch_size]payload{records:[{fields:record}forrecordinbatch]}responserequests.post(url,headersHEADERS,jsonpayload)dataresponse.json()ifdata.get(code)0:created_countlen(data.get(data,{}).get(records,[]))else:print(f新增失败{data})returncreated_count# 新增数据示例new_records[{项目名称:Q4营销活动,负责人:[ou_xxxxxxx],状态:待开始,截止日期:1735660800000},{项目名称:年度汇报,负责人:[ou_yyyyyyy],状态:进行中,截止日期:1736265600000},]countcreate_records(IlqXbtxxxxxxxxx,tblxxxxxxxxx,new_records)print(f成功新增{count}条记录)更新记录defupdate_record(app_token,table_id,record_id,fields):更新单条记录urlfhttps://open.feishu.cn/open-apis/bitable/v1/apps/{app_token}/tables/{table_id}/records/{record_id}payload{fields:fields}responserequests.put(url,headersHEADERS,jsonpayload)returnresponse.json()defbatch_update_records(app_token,table_id,updates): 批量更新 updates: [{record_id, fields}, ...] urlfhttps://open.feishu.cn/open-apis/bitable/v1/apps/{app_token}/tables/{table_id}/records/batch_updatepayload{records:[{record_id:u[record_id],fields:u[fields]}foruinupdates]}responserequests.post(url,headersHEADERS,jsonpayload)returnresponse.json()# 批量将过期项目标记为已超期importtime now_msint(time.time()*1000)updates[]forrecinrecords:fieldsrec.get(fields,{})deadlinefields.get(截止日期)statusfields.get(状态)ifdeadlineanddeadlinenow_msandstatus进行中:updates.append({record_id:rec[record_id],fields:{状态:已超期}})ifupdates:resultbatch_update_records(IlqXbtxxxxxxxxx,tblxxxxxxxxx,updates)print(f更新了{len(updates)}条超期记录)三、实战案例CRM数据自动同步到飞书多维表格场景销售团队用飞书多维表格管理客户每天从官网表单抓取新线索自动录入多维表格并更新已有线索的最新状态。importrequestsimportopenpyxlimporttime# 配置APP_TOKENIlqXbt表格tokenTABLE_IDtbl线索表IDdefget_existing_leads_map(app_token,table_id):获取已有线索建立手机号→record_id的映射recordslist_records(app_token,table_id)phone_to_id{}forrecinrecords:phonerec.get(fields,{}).get(联系电话)ifphone:phone_to_id[str(phone)]rec[record_id]returnphone_to_iddefsync_leads_from_excel(excel_path):从Excel读取新线索同步到飞书多维表格wbopenpyxl.load_workbook(excel_path)wswb.active# 获取已有数据existingget_existing_leads_map(APP_TOKEN,TABLE_ID)new_records[]update_records[]forrowinws.iter_rows(min_row2,values_onlyTrue):name,phone,company,source,created_atrowifnotphone:continuephone_strstr(int(phone))ifisinstance(phone,float)elsestr(phone)fields{姓名:name,联系电话:phone_str,公司:companyor,来源:sourceor官网,}ifphone_strinexisting:# 已存在更新update_records.append({record_id:existing[phone_str],fields:fields})else:# 新线索新增new_records.append(fields)# 执行ifnew_records:countcreate_records(APP_TOKEN,TABLE_ID,new_records)print(f新增{count}条线索)ifupdate_records:# 分批更新foriinrange(0,len(update_records),50):batchupdate_records[i:i50]resultbatch_update_records(APP_TOKEN,TABLE_ID,batch)time.sleep(0.5)print(f更新{len(update_records)}条线索)sync_leads_from_excel(新线索.xlsx)四、多维表格字段类型注意事项飞书多维表格的字段类型比普通表格复杂写入时要注意TEMU店群矩阵自动化运营核价报活动字段类型写入格式示例文本字符串value数字数字100.5日期毫秒时间戳1735660800000单选字符串选项A| 多选 | 字符串列表 |[选项A, 选项B]|| 人员 | open_id列表 |[ou_xxxxxxx]|| 链接 | 对象 |{text: 链接, link: https://...}|| 复选框 | 布尔 |True或False|日期时间戳转换importdatetimedefdatetime_to_ms(dt_str):将2024-01-15转为毫秒时间戳dtdatetime.datetime.strptime(dt_str,%Y-%m-%d)returnint(dt.timestamp()*1000)五、踩坑记录坑1Token有效期是2小时tenant_access_token有效期2小时长时间运行的流程需要定期刷新。建议封装一个自动续期的函数importtimeastime_module _tokenNone_token_expire0defget_valid_token(app_id,app_secret):global_token,_token_expireiftime_module.time()_token_expire-300:# 提前5分钟刷新_tokenget_feishu_token(app_id,app_secret)_token_expiretime_module.time()7200return_token坑2人员字段要用open_id多维表格人员字段接收的是open_id不是手机号或姓名。要先用飞书API根据手机号换取open_iddefget_open_id_by_mobile(token,mobile):urlhttps://open.feishu.cn/open-apis/user/v1/batch_get_idheaders{Authorization:fBearer{token}}params{mobiles:mobile}resprequests.get(url,headersheaders,paramsparams)returnresp.json().get(data,{}).get(mobile_users,{}).get(mobile,[{}])[0].get(open_id)坑3API限频飞书多维表格API有限频读取接口每分钟1000次写入接口每分钟100次。批量写入时在循环里加time.sleep(0.6)避免触发限频。坑4表格共享权限应用需要被加入多维表格的协作者否则即使权限正确也会报403。在飞书多维表格右上角分享 → 添加应用为协作者。总结飞书多维表格API是目前最好用的团队数据同步方案之一。核心要点分页读取、批量写入注意字段类型格式日期用毫秒时间戳Token要定时刷新写操作加延时避免限频署名林焱
影刀RPA 飞书多维表格自动化:读写数据与自动同步实战
影刀RPA 飞书多维表格自动化读写数据与自动同步实战作者林焱写在前面飞书多维表格Base是当下很多团队用来管理数据的核心工具——项目跟踪、销售线索、内容日历都在里面。影刀可以通过飞书开放平台API直接读写多维表格实现自动同步数据、批量更新记录、定时生成报告。本文聚焦多维表格搞清楚API调用的核心逻辑和三个实战场景。一、准备工作获取飞书API权限创建飞书应用打开飞书开放平台https://open.feishu.cn创建自建应用企业内部应用在权限管理中开启bitable:app— 读取多维表格拼多多店群自动化报活动上架bitable:app:readonly— 只读按需选发布应用并让管理员审批获取Access Tokenimportrequestsdefget_feishu_token(app_id,app_secret):urlhttps://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internalpayload{app_id:app_id,app_secret:app_secret}responserequests.post(url,jsonpayload)dataresponse.json()returndata.get(tenant_access_token)TOKENget_feishu_token(cli_xxxxxxxx,xxxxxxxxxxxxxxxx)HEADERS{Authorization:fBearer{TOKEN},Content-Type:application/json}二、多维表格基本操作读取数据表中的记录deflist_records(app_token,table_id,page_size100,filter_formulaNone): 获取多维表格中的记录 app_token: 多维表格的token从URL中获取 table_id: 数据表IDtblXXXXXX filter_formula: 筛选公式如 CurrentValue.[状态]进行中 urlfhttps://open.feishu.cn/open-apis/bitable/v1/apps/{app_token}/tables/{table_id}/recordsparams{page_size:page_size}iffilter_formula:params[filter]filter_formula all_records[]page_tokenNonewhileTrue:ifpage_token:params[page_token]page_token responserequests.get(url,headersHEADERS,paramsparams)dataresponse.json()ifdata.get(code)!0:raiseException(fAPI错误{data})itemsdata.get(data,{}).get(items,[])all_records.extend(items)# 检查是否有下一页has_moredata.get(data,{}).get(has_more,False)ifnothas_more:breakpage_tokendata.get(data,{}).get(page_token)returnall_records# 读取所有进行中的项目recordslist_records(app_tokenIlqXbtxxxxxxxxx,table_idtblxxxxxxxxx,filter_formulaCurrentValue.[状态]进行中)print(f共{len(records)}条记录)forrecinrecords[:3]:print(rec.get(fields))新增记录defcreate_records(app_token,table_id,records_data): 批量新增记录 records_data: 列表每项是一个字段字典 urlfhttps://open.feishu.cn/open-apis/bitable/v1/apps/{app_token}/tables/{table_id}/records/batch_create# 每次最多500条batch_size500created_count0foriinrange(0,len(records_data),batch_size):batchrecords_data[i:ibatch_size]payload{records:[{fields:record}forrecordinbatch]}responserequests.post(url,headersHEADERS,jsonpayload)dataresponse.json()ifdata.get(code)0:created_countlen(data.get(data,{}).get(records,[]))else:print(f新增失败{data})returncreated_count# 新增数据示例new_records[{项目名称:Q4营销活动,负责人:[ou_xxxxxxx],状态:待开始,截止日期:1735660800000},{项目名称:年度汇报,负责人:[ou_yyyyyyy],状态:进行中,截止日期:1736265600000},]countcreate_records(IlqXbtxxxxxxxxx,tblxxxxxxxxx,new_records)print(f成功新增{count}条记录)更新记录defupdate_record(app_token,table_id,record_id,fields):更新单条记录urlfhttps://open.feishu.cn/open-apis/bitable/v1/apps/{app_token}/tables/{table_id}/records/{record_id}payload{fields:fields}responserequests.put(url,headersHEADERS,jsonpayload)returnresponse.json()defbatch_update_records(app_token,table_id,updates): 批量更新 updates: [{record_id, fields}, ...] urlfhttps://open.feishu.cn/open-apis/bitable/v1/apps/{app_token}/tables/{table_id}/records/batch_updatepayload{records:[{record_id:u[record_id],fields:u[fields]}foruinupdates]}responserequests.post(url,headersHEADERS,jsonpayload)returnresponse.json()# 批量将过期项目标记为已超期importtime now_msint(time.time()*1000)updates[]forrecinrecords:fieldsrec.get(fields,{})deadlinefields.get(截止日期)statusfields.get(状态)ifdeadlineanddeadlinenow_msandstatus进行中:updates.append({record_id:rec[record_id],fields:{状态:已超期}})ifupdates:resultbatch_update_records(IlqXbtxxxxxxxxx,tblxxxxxxxxx,updates)print(f更新了{len(updates)}条超期记录)三、实战案例CRM数据自动同步到飞书多维表格场景销售团队用飞书多维表格管理客户每天从官网表单抓取新线索自动录入多维表格并更新已有线索的最新状态。importrequestsimportopenpyxlimporttime# 配置APP_TOKENIlqXbt表格tokenTABLE_IDtbl线索表IDdefget_existing_leads_map(app_token,table_id):获取已有线索建立手机号→record_id的映射recordslist_records(app_token,table_id)phone_to_id{}forrecinrecords:phonerec.get(fields,{}).get(联系电话)ifphone:phone_to_id[str(phone)]rec[record_id]returnphone_to_iddefsync_leads_from_excel(excel_path):从Excel读取新线索同步到飞书多维表格wbopenpyxl.load_workbook(excel_path)wswb.active# 获取已有数据existingget_existing_leads_map(APP_TOKEN,TABLE_ID)new_records[]update_records[]forrowinws.iter_rows(min_row2,values_onlyTrue):name,phone,company,source,created_atrowifnotphone:continuephone_strstr(int(phone))ifisinstance(phone,float)elsestr(phone)fields{姓名:name,联系电话:phone_str,公司:companyor,来源:sourceor官网,}ifphone_strinexisting:# 已存在更新update_records.append({record_id:existing[phone_str],fields:fields})else:# 新线索新增new_records.append(fields)# 执行ifnew_records:countcreate_records(APP_TOKEN,TABLE_ID,new_records)print(f新增{count}条线索)ifupdate_records:# 分批更新foriinrange(0,len(update_records),50):batchupdate_records[i:i50]resultbatch_update_records(APP_TOKEN,TABLE_ID,batch)time.sleep(0.5)print(f更新{len(update_records)}条线索)sync_leads_from_excel(新线索.xlsx)四、多维表格字段类型注意事项飞书多维表格的字段类型比普通表格复杂写入时要注意TEMU店群矩阵自动化运营核价报活动字段类型写入格式示例文本字符串value数字数字100.5日期毫秒时间戳1735660800000单选字符串选项A| 多选 | 字符串列表 |[选项A, 选项B]|| 人员 | open_id列表 |[ou_xxxxxxx]|| 链接 | 对象 |{text: 链接, link: https://...}|| 复选框 | 布尔 |True或False|日期时间戳转换importdatetimedefdatetime_to_ms(dt_str):将2024-01-15转为毫秒时间戳dtdatetime.datetime.strptime(dt_str,%Y-%m-%d)returnint(dt.timestamp()*1000)五、踩坑记录坑1Token有效期是2小时tenant_access_token有效期2小时长时间运行的流程需要定期刷新。建议封装一个自动续期的函数importtimeastime_module _tokenNone_token_expire0defget_valid_token(app_id,app_secret):global_token,_token_expireiftime_module.time()_token_expire-300:# 提前5分钟刷新_tokenget_feishu_token(app_id,app_secret)_token_expiretime_module.time()7200return_token坑2人员字段要用open_id多维表格人员字段接收的是open_id不是手机号或姓名。要先用飞书API根据手机号换取open_iddefget_open_id_by_mobile(token,mobile):urlhttps://open.feishu.cn/open-apis/user/v1/batch_get_idheaders{Authorization:fBearer{token}}params{mobiles:mobile}resprequests.get(url,headersheaders,paramsparams)returnresp.json().get(data,{}).get(mobile_users,{}).get(mobile,[{}])[0].get(open_id)坑3API限频飞书多维表格API有限频读取接口每分钟1000次写入接口每分钟100次。批量写入时在循环里加time.sleep(0.6)避免触发限频。坑4表格共享权限应用需要被加入多维表格的协作者否则即使权限正确也会报403。在飞书多维表格右上角分享 → 添加应用为协作者。总结飞书多维表格API是目前最好用的团队数据同步方案之一。核心要点分页读取、批量写入注意字段类型格式日期用毫秒时间戳Token要定时刷新写操作加延时避免限频署名林焱