问题描述
在飞书 Base 网页端复制一个已有仪表盘后,lark-cli 可以读取其中的图表组件及完整 data_config,但这些组件的 type 被返回为 "unknown"。
尝试修改组件的日期筛选条件时:
base +dashboard-block-update 即使使用 --no-validate,仍会因为 type=unknown 在本地终止;
改用 lark-cli api PATCH 调用同一个 Base v3 endpoint,则服务端返回通用错误 code: 1;
即使只提交保持原值的 name,不修改 data_config,也会返回相同错误。
因此,目前无法通过 CLI 更新网页端复制的仪表盘组件。
这可能是以下情况之一:
相关 Issue:
环境
lark-cli version 1.0.80
macOS / arm64
品牌:Feishu
用户身份和应用身份均已测试
用户 token 已验证有效
已开通:
base:dashboard:read
base:dashboard:update
base:block:read
base:block:update
应用已添加为目标 Base 的可编辑协作者
所有 Base token、dashboard ID、block ID、账号和应用标识均已在以下示例中脱敏。
前置条件
在飞书 Base 网页端创建一个包含图表和日期筛选的仪表盘。
在网页端复制该仪表盘。
日期筛选使用 Base 返回的 ExactDate 格式,例如:
{
"filter" : {
"conditions" : [
{
"field_name" : " Date" ,
"operator" : " isGreater" ,
"value" : [" ExactDate" , 1704038400000 ]
},
{
"field_name" : " Date" ,
"operator" : " isLess" ,
"value" : [" ExactDate" , 1706716800000 ]
}
],
"conjunction" : " and"
}
}
复现步骤
1. 读取组件
用户身份调用:
lark-cli api GET \
/open-apis/base/v3/bases/< base_token> /dashboards/< dashboard_id> /blocks/< block_id> \
--as user
读取成功,返回结果类似:
{
"ok" : true ,
"identity" : " user" ,
"data" : {
"block_id" : " <block_id>" ,
"name" : " 本月示例数据" ,
"type" : " unknown" ,
"data_config" : {
"table_name" : " 示例数据表" ,
"series" : [
{
"field_name" : " Metric" ,
"rollup" : " SUM"
}
],
"group_by" : [
{
"field_name" : " Date" ,
"mode" : " integrated" ,
"sort" : {
"type" : " group"
}
}
],
"filter" : {
"conditions" : [
{
"field_name" : " Date" ,
"operator" : " isGreater" ,
"value" : [" ExactDate" , 1701360000000 ]
},
{
"field_name" : " Date" ,
"operator" : " isLess" ,
"value" : [" ExactDate" , 1704038400000 ]
}
],
"conjunction" : " and"
}
}
}
}
2. 使用 dashboard-block-update 修改日期筛选
lark-cli base +dashboard-block-update \
--base-token < base_token> \
--dashboard-id < dashboard_id> \
--block-id < block_id> \
--data-config ' {
"filter": {
"conditions": [
{
"field_name": "Date",
"operator": "isGreater",
"value": ["ExactDate", 1704038400000]
},
{
"field_name": "Date",
"operator": "isLess",
"value": ["ExactDate", 1706716800000]
}
],
"conjunction": "and"
}
}' \
--no-validate \
--as user
实际结果:
unsupported block type "unknown", supported types: column, bar, line, pie, ring, scatter, funnel, wordCloud, area, combo, radar, statistics, text
--no-validate 没有绕过这个 block type 检查,请求没有发送到服务端。
3. 使用 raw API PATCH 绕过本地类型检查
lark-cli api PATCH \
/open-apis/base/v3/bases/< base_token> /dashboards/< dashboard_id> /blocks/< block_id> \
--data ' {
"data_config": {
"filter": {
"conditions": [
{
"field_name": "Date",
"operator": "isGreater",
"value": ["ExactDate", 1704038400000]
},
{
"field_name": "Date",
"operator": "isLess",
"value": ["ExactDate", 1706716800000]
}
],
"conjunction": "and"
}
}
}' \
--as user
实际结果:
{
"ok" : false ,
"identity" : " user" ,
"error" : {
"type" : " api" ,
"subtype" : " unknown" ,
"code" : 1 ,
"message" : " API error: [1]"
}
}
4. 排除日期 filter 格式问题
只提交保持原值的组件名称:
lark-cli api PATCH \
/open-apis/base/v3/bases/< base_token> /dashboards/< dashboard_id> /blocks/< block_id> \
--data ' {"name":"本月示例数据"}' \
--as user
仍然返回:
{
"ok" : false ,
"identity" : " user" ,
"error" : {
"type" : " api" ,
"subtype" : " unknown" ,
"code" : 1 ,
"message" : " API error: [1]"
}
}
因此错误并非由 ExactDate value 或筛选 JSON 引起。
身份与权限排查
为了排除授权问题,还进行了以下验证:
身份
操作
结果
user
GET block
成功,可读取完整 data_config
user
PATCH block filter
code: 1
user
PATCH block,名称保持原值
code: 1
bot,未添加协作者前
PATCH block
91403
bot,添加为可编辑协作者并开通 read/update 后
GET/PATCH block
scope 和 91403 消失,但返回 code: 1
所以当前问题不是缺少 OAuth scope 或 Base 协作者权限。
预期行为
至少满足以下一种行为:
UI 创建或复制的图表组件应返回 CLI 支持的 canonical block type,而不是 unknown;
即使 block type 暂时无法识别,+dashboard-block-update --no-validate 也应允许更新 name 或已有的 data_config.filter;
从 +dashboard-block-get 得到的 data_config 应能够在仅修改日期值后提交给 +dashboard-block-update,与 lark-cli base +dashboard-block-update 对具体日期筛选不可用 #757 的修复结论一致;
如果上游 API 确实不支持更新该类组件,应返回明确、可操作的错误,而不是通用 code: 1。
实际影响
网页端复制的仪表盘无法通过 CLI 滚动日期范围;
无法将仪表盘配置纳入可重复执行的自动化流程;
只能依赖网页端手动修改或 UI 自动化;
--no-validate 无法作为未知组件类型的 raw passthrough;
通用 code: 1 无法判断是组件类型、服务端兼容性还是其他请求限制。
建议
检查 UI 创建或复制的 Dashboard block 到 CLI type 枚举的映射;
让 --no-validate 真正跳过本地 block type 限制;
为 code: 1 保留并显示上游返回的详细错误信息;
增加以下回归测试:
UI copied block;
type=unknown;
ExactDate filter round-trip;
name-only PATCH;
如果属于 OpenAPI 能力限制,请在 Dashboard 支持矩阵和 CLI help 中明确说明。
问题描述
在飞书 Base 网页端复制一个已有仪表盘后,
lark-cli可以读取其中的图表组件及完整data_config,但这些组件的type被返回为"unknown"。尝试修改组件的日期筛选条件时:
base +dashboard-block-update即使使用--no-validate,仍会因为type=unknown在本地终止;lark-cli api PATCH调用同一个 Base v3 endpoint,则服务端返回通用错误code: 1;name,不修改data_config,也会返回相同错误。因此,目前无法通过 CLI 更新网页端复制的仪表盘组件。
这可能是以下情况之一:
type=unknown的组件;相关 Issue:
环境
lark-cli version 1.0.80base:dashboard:readbase:dashboard:updatebase:block:readbase:block:update所有 Base token、dashboard ID、block ID、账号和应用标识均已在以下示例中脱敏。
前置条件
ExactDate格式,例如:{ "filter": { "conditions": [ { "field_name": "Date", "operator": "isGreater", "value": ["ExactDate", 1704038400000] }, { "field_name": "Date", "operator": "isLess", "value": ["ExactDate", 1706716800000] } ], "conjunction": "and" } }复现步骤
1. 读取组件
用户身份调用:
读取成功,返回结果类似:
{ "ok": true, "identity": "user", "data": { "block_id": "<block_id>", "name": "本月示例数据", "type": "unknown", "data_config": { "table_name": "示例数据表", "series": [ { "field_name": "Metric", "rollup": "SUM" } ], "group_by": [ { "field_name": "Date", "mode": "integrated", "sort": { "type": "group" } } ], "filter": { "conditions": [ { "field_name": "Date", "operator": "isGreater", "value": ["ExactDate", 1701360000000] }, { "field_name": "Date", "operator": "isLess", "value": ["ExactDate", 1704038400000] } ], "conjunction": "and" } } } }2. 使用 dashboard-block-update 修改日期筛选
实际结果:
--no-validate没有绕过这个 block type 检查,请求没有发送到服务端。3. 使用 raw API PATCH 绕过本地类型检查
实际结果:
{ "ok": false, "identity": "user", "error": { "type": "api", "subtype": "unknown", "code": 1, "message": "API error: [1]" } }4. 排除日期 filter 格式问题
只提交保持原值的组件名称:
仍然返回:
{ "ok": false, "identity": "user", "error": { "type": "api", "subtype": "unknown", "code": 1, "message": "API error: [1]" } }因此错误并非由
ExactDatevalue 或筛选 JSON 引起。身份与权限排查
为了排除授权问题,还进行了以下验证:
data_configcode: 1code: 19140391403消失,但返回code: 1所以当前问题不是缺少 OAuth scope 或 Base 协作者权限。
预期行为
至少满足以下一种行为:
unknown;+dashboard-block-update --no-validate也应允许更新name或已有的data_config.filter;+dashboard-block-get得到的data_config应能够在仅修改日期值后提交给+dashboard-block-update,与 lark-cli base +dashboard-block-update 对具体日期筛选不可用 #757 的修复结论一致;code: 1。实际影响
--no-validate无法作为未知组件类型的 raw passthrough;code: 1无法判断是组件类型、服务端兼容性还是其他请求限制。建议
--no-validate真正跳过本地 block type 限制;code: 1保留并显示上游返回的详细错误信息;type=unknown;ExactDatefilter round-trip;