@amaster.ai/pi-lark 0.1.9 → 0.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -3
- package/package.json +2 -2
- package/skills/lark-approval/SKILL.md +2 -2
- package/skills/lark-approval/references/lark-approval-instances-initiated.md +5 -0
- package/skills/lark-approval/references/lark-approval-tasks-add-sign.md +68 -20
- package/skills/lark-approval/references/lark-approval-tasks-query.md +5 -0
- package/skills/lark-apps/SKILL.md +1 -1
- package/skills/lark-apps/references/lark-apps-cache.md +38 -5
- package/skills/lark-base/SKILL.md +131 -11
- package/skills/lark-base/references/lark-base-app.md +18 -0
- package/skills/lark-base/references/lark-base-dashboard-block-config.md +28 -1
- package/skills/lark-base/references/lark-base-dashboard.md +29 -11
- package/skills/lark-base/references/lark-base-data-query.md +2 -6
- package/skills/lark-base/references/lark-base-field-extension.md +170 -0
- package/skills/lark-base/references/lark-base-field-lookup.md +1 -1
- package/skills/lark-base/references/lark-base-field-schema.md +10 -1
- package/skills/lark-base/references/lark-base-filter-condition.md +32 -5
- package/skills/lark-base/references/lark-base-form-detail.md +1 -1
- package/skills/lark-base/references/lark-base-form-questions-create.md +36 -5
- package/skills/lark-base/references/lark-base-form-submit.md +2 -2
- package/skills/lark-base/references/lark-base-record-history-list.md +19 -2
- package/skills/lark-base/references/lark-base-record-query-and-analysis-sop.md +95 -205
- package/skills/lark-base/references/lark-base-template-center.md +199 -0
- package/skills/lark-calendar/SKILL.md +14 -5
- package/skills/lark-calendar/references/lark-calendar-join-event.md +43 -0
- package/skills/lark-calendar/references/lark-calendar-transfer.md +89 -0
- package/skills/lark-doc/references/lark-doc-fetch.md +1 -1
- package/skills/lark-drive/references/lark-drive-add-comment.md +2 -2
- package/skills/lark-drive/references/lark-drive-member-remove.md +2 -1
- package/skills/lark-im/SKILL.md +23 -3
- package/skills/lark-im/references/lark-im-message-read-status.md +96 -0
- package/skills/lark-im/references/lark-im-messages-edit.md +89 -0
- package/skills/lark-im/references/lark-im-messages-mget.md +8 -0
- package/skills/lark-im/references/lark-im-messages-reply.md +2 -0
- package/skills/lark-im/references/lark-im-messages-send.md +6 -2
- package/skills/lark-mail/references/lark-mail-draft-create.md +12 -12
- package/skills/lark-mail/references/lark-mail-forward.md +17 -17
- package/skills/lark-mail/references/lark-mail-reply-all.md +8 -8
- package/skills/lark-mail/references/lark-mail-reply.md +6 -6
- package/skills/lark-mail/references/lark-mail-send.md +20 -20
- package/skills/lark-mail/references/lark-mail-template-create.md +7 -6
- package/skills/lark-mail/references/lark-mail-template-update.md +7 -6
- package/skills/lark-markdown/SKILL.md +1 -1
- package/skills/lark-meeting/SKILL.md +150 -0
- package/skills/{lark-minutes → lark-meeting}/references/lark-minutes-apply-permission.md +2 -5
- package/skills/lark-meeting/references/lark-minutes-detail.md +52 -0
- package/skills/{lark-minutes → lark-meeting}/references/lark-minutes-download.md +4 -6
- package/skills/{lark-minutes → lark-meeting}/references/lark-minutes-search.md +4 -34
- package/skills/{lark-minutes → lark-meeting}/references/lark-minutes-speaker-replace.md +3 -4
- package/skills/{lark-minutes → lark-meeting}/references/lark-minutes-summary.md +3 -5
- package/skills/{lark-minutes → lark-meeting}/references/lark-minutes-todo.md +44 -16
- package/skills/{lark-minutes → lark-meeting}/references/lark-minutes-update.md +2 -3
- package/skills/lark-meeting/references/lark-minutes-upload.md +71 -0
- package/skills/lark-meeting/references/lark-note-detail.md +15 -0
- package/skills/lark-meeting/references/lark-note-transcript.md +19 -0
- package/skills/lark-meeting/references/lark-vc-agent-meeting-end.md +26 -0
- package/skills/lark-meeting/references/lark-vc-agent-meeting-invite.md +32 -0
- package/skills/{lark-vc-agent → lark-meeting}/references/lark-vc-agent-meeting-join.md +11 -56
- package/skills/{lark-vc-agent → lark-meeting}/references/lark-vc-agent-meeting-leave.md +2 -41
- package/skills/lark-meeting/references/lark-vc-detail.md +31 -0
- package/skills/lark-meeting/references/lark-vc-meeting-countdown.md +103 -0
- package/skills/{lark-vc → lark-meeting}/references/lark-vc-meeting-events.md +9 -98
- package/skills/{lark-vc → lark-meeting}/references/lark-vc-meeting-list-active.md +4 -29
- package/skills/{lark-vc → lark-meeting}/references/lark-vc-meeting-message-send.md +3 -5
- package/skills/lark-meeting/references/lark-vc-meeting-screenshot.md +34 -0
- package/skills/{lark-vc → lark-meeting}/references/lark-vc-recording.md +4 -65
- package/skills/{lark-vc → lark-meeting}/references/lark-vc-search.md +9 -28
- package/skills/lark-meeting/scenes/create-and-edit-minutes.md +147 -0
- package/skills/lark-meeting/scenes/live-meeting-attend.md +164 -0
- package/skills/lark-meeting/scenes/live-meeting-interact.md +101 -0
- package/skills/lark-meeting/scenes/query-meeting-and-artifacts.md +90 -0
- package/skills/lark-meeting/scenes/query-minutes-and-artifacts.md +70 -0
- package/skills/lark-meeting/scenes/query-note-and-artifacts.md +127 -0
- package/skills/lark-minutes/SKILL.md +5 -203
- package/skills/lark-note/SKILL.md +5 -88
- package/skills/lark-shared/SKILL.md +25 -224
- package/skills/lark-shared/references/lark-shared-config-init.md +12 -0
- package/skills/lark-shared/references/lark-shared-high-risk-approval.md +38 -0
- package/skills/lark-shared/references/lark-shared-identity-and-permissions.md +105 -0
- package/skills/lark-shared/references/lark-shared-output-contract.md +17 -0
- package/skills/lark-shared/references/lark-shared-update-notice.md +23 -0
- package/skills/lark-sheets/SKILL.md +76 -60
- package/skills/lark-sheets/references/lark-sheets-batch-update.md +83 -14
- package/skills/lark-sheets/references/lark-sheets-chart.md +296 -159
- package/skills/lark-sheets/references/lark-sheets-conditional-format.md +46 -9
- package/skills/lark-sheets/references/lark-sheets-filter.md +1 -1
- package/skills/lark-sheets/references/lark-sheets-formula-translation.md +78 -65
- package/skills/lark-sheets/references/lark-sheets-formula-verify.md +21 -17
- package/skills/lark-sheets/references/lark-sheets-pivot-table.md +2 -1
- package/skills/lark-sheets/references/lark-sheets-range-operations.md +1 -1
- package/skills/lark-sheets/references/lark-sheets-read-data.md +8 -5
- package/skills/lark-sheets/references/lark-sheets-search-replace.md +4 -4
- package/skills/lark-sheets/references/lark-sheets-sheet-structure.md +2 -2
- package/skills/lark-sheets/references/lark-sheets-sparkline.md +1 -0
- package/skills/lark-sheets/references/lark-sheets-styles-put.md +3 -3
- package/skills/lark-sheets/references/lark-sheets-visual-standards.md +6 -4
- package/skills/lark-sheets/references/lark-sheets-workbook.md +3 -1
- package/skills/lark-sheets/references/lark-sheets-write-cells.md +50 -48
- package/skills/lark-sheets/scripts/lark_chart_layout_check.py +472 -0
- package/skills/lark-slides/SKILL.md +2 -0
- package/skills/lark-slides/references/cli/lark-slides-add-slide.md +6 -6
- package/skills/lark-slides/references/cli/lark-slides-delete-slide.md +3 -3
- package/skills/lark-slides/references/cli/lark-slides-replace-slide.md +11 -11
- package/skills/lark-slides/references/cli/lark-slides-xml-presentation-slide-get.md +1 -1
- package/skills/lark-slides/references/cli/lark-slides-xml-presentation-slide-replace.md +2 -2
- package/skills/lark-slides/references/workflow/slides-editing.md +11 -11
- package/skills/lark-slides/references/xml/slides_xml_schema_definition.xml +103 -14
- package/skills/lark-task/SKILL.md +1 -1
- package/skills/lark-vc/SKILL.md +5 -205
- package/skills/lark-vc-agent/SKILL.md +5 -206
- package/skills/lark-workflow-meeting-summary/SKILL.md +20 -13
- package/skills/lark-base/references/lark-base-cell-value.md +0 -165
- package/skills/lark-base/references/lark-base-data-analysis-pandas.md +0 -93
- package/skills/lark-base/references/lark-base-data-analysis-python-stdlib.md +0 -120
- package/skills/lark-base/references/lark-base-record-batch-create.md +0 -63
- package/skills/lark-base/references/lark-base-record-batch-update.md +0 -57
- package/skills/lark-base/references/lark-base-record-query-and-analysis-cloud-sop.md +0 -145
- package/skills/lark-minutes/references/lark-minutes-detail.md +0 -63
- package/skills/lark-minutes/references/lark-minutes-upload.md +0 -104
- package/skills/lark-note/references/lark-note-detail.md +0 -29
- package/skills/lark-note/references/lark-note-transcript.md +0 -25
- package/skills/lark-vc/references/lark-vc-detail.md +0 -49
- package/skills/lark-vc/references/vc-domain-boundaries.md +0 -203
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
# base CellValue 规范(lark-base-cell-value)
|
|
2
|
-
|
|
3
|
-
> 适用命令:`lark-cli base +record-batch-create`、`lark-cli base +record-batch-update`
|
|
4
|
-
|
|
5
|
-
本文件定义 **shortcut 写记录** 时 `CellValue` 的推荐格式,目标是让 AI 一次写对。不同命令的外层 JSON 形状不同,但每个 cell 都以本文为 source of truth。
|
|
6
|
-
|
|
7
|
-
## 1. 顶层规则(必须遵守)
|
|
8
|
-
|
|
9
|
-
- `--json` 必须是 JSON 对象。
|
|
10
|
-
- `+record-batch-create --json` 使用 `{"create_records":[{"字段名或字段ID": CellValue}, ...]}`,数组中的每个对象代表一条新 Record。
|
|
11
|
-
- `+record-batch-update --json` 使用 `{"update_records":{"rec_xxx":{"字段名或字段ID": CellValue}, ...}}`,以 `record_id` 定位每条待更新 Record。
|
|
12
|
-
- 一次 payload 里同一字段只用一种 key(字段名或字段 ID),不要重复。
|
|
13
|
-
- 写入前先 `+field-list` 获取字段 `type/style/multiple`,再构造值。
|
|
14
|
-
- 需要清空字段时优先传 `null`(字段允许清空时)。
|
|
15
|
-
|
|
16
|
-
## 2. 各类型 CellValue
|
|
17
|
-
|
|
18
|
-
### 2.1 text
|
|
19
|
-
|
|
20
|
-
text 字段的 `style.type` 影响单元格检查逻辑:
|
|
21
|
-
`type=plain` 传 Markdown 格式的字符串。
|
|
22
|
-
`type=url` 传一个带 title 的 Markdown 格式链接,或单独传一个链接。
|
|
23
|
-
`type=phone` 传合法电话号码。
|
|
24
|
-
`type=email` 传合法邮箱字符串。
|
|
25
|
-
|
|
26
|
-
```json
|
|
27
|
-
{
|
|
28
|
-
"标题": "Hello, [lark-cli](https://github.com/larksuite/cli)",
|
|
29
|
-
"官网": "[官网](https://example.com)",
|
|
30
|
-
"联系电话": "1380000000000",
|
|
31
|
-
"邮箱": "owner@example.com"
|
|
32
|
-
}
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
### 2.2 number
|
|
36
|
-
|
|
37
|
-
用 JSON number,不要用带单位或千分位的字符串。货币、百分比、进度、评分等数字类字段也按数字写入,展示格式由字段配置决定。
|
|
38
|
-
|
|
39
|
-
```json
|
|
40
|
-
{
|
|
41
|
-
"工时": 12.5,
|
|
42
|
-
"预算": 3000,
|
|
43
|
-
"完成度": 0.65,
|
|
44
|
-
"评分": 4
|
|
45
|
-
}
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
### 2.3 select(单选/多选)
|
|
49
|
-
|
|
50
|
-
`select` 字段统一传选项名称数组。`multiple=false` 时数组只能包含一个元素,`multiple=true` 时可以包含多个元素。只支持写入字段中已有的选项;构造 CellValue 前先用 `+field-list` 或 `+field-search-options` 确认目标选项存在。
|
|
51
|
-
|
|
52
|
-
```json
|
|
53
|
-
{
|
|
54
|
-
"单选": ["Todo"],
|
|
55
|
-
"多选": ["后端", "高优"]
|
|
56
|
-
}
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
读取单元格时与写入的数据结构一致。
|
|
60
|
-
|
|
61
|
-
### 2.4 datetime
|
|
62
|
-
|
|
63
|
-
写入可省略时区偏移量,系统会按 Base 时区解析输入字符串;优先使用 `YYYY-MM-DD HH:mm`。Base 默认按分钟展示,但底层以毫秒级精度存储时间
|
|
64
|
-
|
|
65
|
-
```json
|
|
66
|
-
{
|
|
67
|
-
"截止时间": "2026-03-24 10:00"
|
|
68
|
-
}
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
读取单元格时,日期时间输出为标准 RFC3339 字符串并固定保留三位毫秒,例如 `"2026-03-24T10:00:00.000+08:00"`。
|
|
72
|
-
|
|
73
|
-
### 2.5 checkbox
|
|
74
|
-
|
|
75
|
-
用 JSON boolean:`true` 或 `false`,不要用 `"true"`、`"是"`、`1`。
|
|
76
|
-
|
|
77
|
-
```json
|
|
78
|
-
{
|
|
79
|
-
"已完成": true
|
|
80
|
-
}
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
### 2.6 user / group_chat
|
|
84
|
-
|
|
85
|
-
`user` 和 `group_chat` 字段统一传对象数组。`multiple=false` 时数组只能包含一个元素,`multiple=true` 时可以包含多个元素。每个元素至少包含 `id`;人员字段传用户 ID(如 `ou_xxx`),群字段传群 ID(如 `oc_xxx`)。
|
|
86
|
-
|
|
87
|
-
> **人员字段:不要猜 ID。** 不知道 `open_id` 时,先用 `lark-contact` 查 id:`lark-cli contact +search-user --query "<姓名/邮箱/手机号>" --as user`。
|
|
88
|
-
|
|
89
|
-
> **群组字段:不要猜 ID。** 不知道 `chat_id` 时,先用 `lark-im` 搜群:`lark-cli im +chat-search --query "<群名关键词>" --as user`;取结果里的 `oc_xxx`。
|
|
90
|
-
|
|
91
|
-
```json
|
|
92
|
-
{
|
|
93
|
-
"负责人": [
|
|
94
|
-
{ "id": "ou_xxx" },
|
|
95
|
-
{ "id": "ou_xxx2" }
|
|
96
|
-
],
|
|
97
|
-
"协作群": [
|
|
98
|
-
{ "id": "oc_xxx" }
|
|
99
|
-
]
|
|
100
|
-
}
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
读取单元格时仍为对象数组,每个元素为 `{id, name}`,例如 `[{"id":"ou_xxx","name":"张三"}]`。
|
|
104
|
-
|
|
105
|
-
### 2.7 link
|
|
106
|
-
|
|
107
|
-
用对象数组,元素包含 `id`,值为目标记录的 `record_id`。不要传记录标题;先用 `+record-list` / `+record-search` 找到目标记录 ID。
|
|
108
|
-
|
|
109
|
-
```json
|
|
110
|
-
{
|
|
111
|
-
"关联任务": [
|
|
112
|
-
{ "id": "<record_id>" }
|
|
113
|
-
]
|
|
114
|
-
}
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
读取单元格时与写入的数据结构一致。
|
|
118
|
-
|
|
119
|
-
### 2.8 location
|
|
120
|
-
|
|
121
|
-
- 读取:`{lng, lat, full_address}`,三个成员均非空。
|
|
122
|
-
- 写入:`{lng, lat}`,经纬度均为数字;`full_address` 由平台根据坐标解析,不允许手动指定。
|
|
123
|
-
- 筛选行为:按照 `full_address` 做字符串筛选,将 Location 当作文本列使用文本 operator。
|
|
124
|
-
|
|
125
|
-
```json
|
|
126
|
-
{
|
|
127
|
-
"坐标": {
|
|
128
|
-
"lng": 116.397428,
|
|
129
|
-
"lat": 39.90923
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
### 2.9 attachment(不作为普通 CellValue 写入)
|
|
136
|
-
|
|
137
|
-
读取单元格时,附件为数组,每个元素为 `{file_token, size, name}`,例如 `[{"file_token":"box_xxx","size":1024,"name":"report.pdf"}]`。
|
|
138
|
-
|
|
139
|
-
- 追加附件:使用 `lark-cli base +record-upload-attachment --record-id <record_id> --field-id <field_id> --file <path>`;可重复 `--file` 一次追加多个附件,不能用普通记录操作接口写附件值。
|
|
140
|
-
- 删除附件:使用 `lark-cli base +record-remove-attachment --record-id <record_id> --field-id <field_id> --file-token <file_token> --yes`;可重复 `--file-token` 一次删除同一单元格里的多个附件。
|
|
141
|
-
- 下载附件:使用 `lark-cli base +record-download-attachment --record-id <record_id> --file-token <file_token> --output <dir>`;不传 `--file-token` 时下载整行所有附件,也可重复 `--file-token` 只下载指定附件。Base 附件必须用这个命令下载,用其他下载入口可能失败。
|
|
142
|
-
|
|
143
|
-
## 3. 只读字段(不要写)
|
|
144
|
-
|
|
145
|
-
写记录时,`auto_number`、`lookup`、`formula`、`created_at/updated_at`、`created_by/updated_by` 均为只读字段。
|
|
146
|
-
|
|
147
|
-
写入只读字段通常不会更新数据;返回里可能出现 `ignored_fields`,reason 会说明 `READONLY`。看到这种返回时,不要重试同一 payload,应移除只读字段,只写存储字段。
|
|
148
|
-
|
|
149
|
-
读取单元格时,`auto_number`、`formula`、`lookup` 为 `string | null`;`created_at`、`updated_at` 为 RFC3339 字符串或 `null`;`created_by`、`updated_by` 为 `array<{id, name}>`。
|
|
150
|
-
|
|
151
|
-
## 4. 完整示例
|
|
152
|
-
|
|
153
|
-
```json
|
|
154
|
-
{
|
|
155
|
-
"标题": "Created from shortcut",
|
|
156
|
-
"状态": ["Todo"],
|
|
157
|
-
"标签": ["高优", "外部依赖"],
|
|
158
|
-
"工时": 8,
|
|
159
|
-
"截止时间": "2026-03-24 10:00",
|
|
160
|
-
"已完成": false,
|
|
161
|
-
"负责人": [{ "id": "ou_123" }],
|
|
162
|
-
"关联任务": [{ "id": "rec_456" }],
|
|
163
|
-
"坐标": { "lng": 116.397428, "lat": 39.90923 }
|
|
164
|
-
}
|
|
165
|
-
```
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
# Base NDJSON:pandas 示例
|
|
2
|
-
|
|
3
|
-
仅在统一数据分析 SOP 已选择 pandas 后读取。本页不重复 Base 的粒度与关系规则,只展示对应实现。
|
|
4
|
-
|
|
5
|
-
示例假设 `records.ndjson` 包含 `record_id`、`日期`、`状态`、`金额`、`负责人`、`标签`、`关联客户`;`customers.ndjson` 包含 `record_id`、`客户名称`。多值列使用统一数据分析 SOP 定义的数组结构。
|
|
6
|
-
|
|
7
|
-
## 加载与日期解析
|
|
8
|
-
|
|
9
|
-
```python
|
|
10
|
-
import pandas as pd
|
|
11
|
-
|
|
12
|
-
records = pd.read_json("records.ndjson", lines=True)
|
|
13
|
-
raw_dates = records["日期"].astype("string")
|
|
14
|
-
records["日期_local"] = pd.to_datetime(
|
|
15
|
-
raw_dates.str.slice(0, 10), format="%Y-%m-%d", errors="coerce"
|
|
16
|
-
)
|
|
17
|
-
records["日期_instant"] = pd.to_datetime(
|
|
18
|
-
raw_dates, format="ISO8601", utc=True, errors="coerce"
|
|
19
|
-
)
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
按来源 Base 的日、周、月分组使用 `日期_local`;计算真实时长、排序或跨时区比较使用 `日期_instant`。实际任务只需构造所需的一列。
|
|
23
|
-
|
|
24
|
-
## 集合谓词:保持 record 粒度
|
|
25
|
-
|
|
26
|
-
筛选“状态”包含“进行中”的记录,并在 record 粒度汇总:
|
|
27
|
-
|
|
28
|
-
```python
|
|
29
|
-
active = records[records["状态"].map(lambda values: "进行中" in values)]
|
|
30
|
-
summary = {
|
|
31
|
-
"records_count": len(active),
|
|
32
|
-
"amount_sum": active["金额"].sum(min_count=1),
|
|
33
|
-
}
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
## 单数组展开:切换到人员粒度
|
|
37
|
-
|
|
38
|
-
```python
|
|
39
|
-
owners = records[["record_id", "负责人"]].explode("负责人", ignore_index=True)
|
|
40
|
-
owners = owners[owners["负责人"].notna()].assign(
|
|
41
|
-
user_id=lambda df: df["负责人"].map(lambda user: user["id"]),
|
|
42
|
-
user_name=lambda df: df["负责人"].map(lambda user: user["name"]),
|
|
43
|
-
)
|
|
44
|
-
by_owner = (
|
|
45
|
-
owners.groupby(["user_id", "user_name"], as_index=False)
|
|
46
|
-
.agg(records_count=("record_id", "nunique"))
|
|
47
|
-
.sort_values("records_count", ascending=False)
|
|
48
|
-
)
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
## Link JOIN:先建立边表
|
|
52
|
-
|
|
53
|
-
```python
|
|
54
|
-
edges = (
|
|
55
|
-
records[["record_id", "关联客户"]]
|
|
56
|
-
.rename(columns={"record_id": "source_record_id"})
|
|
57
|
-
.explode("关联客户", ignore_index=True)
|
|
58
|
-
)
|
|
59
|
-
edges = edges[edges["关联客户"].notna()].assign(
|
|
60
|
-
target_record_id=lambda df: df["关联客户"].map(lambda link: link["id"])
|
|
61
|
-
)[["source_record_id", "target_record_id"]]
|
|
62
|
-
|
|
63
|
-
customers = pd.read_json("customers.ndjson", lines=True).rename(
|
|
64
|
-
columns={"record_id": "target_record_id"}
|
|
65
|
-
)
|
|
66
|
-
joined = edges.merge(
|
|
67
|
-
customers[["target_record_id", "客户名称"]],
|
|
68
|
-
on="target_record_id",
|
|
69
|
-
how="left",
|
|
70
|
-
)
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
## 多数组共现:显式生成行内笛卡尔积
|
|
74
|
-
|
|
75
|
-
连续两次 `explode` 表示同一 source record 内的 `负责人 × 标签`:
|
|
76
|
-
|
|
77
|
-
```python
|
|
78
|
-
pairs = (
|
|
79
|
-
records[["record_id", "负责人", "标签"]]
|
|
80
|
-
.explode("负责人", ignore_index=True)
|
|
81
|
-
.explode("标签", ignore_index=True)
|
|
82
|
-
.dropna(subset=["负责人", "标签"])
|
|
83
|
-
.assign(
|
|
84
|
-
user_id=lambda df: df["负责人"].map(lambda user: user["id"]),
|
|
85
|
-
user_name=lambda df: df["负责人"].map(lambda user: user["name"]),
|
|
86
|
-
)
|
|
87
|
-
)
|
|
88
|
-
cooccurrence = (
|
|
89
|
-
pairs.groupby(["user_id", "user_name", "标签"], as_index=False)
|
|
90
|
-
.agg(records_count=("record_id", "nunique"))
|
|
91
|
-
.sort_values("records_count", ascending=False)
|
|
92
|
-
)
|
|
93
|
-
```
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
# Base NDJSON:Python 标准库示例
|
|
2
|
-
|
|
3
|
-
仅在统一数据分析 SOP 已选择 Python 标准库后读取。本页不重复 Base 的粒度与关系规则,只展示对应实现。
|
|
4
|
-
|
|
5
|
-
示例假设 `records.ndjson` 包含 `record_id`、`日期`、`状态`、`金额`、`负责人`、`标签`、`关联客户`;`customers.ndjson` 包含 `record_id`、`客户名称`。多值列使用统一数据分析 SOP 定义的数组结构。
|
|
6
|
-
|
|
7
|
-
## 加载与日期解析
|
|
8
|
-
|
|
9
|
-
NDJSON 每行是一条独立 JSON record;按行读取即可,不要先把文件整体载入字符串。
|
|
10
|
-
|
|
11
|
-
```python
|
|
12
|
-
import json
|
|
13
|
-
from datetime import date, datetime
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
def read_ndjson(path):
|
|
17
|
-
with open(path, encoding="utf-8") as stream:
|
|
18
|
-
for line in stream:
|
|
19
|
-
if line.strip():
|
|
20
|
-
yield json.loads(line)
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
records = list(read_ndjson("records.ndjson"))
|
|
24
|
-
for record in records:
|
|
25
|
-
raw_date = record["日期"]
|
|
26
|
-
record["日期_local"] = date.fromisoformat(raw_date[:10]) if raw_date else None
|
|
27
|
-
record["日期_instant"] = datetime.fromisoformat(raw_date) if raw_date else None
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
按来源 Base 的日、周、月分组使用 `日期_local`;计算真实时长、排序或跨时区比较使用 `日期_instant`。实际任务只需构造所需的一项。
|
|
31
|
-
|
|
32
|
-
## 集合谓词:保持 record 粒度
|
|
33
|
-
|
|
34
|
-
筛选“状态”包含“进行中”的记录,并在 record 粒度汇总:
|
|
35
|
-
|
|
36
|
-
```python
|
|
37
|
-
active = [record for record in records if "进行中" in record["状态"]]
|
|
38
|
-
amounts = [record["金额"] for record in active if record["金额"] is not None]
|
|
39
|
-
summary = {
|
|
40
|
-
"records_count": len(active),
|
|
41
|
-
"amount_sum": sum(amounts) if amounts else None,
|
|
42
|
-
}
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
## 单数组展开:切换到人员粒度
|
|
46
|
-
|
|
47
|
-
用嵌套循环表达 lateral expansion;按人员 `id` 聚合,`name` 只用于展示。
|
|
48
|
-
|
|
49
|
-
```python
|
|
50
|
-
from collections import defaultdict
|
|
51
|
-
|
|
52
|
-
record_ids_by_owner = defaultdict(set)
|
|
53
|
-
owner_names = {}
|
|
54
|
-
for record in records:
|
|
55
|
-
for owner in record["负责人"]:
|
|
56
|
-
record_ids_by_owner[owner["id"]].add(record["record_id"])
|
|
57
|
-
owner_names[owner["id"]] = owner["name"]
|
|
58
|
-
|
|
59
|
-
by_owner = sorted(
|
|
60
|
-
(
|
|
61
|
-
{
|
|
62
|
-
"user_id": user_id,
|
|
63
|
-
"user_name": owner_names[user_id],
|
|
64
|
-
"records_count": len(record_ids),
|
|
65
|
-
}
|
|
66
|
-
for user_id, record_ids in record_ids_by_owner.items()
|
|
67
|
-
),
|
|
68
|
-
key=lambda row: (-row["records_count"], row["user_id"]),
|
|
69
|
-
)
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
## Link JOIN:先建立目标表索引
|
|
73
|
-
|
|
74
|
-
目标表的 `record_id` 是唯一主键,可直接建立哈希索引;Link 的 `id` 用于索引查找。
|
|
75
|
-
|
|
76
|
-
```python
|
|
77
|
-
customers = {
|
|
78
|
-
customer["record_id"]: customer
|
|
79
|
-
for customer in read_ndjson("customers.ndjson")
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
joined = []
|
|
83
|
-
for record in records:
|
|
84
|
-
for link in record["关联客户"]:
|
|
85
|
-
customer = customers.get(link["id"])
|
|
86
|
-
joined.append(
|
|
87
|
-
{
|
|
88
|
-
"source_record_id": record["record_id"],
|
|
89
|
-
"target_record_id": link["id"],
|
|
90
|
-
"客户名称": customer["客户名称"] if customer else None,
|
|
91
|
-
}
|
|
92
|
-
)
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
## 多数组共现:显式生成行内笛卡尔积
|
|
96
|
-
|
|
97
|
-
两层嵌套循环表示同一 source record 内的 `负责人 × 标签`:
|
|
98
|
-
|
|
99
|
-
```python
|
|
100
|
-
record_ids_by_pair = defaultdict(set)
|
|
101
|
-
owner_names = {}
|
|
102
|
-
for record in records:
|
|
103
|
-
for owner in record["负责人"]:
|
|
104
|
-
owner_names[owner["id"]] = owner["name"]
|
|
105
|
-
for tag in record["标签"]:
|
|
106
|
-
record_ids_by_pair[(owner["id"], tag)].add(record["record_id"])
|
|
107
|
-
|
|
108
|
-
cooccurrence = sorted(
|
|
109
|
-
(
|
|
110
|
-
{
|
|
111
|
-
"user_id": user_id,
|
|
112
|
-
"user_name": owner_names[user_id],
|
|
113
|
-
"标签": tag,
|
|
114
|
-
"records_count": len(record_ids),
|
|
115
|
-
}
|
|
116
|
-
for (user_id, tag), record_ids in record_ids_by_pair.items()
|
|
117
|
-
),
|
|
118
|
-
key=lambda row: (-row["records_count"], row["user_id"], row["标签"]),
|
|
119
|
-
)
|
|
120
|
-
```
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
# base +record-batch-create
|
|
2
|
-
|
|
3
|
-
> **前置条件:** 先阅读 [`../lark-shared/SKILL.md`](../../lark-shared/SKILL.md) 了解认证、全局参数和安全规则。
|
|
4
|
-
|
|
5
|
-
批量创建记录。
|
|
6
|
-
|
|
7
|
-
## 适用场景(重点)
|
|
8
|
-
|
|
9
|
-
- 适合导入 CSV / Excel、外部系统一次性写入新数据。
|
|
10
|
-
- 先把每条输入数据映射为独立的字段对象,再组装到 `create_records`。
|
|
11
|
-
|
|
12
|
-
## 推荐命令
|
|
13
|
-
|
|
14
|
-
```bash
|
|
15
|
-
lark-cli base +record-batch-create --base-token <base_token> --table-id <table_id> \
|
|
16
|
-
--json '{"create_records":[{"标题":"任务 A","状态":"Open"},{"标题":"任务 B","状态":"Done"}]}'
|
|
17
|
-
|
|
18
|
-
lark-cli base +record-batch-create --base-token <base_token> --table-id <table_id> --json @batch-create.json
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
## 参数
|
|
22
|
-
|
|
23
|
-
| 参数 | 必填 | 说明 |
|
|
24
|
-
|------|------|------|
|
|
25
|
-
| `--base-token <token>` | 是 | Base Token |
|
|
26
|
-
| `--table-id <id_or_name>` | 是 | 表 ID 或表名 |
|
|
27
|
-
| `--json <body>` | 是 | 批量创建请求体,必须是 JSON 对象。支持直接传 JSON 字符串,或 `@<file_path>` 从文件读取 |
|
|
28
|
-
|
|
29
|
-
## API
|
|
30
|
-
|
|
31
|
-
`POST /open-apis/base/v3/bases/:base_token/tables/:table_id/records/batch_create`
|
|
32
|
-
|
|
33
|
-
## `--json` 结构
|
|
34
|
-
|
|
35
|
-
本节只说明 `+record-batch-create` 的外层 JSON 形状;CellValue 统一看 [lark-base-cell-value.md](lark-base-cell-value.md)。
|
|
36
|
-
|
|
37
|
-
对象形态:
|
|
38
|
-
|
|
39
|
-
```json
|
|
40
|
-
{"create_records":[{"标题":"任务 A","状态":"Open"},{"标题":"任务 B","状态":"Done"}]}
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
| 字段 | 类型 | 必填 | 说明 |
|
|
44
|
-
|------|------|------|------|
|
|
45
|
-
| `create_records` | `Array<Map<FieldNameOrID, CellValue>>` | 是 | 记录字段对象数组;每条记录可以提交不同字段,单次最多 200 条 |
|
|
46
|
-
|
|
47
|
-
## 返回重点
|
|
48
|
-
|
|
49
|
-
返回 `record_id_list` 和可选的 `ignored_fields`。
|
|
50
|
-
|
|
51
|
-
## 坑点
|
|
52
|
-
|
|
53
|
-
- 每个 `create_records` 元素都是独立的记录字段对象,只提交该记录需要写入的字段。
|
|
54
|
-
- 单次最多 200 条;`1254104` 表示超过单批上限,拆成多个批次。
|
|
55
|
-
- `1254045` 表示字段不存在,重新 `+field-list` 后使用真实字段名或 `field_id`。
|
|
56
|
-
- `1254015` 表示 CellValue 类型不匹配,按真实 Field schema 和 CellValue 规范修正。
|
|
57
|
-
- 返回 `ignored_fields` / `READONLY` 时,从普通 Record 写入中移除 Formula、Lookup、系统字段和自动编号等只读字段。
|
|
58
|
-
- 同一 Table 连续批量写入使用串行执行;`1254291` 表示并发写冲突,短暂等待后重试当前批次。
|
|
59
|
-
- `select` 字段只支持写入字段中已有的选项;构造 CellValue 前先用 `+field-list` 或 `+field-search-options` 确认目标选项存在。
|
|
60
|
-
|
|
61
|
-
## 参考
|
|
62
|
-
|
|
63
|
-
- [lark-base-cell-value.md](lark-base-cell-value.md) — CellValue 格式规范
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
# base +record-batch-update (batch update)
|
|
2
|
-
|
|
3
|
-
> **前置条件:** 先阅读 [`../lark-shared/SKILL.md`](../../lark-shared/SKILL.md) 了解认证、全局参数和安全规则。
|
|
4
|
-
|
|
5
|
-
通过 `update_records` 为每条记录提交字段值。
|
|
6
|
-
|
|
7
|
-
## 推荐命令
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
lark-cli base +record-batch-update --base-token <base_token> --table-id <table_id> \
|
|
11
|
-
--json '{"update_records":{"<record_id_a>":{"状态":["完成"]},"<record_id_b>":{"分数":20}}}'
|
|
12
|
-
|
|
13
|
-
lark-cli base +record-batch-update --base-token <base_token> --table-id <table_id> --json @batch-update.json
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
## 参数
|
|
17
|
-
|
|
18
|
-
| 参数 | 必填 | 说明 |
|
|
19
|
-
|------|------|------|
|
|
20
|
-
| `--base-token <token>` | 是 | Base Token |
|
|
21
|
-
| `--table-id <id_or_name>` | 是 | 表 ID 或表名 |
|
|
22
|
-
| `--json <body>` | 是 | 批量更新请求体,必须是 JSON 对象。支持直接传 JSON 字符串,或 `@<file_path>` 从文件读取 |
|
|
23
|
-
|
|
24
|
-
## API
|
|
25
|
-
|
|
26
|
-
`POST /open-apis/base/v3/bases/:base_token/tables/:table_id/records/batch_update`
|
|
27
|
-
|
|
28
|
-
## `--json` 结构
|
|
29
|
-
|
|
30
|
-
本节只说明 `+record-batch-update` 的外层 JSON 形状;CellValue 统一看 [lark-base-cell-value.md](lark-base-cell-value.md)。
|
|
31
|
-
|
|
32
|
-
对象形态:
|
|
33
|
-
|
|
34
|
-
```json
|
|
35
|
-
{"update_records":{"recA":{"状态":["完成"]},"recB":{"分数":20}}}
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
| 字段 | 类型 | 必填 | 说明 |
|
|
39
|
-
|------|------|------|------|
|
|
40
|
-
| `update_records` | `Map<RecordID, Map<FieldNameOrID, CellValue>>` | 是 | record ID 到字段更新对象的映射(单次最多 200 条) |
|
|
41
|
-
|
|
42
|
-
## 返回重点
|
|
43
|
-
|
|
44
|
-
成功响应只包含可选的 `ignored_fields`;没有忽略字段时 `data` 为空对象。请求不会预先校验 record ID 是否存在,因此需要确认实际写入结果时,应再用 `+record-get` 读回目标记录。
|
|
45
|
-
|
|
46
|
-
## 坑点
|
|
47
|
-
|
|
48
|
-
- 单次最多更新 200 条记录;`1254104` 表示超过单批上限,拆成多个批次。
|
|
49
|
-
- `1254045` 表示字段不存在,重新 `+field-list` 后使用真实字段名或 `field_id`。
|
|
50
|
-
- `1254015` 表示 CellValue 类型不匹配,按真实 Field schema 和 CellValue 规范修正。
|
|
51
|
-
- 命令不会自动做字段/行映射转换,传什么就发什么。
|
|
52
|
-
- 如果字段映射包含只读字段,返回里可能出现 `ignored_fields` / `READONLY`;移除 Formula、Lookup、系统字段和自动编号等只读字段。
|
|
53
|
-
- 同一 Table 连续批量写入使用串行执行;`1254291` 表示并发写冲突,短暂等待后重试当前批次。
|
|
54
|
-
|
|
55
|
-
## 参考
|
|
56
|
-
|
|
57
|
-
- [lark-base-cell-value.md](lark-base-cell-value.md) — CellValue 格式规范
|
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
# Base Record 查询与分析 Cloud SOP
|
|
2
|
-
|
|
3
|
-
统一数据分析 SOP 将任务路由到 Cloud 时使用本 SOP。覆盖记录读取、筛选、排序、Top/Bottom N、聚合统计、分组聚合、多表关联和查询后写入前的目标定位。
|
|
4
|
-
|
|
5
|
-
本文只管查询选路和正确性边界;先按下方 Intent -> Tool Path 选择原始记录查询或聚合查询,再读真实结构和现状:
|
|
6
|
-
|
|
7
|
-
- 视图筛选: [lark-base-view-set-filter.md](lark-base-view-set-filter.md)
|
|
8
|
-
- 记录读取: `+record-list` / `+record-search` / `+record-get`,先确认字段 ID、字段名、分页和投影范围
|
|
9
|
-
|
|
10
|
-
## 0. 执行约定
|
|
11
|
-
|
|
12
|
-
- “最高、最低、最新、最早、Top、Bottom、总数、全部、异常、最大、最小、最多、最少、优先级最高”等全局语义,在本路径中由 Base 云端查询服务完成筛选、排序或聚合。
|
|
13
|
-
- 一次性原始记录查询优先用 `+record-list` / `+record-search` 的 filter/sort;聚合分析优先用 `+data-query`。
|
|
14
|
-
- `+record-search` 用于关键词检索字段的展示文本;金额、状态、日期、空值、关联等结构化条件继续用 `--filter-json` 表达。
|
|
15
|
-
- 不要依赖已有视图,除非用户明确指定该视图,或你已读取并验证其 filter/sort/projection 符合当前问题。
|
|
16
|
-
- 内部 ID、`record_id`、关联记录 ID、open_id 和编码字段用于连接或定位;交付输出使用用户可读的真实字段值,用户明确要求 ID 时一并展示。
|
|
17
|
-
- 每次读取必须做最小投影,并包含后续解释、回查或写入需要的业务 key。
|
|
18
|
-
|
|
19
|
-
## 1. Intent -> Tool Path
|
|
20
|
-
|
|
21
|
-
| 用户意图 | 首选路径 | 关键规则 |
|
|
22
|
-
| --- | --- | --- |
|
|
23
|
-
| 看几条、预览、示例 | `+record-list --limit N --field-id ...` | 保持局部语义 |
|
|
24
|
-
| 已知 `record_id` | `+record-get` | 直接读取 |
|
|
25
|
-
| 明确关键词 | `+record-search --keyword ... --search-field ... --field-id ...` | 必须显式指定 `--search-field`;可叠加 `--filter-json` |
|
|
26
|
-
| 按条件找原始记录 | `+record-list --filter-json ...` | `filter-json` 与视图筛选结构一致,支持文本、数字、日期、选项、人员、群组、关联等值 |
|
|
27
|
-
| 排序 / TopN 原始记录 | `+record-list --filter-json ... --sort-json ... --limit N` | 最高/最新用 `desc:true`,最低/最早用 `desc:false`;数组顺序表达优先级;最多 10 个排序条件 |
|
|
28
|
-
| 聚合 / 分组 / 分组排序 | `+data-query` | 读取 [data-query DSL reference](lark-base-data-query.md),使用 filters/dimensions/measures/sort/limit |
|
|
29
|
-
| 聚合后输出逐条记录 | `+data-query` 得到业务 key 或候选字段组合 -> `+record-list --filter-json` / `+record-get` 回查 | `+data-query` 维度行按字段组合去重且不返回 `record_id` |
|
|
30
|
-
| 多表 / 多跳关联 | 以候选数最小的事实表为驱动表,沿业务 key 或 Link 逐跳回查 | 读出 Link 单元格的 `id`(目标表 `record_id`)后,到被关联表批量 `+record-get` 展示字段 |
|
|
31
|
-
| 查询后写入 / 视图化 | 先用本 SOP 得到可复核的目标记录 id 集合 | 再进入记录写入或视图配置;高价值可复用查询可沉淀为持久视图 |
|
|
32
|
-
|
|
33
|
-
## 2. Execution Patterns
|
|
34
|
-
|
|
35
|
-
### 2.1 结构化原始记录与 TopN
|
|
36
|
-
|
|
37
|
-
使用 `+record-list` 的 filter/sort 路径:
|
|
38
|
-
|
|
39
|
-
1. `+field-list` 确认筛选字段、排序字段、展示字段、业务 key。
|
|
40
|
-
2. 筛选使用 `--filter-json '<filter-json>'`。
|
|
41
|
-
3. 排序用 `--sort-json`。
|
|
42
|
-
4. `--field-id` 做最小投影,`--limit` 控制返回数量。
|
|
43
|
-
|
|
44
|
-
Example: 结构化筛选 + TopN;示例展示文本包含、数字比较和 Select 集合相交三个常用谓词:
|
|
45
|
-
|
|
46
|
-
```bash
|
|
47
|
-
lark-cli base +record-list \
|
|
48
|
-
--base-token <base_token> \
|
|
49
|
-
--table-id <table_id> \
|
|
50
|
-
--filter-json '{"logic":"and","conditions":[["Title","intersects","Launch plan"],["Score",">=",80],["Status","intersects",["Doing"]]]}' \
|
|
51
|
-
--sort-json '[{"field":"Updated","desc":true}]' \
|
|
52
|
-
--field-id Name \
|
|
53
|
-
--field-id Title \
|
|
54
|
-
--field-id Score \
|
|
55
|
-
--limit 20
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
常用 `filter-json` condition fewshot 统一见 [Base Record 查询与分析 SOP](lark-base-record-query-and-analysis-sop.md);完整协议见 [Base Filter 条件结构](lark-base-filter-condition.md)。
|
|
59
|
-
|
|
60
|
-
`--sort-json` 传排序数组,数组顺序就是优先级,`desc:true` 为降序,`desc:false` 为升序,最多 10 个排序条件。
|
|
61
|
-
|
|
62
|
-
### 2.2 关键词检索后叠加结构化条件
|
|
63
|
-
|
|
64
|
-
使用 `+record-search` 做关键词命中,结构化条件仍用 `--filter-json` 下推:
|
|
65
|
-
|
|
66
|
-
```bash
|
|
67
|
-
lark-cli base +record-search \
|
|
68
|
-
--base-token <base_token> \
|
|
69
|
-
--table-id <table_id> \
|
|
70
|
-
--keyword Alice \
|
|
71
|
-
--search-field Name \
|
|
72
|
-
--filter-json '{"logic":"and","conditions":[["Status","intersects",["Doing"]]]}' \
|
|
73
|
-
--sort-json '[{"field":"Updated","desc":true}]' \
|
|
74
|
-
--field-id Name \
|
|
75
|
-
--field-id Status \
|
|
76
|
-
--limit 20
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
金额、状态、日期、空值和关联字段等结构化条件使用 `--filter-json`;`+record-search` 处理展示文本关键词。
|
|
80
|
-
|
|
81
|
-
### 2.3 聚合分析与 TopN
|
|
82
|
-
|
|
83
|
-
使用 `+data-query`:
|
|
84
|
-
|
|
85
|
-
- 让 Base 云端查询服务完成 filters、dimensions、measures、sort、pagination.limit。
|
|
86
|
-
- `pagination.limit` 是 Base 云端查询服务中的结果限制,不是本地分页扫描。
|
|
87
|
-
- 读取 [data-query DSL reference](lark-base-data-query.md) 中与当前查询有关的 fewshot、字段和协议。
|
|
88
|
-
- `+data-query` 可返回聚合结果或维度字段行;维度字段行按字段组合去重且不返回 `record_id`,不能当逐条原始记录结果使用。
|
|
89
|
-
- 需要输出逐条记录、记录定位或完整行级字段时,先用 `+data-query` 得到业务 key、分组值或候选字段组合,再用 `+record-list --filter-json` / `+record-get` 回查。
|
|
90
|
-
|
|
91
|
-
Example: 分组计数:
|
|
92
|
-
|
|
93
|
-
```bash
|
|
94
|
-
lark-cli base +data-query \
|
|
95
|
-
--base-token <base_token> \
|
|
96
|
-
--dsl '{"datasource":{"type":"table","table":{"tableId":"<table_id>"}},"dimensions":[{"field_name":"Status","alias":"status"}],"measures":[{"field_name":"Status","aggregation":"count","alias":"count"}],"shaper":{"format":"flat"}}'
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
Example: 汇总后取 TopN;需要过滤时按 `+data-query` 的 LiteQuery DSL reference 增加 `filters`:
|
|
100
|
-
|
|
101
|
-
```bash
|
|
102
|
-
lark-cli base +data-query \
|
|
103
|
-
--base-token <base_token> \
|
|
104
|
-
--dsl '{"datasource":{"type":"table","table":{"tableId":"<table_id>"}},"dimensions":[{"field_name":"Owner","alias":"owner"}],"measures":[{"field_name":"Amount","aggregation":"sum","alias":"total_amount"}],"sort":[{"field_name":"total_amount","order":"desc"}],"pagination":{"limit":10},"shaper":{"format":"flat"}}'
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
### 2.4 视图化与复用
|
|
108
|
-
|
|
109
|
-
一次性查询先用 `+record-list` / `+record-search` 的 filter/sort 验证。需要用户长期打开、共享或复用时,再把同一套 filter/sort 沉淀为视图。
|
|
110
|
-
|
|
111
|
-
Example: 将已验证的筛选排序写入视图:
|
|
112
|
-
|
|
113
|
-
```bash
|
|
114
|
-
lark-cli base +view-set-filter \
|
|
115
|
-
--base-token <base_token> \
|
|
116
|
-
--table-id <table_id> \
|
|
117
|
-
--view-id <view_id> \
|
|
118
|
-
--json '{"logic":"and","conditions":[["Priority","intersects",["P0"]]]}'
|
|
119
|
-
|
|
120
|
-
lark-cli base +view-set-sort \
|
|
121
|
-
--base-token <base_token> \
|
|
122
|
-
--table-id <table_id> \
|
|
123
|
-
--view-id <view_id> \
|
|
124
|
-
--json '{"sort_config":[{"field":"Priority","desc":true}]}'
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
手动配置和视图配置的优先级:
|
|
128
|
-
|
|
129
|
-
1. `--filter-json` 覆盖 `--view-id` 保存的 view filter JSON。
|
|
130
|
-
2. `--sort-json` 覆盖 `--view-id` 保存的 view sort config。
|
|
131
|
-
3. 没有手动 filter/sort 时,`--view-id` 使用视图自身保存的 filter/sort。
|
|
132
|
-
|
|
133
|
-
### 2.5 关系查询与回查
|
|
134
|
-
|
|
135
|
-
- Link 单元格中的元素形如 `{"id":"rec_xxx"}`;`id` 是目标表的 `record_id`,用于关系连接。
|
|
136
|
-
- 先用 `+field-list` 确认 link 字段的 `link_table`、业务唯一键和展示字段。
|
|
137
|
-
- 从驱动表拿到候选记录后,用 Link 元素的 `id` 到目标表 `+record-get` 批量读取记录内容。
|
|
138
|
-
- 多跳关系逐跳建立 `record_id/key -> 用户可读字段` 映射,交付目标表返回的真实业务字段。
|
|
139
|
-
|
|
140
|
-
## 3. Range & Pagination Contract
|
|
141
|
-
|
|
142
|
-
- `+record-list` 默认页、固定 `--limit` 和手工浏览输出都只覆盖已读取范围;模型上下文接收云端收敛后的最终小结果。
|
|
143
|
-
- `has_more=true` 说明可能还有未读取数据,需要更新 offset 后继续读取,多次读取仍未读取完成时,采用其他方法完成任务需求,避免无限循环。
|
|
144
|
-
- 对全局问题,只有 Base 云端查询服务已经通过 filter/sort/aggregate 收敛目标范围,或 `+data-query` 已在云端完成聚合、排序和限制时,才可以用有限返回形成结论。
|
|
145
|
-
- 需要完整原始记录但云端能力无法把结果安全收敛到可返回范围时,明确说明能力边界;不要用手工分页、拆分下载或采样伪装成全局分析。
|