@amaster.ai/pi-lark 0.1.14 → 0.1.16
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/package.json +4 -4
- package/skills/lark-apps/SKILL.md +1 -0
- package/skills/lark-apps/references/lark-apps-db.md +2 -0
- package/skills/lark-apps/references/lark-apps-env-pull.md +1 -1
- package/skills/lark-apps/references/lark-apps-env.md +1 -1
- package/skills/lark-apps/references/lark-apps-export.md +62 -0
- package/skills/lark-apps/references/lark-apps-local-dev.md +1 -1
- package/skills/lark-apps/references/lark-apps-observability.md +1 -1
- package/skills/lark-base/SKILL.md +6 -5
- package/skills/lark-base/references/lark-base-app.md +3 -3
- package/skills/lark-base/references/lark-base-dashboard-block-config.md +21 -3
- package/skills/lark-base/references/lark-base-dashboard.md +1 -1
- package/skills/lark-base/references/lark-base-data-query.md +1 -1
- package/skills/lark-base/references/lark-base-field-create.md +1 -1
- package/skills/lark-base/references/lark-base-field-update.md +1 -1
- package/skills/lark-base/references/lark-base-form-questions-create.md +1 -1
- package/skills/lark-base/references/lark-base-form-questions-update.md +1 -1
- package/skills/lark-base/references/lark-base-form-submit.md +1 -1
- package/skills/lark-base/references/lark-base-view-set-filter.md +1 -1
- package/skills/lark-base/references/lark-base-view.md +109 -0
- package/skills/lark-base/references/lark-base-workflow-schema.md +90 -12
- package/skills/lark-base/references/lark-base-workflow.md +99 -3
- package/skills/lark-calendar/SKILL.md +13 -8
- package/skills/lark-calendar/references/lark-calendar-meeting-relation.md +99 -0
- package/skills/lark-calendar/references/lark-calendar-meeting.md +1 -1
- package/skills/lark-calendar/references/lark-calendar-recurring.md +3 -1
- package/skills/lark-calendar/references/lark-calendar-transfer.md +1 -1
- package/skills/lark-doc/SKILL.md +1 -1
- package/skills/lark-doc/references/lark-doc-create-workflow.md +8 -10
- package/skills/lark-doc/references/lark-doc-media-download.md +1 -1
- package/skills/lark-doc/references/lark-doc-media-insert.md +1 -1
- package/skills/lark-doc/references/lark-doc-media-preview.md +1 -1
- package/skills/lark-doc/references/lark-doc-resource-cover.md +1 -1
- package/skills/lark-doc/references/lark-doc-script.md +11 -17
- package/skills/lark-drive/references/lark-drive-add-comment.md +1 -1
- package/skills/lark-drive/references/lark-drive-apply-permission.md +1 -1
- package/skills/lark-drive/references/lark-drive-copy.md +1 -1
- package/skills/lark-drive/references/lark-drive-cover.md +1 -1
- package/skills/lark-drive/references/lark-drive-create-folder.md +1 -1
- package/skills/lark-drive/references/lark-drive-create-shortcut.md +1 -1
- package/skills/lark-drive/references/lark-drive-delete.md +1 -1
- package/skills/lark-drive/references/lark-drive-download.md +1 -1
- package/skills/lark-drive/references/lark-drive-export-download.md +1 -1
- package/skills/lark-drive/references/lark-drive-export.md +1 -1
- package/skills/lark-drive/references/lark-drive-import.md +1 -1
- package/skills/lark-drive/references/lark-drive-inspect.md +2 -2
- package/skills/lark-drive/references/lark-drive-list-comments.md +1 -1
- package/skills/lark-drive/references/lark-drive-move.md +4 -4
- package/skills/lark-drive/references/lark-drive-permission-guide.md +1 -1
- package/skills/lark-drive/references/lark-drive-preview.md +1 -1
- package/skills/lark-drive/references/lark-drive-pull.md +1 -1
- package/skills/lark-drive/references/lark-drive-push.md +1 -1
- package/skills/lark-drive/references/lark-drive-search.md +1 -1
- package/skills/lark-drive/references/lark-drive-status.md +1 -1
- package/skills/lark-drive/references/lark-drive-task-result.md +4 -4
- package/skills/lark-drive/references/lark-drive-update-title.md +1 -1
- package/skills/lark-drive/references/lark-drive-upload.md +1 -1
- package/skills/lark-drive/references/lark-drive-version-delete.md +1 -1
- package/skills/lark-drive/references/lark-drive-version-get.md +1 -1
- package/skills/lark-drive/references/lark-drive-version-history.md +1 -1
- package/skills/lark-drive/references/lark-drive-version-revert.md +1 -1
- package/skills/lark-drive/references/lark-drive-workflow-topic-move-collector-execute.md +1 -1
- package/skills/lark-im/SKILL.md +7 -1
- package/skills/lark-im/references/lark-im-chat-create.md +1 -1
- package/skills/lark-im/references/lark-im-chat-list.md +1 -1
- package/skills/lark-im/references/lark-im-chat-members-list.md +1 -1
- package/skills/lark-im/references/lark-im-chat-messages-list.md +7 -2
- package/skills/lark-im/references/lark-im-chat-search.md +1 -1
- package/skills/lark-im/references/lark-im-chat-update.md +1 -1
- package/skills/lark-im/references/lark-im-feed-groups.md +1 -1
- package/skills/lark-im/references/lark-im-feed-shortcut-create.md +1 -1
- package/skills/lark-im/references/lark-im-feed-shortcut-list.md +1 -1
- package/skills/lark-im/references/lark-im-feed-shortcut-remove.md +1 -1
- package/skills/lark-im/references/lark-im-flag-cancel.md +1 -1
- package/skills/lark-im/references/lark-im-flag-create.md +1 -1
- package/skills/lark-im/references/lark-im-flag-list.md +1 -1
- package/skills/lark-im/references/lark-im-message-enrichment.md +1 -1
- package/skills/lark-im/references/lark-im-message-read-status.md +1 -1
- package/skills/lark-im/references/lark-im-messages-edit.md +1 -1
- package/skills/lark-im/references/lark-im-messages-mget.md +20 -3
- package/skills/lark-im/references/lark-im-messages-reply.md +1 -1
- package/skills/lark-im/references/lark-im-messages-resources-download.md +3 -1
- package/skills/lark-im/references/lark-im-messages-search.md +2 -2
- package/skills/lark-im/references/lark-im-messages-send.md +1 -1
- package/skills/lark-im/references/lark-im-reactions.md +1 -1
- package/skills/lark-im/references/lark-im-threads-messages-list.md +6 -2
- package/skills/lark-mail/SKILL.md +19 -8
- package/skills/lark-mail/references/lark-mail-draft-create.md +1 -1
- package/skills/lark-mail/references/lark-mail-draft-edit.md +1 -1
- package/skills/lark-mail/references/lark-mail-forward.md +1 -1
- package/skills/lark-mail/references/lark-mail-reply-all.md +1 -1
- package/skills/lark-mail/references/lark-mail-reply.md +1 -1
- package/skills/lark-mail/references/lark-mail-rules.md +87 -4
- package/skills/lark-mail/references/lark-mail-send.md +1 -1
- package/skills/lark-mail/references/lark-mail-thread-modify.md +73 -0
- package/skills/lark-mail/references/lark-mail-thread-trash.md +62 -0
- package/skills/lark-mail/references/lark-mail-triage.md +1 -1
- package/skills/lark-mail/references/lark-mail-watch.md +2 -2
- package/skills/lark-markdown/references/lark-markdown-create.md +1 -1
- package/skills/lark-markdown/references/lark-markdown-diff.md +1 -1
- package/skills/lark-markdown/references/lark-markdown-fetch.md +1 -1
- package/skills/lark-markdown/references/lark-markdown-overwrite.md +1 -1
- package/skills/lark-markdown/references/lark-markdown-patch.md +1 -1
- package/skills/lark-meeting/SKILL.md +2 -2
- package/skills/lark-meeting/references/lark-minutes-search.md +2 -2
- package/skills/lark-meeting/references/lark-vc-meeting-events.md +15 -15
- package/skills/lark-meeting/references/lark-vc-search.md +10 -7
- package/skills/lark-meeting/scenes/create-and-edit-minutes.md +4 -0
- package/skills/lark-meeting/scenes/live-meeting-attend.md +2 -2
- package/skills/lark-meeting/scenes/live-meeting-interact.md +1 -1
- package/skills/lark-meeting/scenes/query-meeting-and-artifacts.md +3 -3
- package/skills/lark-shared/references/lark-wiki-token-routing.md +7 -7
- package/skills/lark-sheets/SKILL.md +60 -173
- package/skills/lark-sheets/references/lark-sheets-batch-update.md +10 -10
- package/skills/lark-sheets/references/lark-sheets-chart.md +68 -34
- package/skills/lark-sheets/references/lark-sheets-conditional-format.md +4 -4
- package/skills/lark-sheets/references/lark-sheets-filter-view.md +1 -1
- package/skills/lark-sheets/references/lark-sheets-filter.md +2 -2
- package/skills/lark-sheets/references/lark-sheets-float-image.md +2 -2
- package/skills/lark-sheets/references/lark-sheets-formula-translation.md +90 -4
- package/skills/lark-sheets/references/lark-sheets-formula-verify.md +49 -13
- package/skills/lark-sheets/references/lark-sheets-pivot-table.md +13 -13
- package/skills/lark-sheets/references/lark-sheets-range-operations.md +12 -9
- package/skills/lark-sheets/references/lark-sheets-read-data.md +14 -12
- package/skills/lark-sheets/references/lark-sheets-search-replace.md +3 -3
- package/skills/lark-sheets/references/lark-sheets-sheet-structure.md +8 -4
- package/skills/lark-sheets/references/lark-sheets-sparkline.md +2 -2
- package/skills/lark-sheets/references/lark-sheets-styles-put.md +2 -2
- package/skills/lark-sheets/references/lark-sheets-visual-standards.md +22 -19
- package/skills/lark-sheets/references/lark-sheets-workbook.md +22 -7
- package/skills/lark-sheets/references/lark-sheets-write-cells.md +66 -57
- package/skills/lark-sheets/scripts/lark_chart_quality_check.py +1540 -0
- package/skills/lark-sheets/scripts/lark_chart_size_advisor.py +409 -0
- package/skills/lark-sheets/scripts/lark_chart_size_rules.py +292 -0
- package/skills/lark-sheets/scripts/lark_inspect_workbook.py +37 -9
- package/skills/lark-sheets/scripts/lark_sheet_read_cli.py +53 -0
- package/skills/lark-sheets/scripts/{sheets_df.py → lark_sheets_df.py} +1 -1
- package/skills/lark-slides/SKILL.md +11 -18
- package/skills/lark-slides/references/cli/lark-slides-add-slide.md +1 -1
- package/skills/lark-slides/references/cli/lark-slides-create.md +3 -3
- package/skills/lark-slides/references/cli/lark-slides-delete-slide.md +1 -1
- package/skills/lark-slides/references/cli/lark-slides-history.md +1 -8
- package/skills/lark-slides/references/cli/lark-slides-media-upload.md +6 -11
- package/skills/lark-slides/references/cli/lark-slides-replace-slide.md +15 -16
- package/skills/lark-slides/references/cli/lark-slides-update-slide.md +2 -2
- package/skills/lark-slides/references/cli/lark-slides-xml-presentation-slide-get.md +3 -108
- package/skills/lark-slides/references/cli/lark-slides-xml-presentation-slide-replace.md +6 -183
- package/skills/lark-slides/references/cli/lark-slides-xml-presentations-get.md +26 -143
- package/skills/lark-slides/references/lark-slides-xml-presentation-slide-get.md +3 -3
- package/skills/lark-slides/references/lark-slides-xml-presentation-slide-replace.md +2 -2
- package/skills/lark-slides/references/lark-slides-xml-presentations-get.md +2 -2
- package/skills/lark-slides/references/workflow/error-handling.md +3 -3
- package/skills/lark-slides/references/workflow/slides-editing.md +10 -11
- package/skills/lark-slides/references/xml/slides_xml_schema_definition.xml +333 -20
- package/skills/lark-task/references/lark-task-assign.md +1 -1
- package/skills/lark-task/references/lark-task-comment.md +1 -1
- package/skills/lark-task/references/lark-task-complete.md +1 -1
- package/skills/lark-task/references/lark-task-create.md +1 -1
- package/skills/lark-task/references/lark-task-followers.md +1 -1
- package/skills/lark-task/references/lark-task-get-my-tasks.md +1 -1
- package/skills/lark-task/references/lark-task-get-related-tasks.md +1 -1
- package/skills/lark-task/references/lark-task-reminder.md +1 -1
- package/skills/lark-task/references/lark-task-reopen.md +1 -1
- package/skills/lark-task/references/lark-task-search.md +1 -1
- package/skills/lark-task/references/lark-task-set-ancestor.md +1 -1
- package/skills/lark-task/references/lark-task-tasklist-create.md +1 -1
- package/skills/lark-task/references/lark-task-tasklist-members.md +1 -1
- package/skills/lark-task/references/lark-task-tasklist-search.md +1 -1
- package/skills/lark-task/references/lark-task-tasklist-task-add.md +1 -1
- package/skills/lark-task/references/lark-task-update.md +1 -1
- package/skills/lark-task/references/lark-task-upload-attachment.md +1 -1
- package/skills/lark-wiki/SKILL.md +1 -2
- package/skills/lark-wiki/references/lark-wiki-delete-space.md +1 -1
- package/skills/lark-wiki/references/lark-wiki-move-to-drive.md +1 -1
- package/skills/lark-wiki/references/lark-wiki-move.md +4 -3
- package/skills/lark-wiki/references/lark-wiki-node-create.md +4 -3
- package/skills/lark-wiki/references/lark-wiki-node-delete.md +8 -4
- package/skills/lark-wiki/references/lark-wiki-node-get.md +7 -4
- package/skills/lark-sheets/references/lark-sheets-legacy-command-migration.md +0 -152
- package/skills/lark-sheets/scripts/lark_chart_layout_check.py +0 -472
|
@@ -15,11 +15,14 @@ from lark_sheet_read_cli import (
|
|
|
15
15
|
emit_error,
|
|
16
16
|
emit_success,
|
|
17
17
|
envelope_data,
|
|
18
|
+
is_grid_sheet,
|
|
18
19
|
resolve_target_sheets,
|
|
19
20
|
run_sheets,
|
|
20
21
|
sheet_identifier,
|
|
21
22
|
sheet_locator,
|
|
23
|
+
sheet_resource_type,
|
|
22
24
|
sheet_title,
|
|
25
|
+
visible_grid_selection,
|
|
23
26
|
)
|
|
24
27
|
|
|
25
28
|
ACTION = "inspect_workbook"
|
|
@@ -31,6 +34,7 @@ def _sheet_summary(sheet: dict[str, Any]) -> dict[str, Any]:
|
|
|
31
34
|
"sheet_id": sheet_identifier(sheet),
|
|
32
35
|
"title": sheet_title(sheet),
|
|
33
36
|
"index": sheet.get("index"),
|
|
37
|
+
"resource_type": sheet_resource_type(sheet),
|
|
34
38
|
"row_count": sheet.get("row_count"),
|
|
35
39
|
"column_count": sheet.get("column_count"),
|
|
36
40
|
"is_hidden": sheet.get("is_hidden"),
|
|
@@ -78,29 +82,53 @@ def inspect_workbook(args) -> tuple[dict[str, Any], list[str]]:
|
|
|
78
82
|
# An explicit selector must resolve: without require_one a typo'd
|
|
79
83
|
# --sheet-id/--sheet-name silently yields sheet_count 0, which reads as
|
|
80
84
|
# "empty workbook" instead of a locator error.
|
|
85
|
+
selection = visible_grid_selection(workbook, sheet_id=args.sheet_id, sheet_name=args.sheet_name)
|
|
86
|
+
all_sheets = resolve_target_sheets(workbook)
|
|
81
87
|
target_sheets = resolve_target_sheets(
|
|
82
88
|
workbook,
|
|
83
89
|
sheet_id=args.sheet_id,
|
|
84
90
|
sheet_name=args.sheet_name,
|
|
85
91
|
require_one=bool(args.sheet_id or args.sheet_name),
|
|
86
92
|
)
|
|
93
|
+
preview_targets = target_sheets
|
|
94
|
+
if not args.sheet_id and not args.sheet_name:
|
|
95
|
+
# is_hidden 缺失不等于隐藏:预览只是只读预检,除显式 is_hidden=true 外一律纳入,
|
|
96
|
+
# 否则旧 payload 会静默退化成「只有 summary、零预览」。写入侧的保守可见性判定
|
|
97
|
+
# 仍由 selection 负责(visibility_unknown 在那里照样排除)。
|
|
98
|
+
preview_targets = [sheet for sheet in all_sheets if is_grid_sheet(sheet) and sheet.get("is_hidden") is not True]
|
|
87
99
|
if args.max_sheets < 1:
|
|
88
100
|
raise LarkCliError("--max-sheets must be at least 1")
|
|
89
|
-
inspect_count = len(
|
|
90
|
-
if
|
|
91
|
-
|
|
92
|
-
|
|
101
|
+
inspect_count = min(len(preview_targets), args.max_sheets)
|
|
102
|
+
if inspect_count < len(preview_targets):
|
|
103
|
+
warnings.append(
|
|
104
|
+
f"layout and preview skipped for {len(preview_targets) - inspect_count} visible grid sheets; "
|
|
105
|
+
"pass --sheet-id or --sheet-name to inspect one"
|
|
106
|
+
)
|
|
107
|
+
if not preview_targets and all_sheets:
|
|
108
|
+
if any(is_grid_sheet(sheet) for sheet in all_sheets):
|
|
109
|
+
warnings.append(
|
|
110
|
+
"no previewable grid sheet: every grid sheet is explicitly hidden; "
|
|
111
|
+
"pass --sheet-id or --sheet-name to inspect one anyway"
|
|
112
|
+
)
|
|
113
|
+
else:
|
|
114
|
+
# 非网格子表在 visible_grid_selection 里会被显式拒绝,别提示「带 selector 重跑」
|
|
115
|
+
# ——照做必然拿到 "is not a grid sheet",恢复动作等于死路。
|
|
93
116
|
warnings.append(
|
|
94
|
-
|
|
95
|
-
|
|
117
|
+
"no grid sheet in this workbook: every sheet is non-grid; "
|
|
118
|
+
"read it through the matching product API instead of the grid read/write path"
|
|
96
119
|
)
|
|
120
|
+
# 按对象身份而非 sheet_id 圈定预览集合:payload 缺 sheet_id 时 sheet_identifier 全为
|
|
121
|
+
# 空串,用 id 集合会把所有子表折叠成同一个 key,--max-sheets 直接失效(照样逐表发
|
|
122
|
+
# +sheet-info / +csv-get)。all_sheets 与 preview_targets 取自同一份 workbook,元素是
|
|
123
|
+
# 同一批 dict 实例,id() 比较安全。
|
|
124
|
+
preview_marks = {id(sheet) for sheet in preview_targets[:inspect_count]}
|
|
97
125
|
|
|
98
126
|
profiles = []
|
|
99
|
-
for
|
|
127
|
+
for sheet in all_sheets:
|
|
100
128
|
sid = sheet_identifier(sheet)
|
|
101
129
|
title = sheet_title(sheet)
|
|
102
130
|
profile = _sheet_summary(sheet)
|
|
103
|
-
if
|
|
131
|
+
if id(sheet) not in preview_marks:
|
|
104
132
|
profiles.append(profile)
|
|
105
133
|
continue
|
|
106
134
|
locator = sheet_locator(sheet)
|
|
@@ -165,7 +193,7 @@ def inspect_workbook(args) -> tuple[dict[str, Any], list[str]]:
|
|
|
165
193
|
}
|
|
166
194
|
)
|
|
167
195
|
|
|
168
|
-
return {"sheet_count": len(
|
|
196
|
+
return {"sheet_count": len(all_sheets), "sheets": profiles, "selection": selection}, warnings
|
|
169
197
|
|
|
170
198
|
|
|
171
199
|
def main() -> None:
|
|
@@ -160,6 +160,59 @@ def extract_sheets(workbook_data: dict[str, Any]) -> list[dict[str, Any]]:
|
|
|
160
160
|
return []
|
|
161
161
|
|
|
162
162
|
|
|
163
|
+
def sheet_resource_type(sheet: dict[str, Any]) -> str:
|
|
164
|
+
return str(sheet.get("resource_type") or "")
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def is_grid_sheet(sheet: dict[str, Any]) -> bool:
|
|
168
|
+
resource_type = sheet_resource_type(sheet)
|
|
169
|
+
if resource_type == "sheet":
|
|
170
|
+
return True
|
|
171
|
+
# Legacy responses may omit resource_type but still include grid dimensions.
|
|
172
|
+
return not resource_type and sheet.get("row_count") is not None and sheet.get("column_count") is not None
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def visible_grid_selection(
|
|
176
|
+
workbook_data: dict[str, Any],
|
|
177
|
+
*,
|
|
178
|
+
sheet_id: str | None = None,
|
|
179
|
+
sheet_name: str | None = None,
|
|
180
|
+
) -> dict[str, Any]:
|
|
181
|
+
"""Resolve explicit targets or publish a safe default-selection decision.
|
|
182
|
+
|
|
183
|
+
Unspecified targets are never selected by index: only visible ordinary grids
|
|
184
|
+
participate, and multiple candidates remain ambiguous for the caller to match
|
|
185
|
+
by task wording or ask the user.
|
|
186
|
+
"""
|
|
187
|
+
sheets = extract_sheets(workbook_data)
|
|
188
|
+
specified = {"sheet_id": sheet_id, "sheet_name": sheet_name}
|
|
189
|
+
if sheet_id or sheet_name:
|
|
190
|
+
matches = resolve_target_sheets(workbook_data, sheet_id=sheet_id, sheet_name=sheet_name, require_one=True)
|
|
191
|
+
sheet = matches[0]
|
|
192
|
+
if not is_grid_sheet(sheet):
|
|
193
|
+
raise LarkCliError(f"Sheet {sheet_title(sheet) or sheet_identifier(sheet)} is not a grid sheet; use the matching product API")
|
|
194
|
+
warnings = ["explicit_hidden_sheet"] if sheet.get("is_hidden") is True else []
|
|
195
|
+
return {"policy": "visible_grid_v1", "specified": specified, "selected": _selection_sheet(sheet), "candidates": [_selection_sheet(sheet)], "excluded": [], "ambiguous": False, "warnings": warnings, "next_action": "use selected sheet_id for grid read/write"}
|
|
196
|
+
|
|
197
|
+
candidates, excluded = [], []
|
|
198
|
+
for sheet in sheets:
|
|
199
|
+
if not is_grid_sheet(sheet):
|
|
200
|
+
excluded.append({**_selection_sheet(sheet), "reason": "non_grid"})
|
|
201
|
+
elif sheet.get("is_hidden") is True:
|
|
202
|
+
excluded.append({**_selection_sheet(sheet), "reason": "hidden"})
|
|
203
|
+
elif sheet.get("is_hidden") is not False:
|
|
204
|
+
excluded.append({**_selection_sheet(sheet), "reason": "visibility_unknown"})
|
|
205
|
+
else:
|
|
206
|
+
candidates.append(_selection_sheet(sheet))
|
|
207
|
+
candidates.sort(key=lambda item: item.get("index") if isinstance(item.get("index"), int) else 10**9)
|
|
208
|
+
selected = candidates[0] if len(candidates) == 1 else None
|
|
209
|
+
return {"policy": "visible_grid_v1", "specified": specified, "selected": selected, "candidates": candidates, "excluded": excluded, "ambiguous": len(candidates) > 1, "warnings": [], "next_action": "use selected sheet_id for grid read/write" if selected else "match task wording/title/header; do not choose by index"}
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
def _selection_sheet(sheet: dict[str, Any]) -> dict[str, Any]:
|
|
213
|
+
return {"sheet_id": sheet_identifier(sheet), "title": sheet_title(sheet), "index": sheet.get("index"), "resource_type": sheet_resource_type(sheet) or "legacy_grid", "is_hidden": sheet.get("is_hidden"), "row_count": sheet.get("row_count"), "column_count": sheet.get("column_count")}
|
|
214
|
+
|
|
215
|
+
|
|
163
216
|
def resolve_target_sheets(
|
|
164
217
|
workbook_data: dict[str, Any],
|
|
165
218
|
*,
|
|
@@ -8,7 +8,7 @@ This is the same 7-line snippet the skill docs already inline (see
|
|
|
8
8
|
`lark-sheets-read-data` "输出 → DataFrame(2 行 helper)"), pulled out
|
|
9
9
|
so callers can `import` it instead of copy-pasting:
|
|
10
10
|
|
|
11
|
-
from
|
|
11
|
+
from lark_sheets_df import df_to_sheet, sheet_to_df
|
|
12
12
|
|
|
13
13
|
Callers run lark-cli themselves; this file is a library, not a CLI.
|
|
14
14
|
"""
|
|
@@ -85,7 +85,7 @@ metadata:
|
|
|
85
85
|
| 一页改动很多(批量字体/配色)、要改页面背景、要删掉若干元素 | 整页覆盖,`slide_id` 和页序不变;带原 `id` 写回的元素保留 id,不带 `id` 的会作为新元素插入并拿到新 id;**代价是没写进 `--content` 的元素会被删除,所以改个别元素不要用它** | `slides +update-slide`、`lark-slides-update-slide.md` |
|
|
86
86
|
| 给已有 PPT 追加或插入页面 | 一次一页,`--slide` 支持 `@file` 绕开 shell 转义 | `slides +add-slide`、`cli/lark-slides-add-slide.md` |
|
|
87
87
|
| 删除页面 | 按 `slide_id` 单页删除,删前先回读确认 | `slides +delete-slide`、`cli/lark-slides-delete-slide.md` |
|
|
88
|
-
| 读取或分析已有 PPT | 解析 slides/wiki token,用 shortcut
|
|
88
|
+
| 读取或分析已有 PPT | 解析 slides/wiki token,用 shortcut 回读全文或单页 XML,保存 `xml_presentation_id`、`slide_id`、`revision_id` | `slides +xml-get`(单页传 `--slide-id` 或 `--slide-number`)、`cli/lark-slides-xml-presentations-get.md` |
|
|
89
89
|
| 查看或回滚历史版本 | 先用 `+history-list` 找 `history_version_id`,再 `+history-revert`,必要时 `+history-revert-status` 轮询 | [`cli/lark-slides-history.md`](references/cli/lark-slides-history.md) |
|
|
90
90
|
| 获取幻灯片页面截图 | 按页码用 `--slide-number`,按 ID 用 `--slide-id`;单张用 `--output`,批量或全量用 `--output-dir`,每批最多 10 页串行执行;截图目录复用同一任务的 deck/task 标识,后续读取返回的实际路径 | `slides +screenshot`、`cli/lark-slides-screenshot.md` |
|
|
91
91
|
| 下载图片 | `--output` 选填;传入时指定单个文件路径,未传时自动保存到默认目录 `.lark-slides/media`,并按响应文件名/类型生成路径;调用后读取返回的 `path`,不要猜测文件名;直连被拒时自动回退到源文件预览 | `slides +media-download --file-token <file_token>` |
|
|
@@ -250,11 +250,11 @@ N. 结尾页:[结尾文案]
|
|
|
250
250
|
| `/slides/` | `https://example.larkoffice.com/slides/xxxxxxxxxxxxx` | `xml_presentation_id` | URL 路径中的 token 直接作为 `xml_presentation_id` 使用 |
|
|
251
251
|
| `/wiki/` | `https://xxx.feishu.cn/wiki/wikcn_EXAMPLE_NODE_TOKEN_123456` | `wiki_token` | ⚠️ **不能直接使用**,需要先查询获取真实的 `obj_token` |
|
|
252
252
|
|
|
253
|
-
> 带 `--presentation` 的 slides shortcut
|
|
253
|
+
> 带 `--presentation` 的 slides shortcut 会自动解析以上两种 URL。
|
|
254
254
|
|
|
255
255
|
### Wiki 链接特殊处理(关键!)
|
|
256
256
|
|
|
257
|
-
知识库链接(`/wiki/TOKEN`)不能直接当 `xml_presentation_id
|
|
257
|
+
知识库链接(`/wiki/TOKEN`)不能直接当 `xml_presentation_id`。使用 Slides shortcut 时直接传入链接,CLI 会查询节点、校验 `data.obj_type == "slides"` 并使用 `data.obj_token`。
|
|
258
258
|
|
|
259
259
|
```bash
|
|
260
260
|
lark-cli wiki +node-get --node-token 'https://xxx.feishu.cn/wiki/wikcn_EXAMPLE_NODE_TOKEN_123456' --as user --format json
|
|
@@ -262,7 +262,7 @@ lark-cli wiki +node-get --node-token 'https://xxx.feishu.cn/wiki/wikcn_EXAMPLE_N
|
|
|
262
262
|
|
|
263
263
|
节点解析必须与后续 Slides 操作使用相同身份;下游明确使用 `--as bot` 时,这里也改为 `--as bot`。
|
|
264
264
|
|
|
265
|
-
带 `--presentation` 的 slides shortcut 都会自动解析 `/wiki/` URL 并校验 `obj_type
|
|
265
|
+
带 `--presentation` 的 slides shortcut 都会自动解析 `/wiki/` URL 并校验 `obj_type`。
|
|
266
266
|
|
|
267
267
|
### 资源关系
|
|
268
268
|
|
|
@@ -278,30 +278,23 @@ Slides (演示文稿)
|
|
|
278
278
|
└── slide_id (页面唯一标识)
|
|
279
279
|
```
|
|
280
280
|
|
|
281
|
-
## Shortcuts
|
|
281
|
+
## Shortcuts
|
|
282
282
|
|
|
283
|
-
|
|
283
|
+
Slides 相关操作使用 shortcut(`lark-cli slides +<verb> [flags]`)。
|
|
284
284
|
|
|
285
285
|
| Shortcut | 说明 |
|
|
286
286
|
|----------|------|
|
|
287
287
|
| [`+create`](references/cli/lark-slides-create.md) | 创建 PPT,可选一步添加页面 |
|
|
288
288
|
| [`+add-slide`](references/cli/lark-slides-add-slide.md) | 向已有演示文稿追加或插入**一页**(`--before-slide-id` 控制位置),XML 支持 `@file` / stdin,`<img src="@./path">` 占位符自动上传 |
|
|
289
289
|
| [`+delete-slide`](references/cli/lark-slides-delete-slide.md) | 按 `slide_id` 删除**一页** |
|
|
290
|
-
| [`+xml-get`](references/cli/lark-slides-xml-presentations-get.md) |
|
|
290
|
+
| [`+xml-get`](references/cli/lark-slides-xml-presentations-get.md) | 读取全文或单页 XML;用 `--presentation` 指定演示文稿,单页传 `--slide-id` 或 `--slide-number`;用 `--output` 把 XML 存到本地文件(必须是 CWD 内的相对路径,如 `.lark-slides/plan/<deck>/readback.xml`) |
|
|
291
291
|
| [`+screenshot`](references/cli/lark-slides-screenshot.md) | 把幻灯片页面截图保存为本地图片;用 `--slide-number` 指定页码(从 1 开始,多页重复传入)或用 `--slide-id` 指定页面;单张用 `--output .lark-slides/screenshots/<deck-or-task-id>/page-01`,批量用 `--output-dir .lark-slides/screenshots/<deck-or-task-id>`(一次最多 10 页);后续必须读取返回的 `output` / `screenshots[].path` |
|
|
292
292
|
| [`+media-upload`](references/cli/lark-slides-media-upload.md) | 上传本地图片到指定演示文稿,返回 `file_token`(用作 `<img src="...">`),最大 20 MB |
|
|
293
293
|
| `+media-download` | 根据 Slides 图片 `file_token` 下载本地图片;`--output` 选填,未传时使用 `--output-dir` 默认值 `.lark-slides/media` 并自动生成文件名;调用后使用返回的 `path`,不要猜测实际路径;直连下载无权限时自动回退到源文件预览 |
|
|
294
294
|
| [`+replace-slide`](references/cli/lark-slides-replace-slide.md) | 对已有幻灯片页面进行块级替换/插入(`block_replace` / `block_insert`),自动注入 id 和 `<content/>`,不改变页序 |
|
|
295
295
|
| [`+update-slide`](references/cli/lark-slides-update-slide.md) | 把一整页 XML 交给已有页面,页面变成 `--content` 描述的样子;能一次改样式/插入/删除/备注/背景,`slide_id` 和页序不变。**没写进 `--content` 的元素会被删除** |
|
|
296
296
|
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
```bash
|
|
300
|
-
lark-cli schema slides.<resource>.<method> # 调用 API 前必须先查看参数结构
|
|
301
|
-
lark-cli slides <resource> <method> [flags] # 调用 API
|
|
302
|
-
```
|
|
303
|
-
|
|
304
|
-
> **重要**:使用原生 API 时,必须先运行 `schema` 查看 `--data` / `--params` 参数结构,不要猜测字段格式。
|
|
297
|
+
本 skill 已覆盖的 Slides 操作必须使用上表 shortcut;执行前读取对应 reference,按其中参数和约束执行。
|
|
305
298
|
|
|
306
299
|
## 核心规则
|
|
307
300
|
|
|
@@ -311,7 +304,7 @@ lark-cli slides <resource> <method> [flags] # 调用 API
|
|
|
311
304
|
4. **文本通过 `<content>` 表达**:必须用 `<content><p>...</p></content>`,不能把文字直接写在 shape 内;不要混淆 XML 元素 `<content>` 和 `--parts` 的 JSON 字段:编写 `--parts` 时,`block_replace` 装载 XML 使用标准字段 `replacement`,`block_insert` 使用 `insertion`
|
|
312
305
|
5. **保存关键 ID**:后续操作需要 `xml_presentation_id`、`slide_id`、`revision_id`
|
|
313
306
|
6. **删除谨慎**:删除不可逆,删前先回读确认 `slide_id`
|
|
314
|
-
7. **编辑已有页面优先原链接更新**:修改单个 shape/img 用 `+replace-slide`(`block_replace` / `block_insert`),不要整页重建;一页改动很多或要改背景用 `+update-slide` 整页覆盖(保 `slide_id`
|
|
315
|
-
8. **`<img src>` 只能用上传到飞书 drive 的 `file_token`,禁止使用 http(s) 外链 URL**:飞书 slides 渲染端不会代理外链图片,外链 src 在 PPT 里通常不显示或显示破图。流程必须是「先把图存到本地 → 用 `slides +media-upload` 上传,或在 `+create --slides` 的 XML 里写 `<img src="@./path">` 占位符自动上传 → 拿 `file_token` 写进 `<img src>`」。如果用户给了网图链接,先 `curl`/下载到 CWD 内再走上传流程,不要直接把外链 URL 塞进 `src`。**图片最大 20 MB
|
|
307
|
+
7. **编辑已有页面优先原链接更新**:修改单个 shape/img 用 `+replace-slide`(`block_replace` / `block_insert`),不要整页重建;一页改动很多或要改背景用 `+update-slide` 整页覆盖(保 `slide_id` 和页序),多页整页重建就对每一页各跑一次 `+update-slide`,不要用 `slides +create` 新建整份 PPT;追加/插入单页用 `+add-slide`、删除单页用 `+delete-slide`
|
|
308
|
+
8. **`<img src>` 只能用上传到飞书 drive 的 `file_token`,禁止使用 http(s) 外链 URL**:飞书 slides 渲染端不会代理外链图片,外链 src 在 PPT 里通常不显示或显示破图。流程必须是「先把图存到本地 → 用 `slides +media-upload` 上传,或在 `+create --slides` 的 XML 里写 `<img src="@./path">` 占位符自动上传 → 拿 `file_token` 写进 `<img src>`」。如果用户给了网图链接,先 `curl`/下载到 CWD 内再走上传流程,不要直接把外链 URL 塞进 `src`。**图片最大 20 MB**(媒体上传不支持分片)。
|
|
316
309
|
|
|
317
|
-
> **注意**:如果 md 内容与 `xml/slides_xml_schema_definition.xml`
|
|
310
|
+
> **注意**:如果 md 内容与 `xml/slides_xml_schema_definition.xml` 不一致,以后者为准。
|
|
@@ -28,7 +28,7 @@ lark-cli slides +add-slide --as user \
|
|
|
28
28
|
--slide @cover.xml \
|
|
29
29
|
--before-slide-id "$SID"
|
|
30
30
|
|
|
31
|
-
# wiki 链接(CLI
|
|
31
|
+
# wiki 链接(CLI 自动通过 node_by_token 接口解析,并校验 obj_type=slides)
|
|
32
32
|
lark-cli slides +add-slide --as user \
|
|
33
33
|
--presentation "https://xxx.feishu.cn/wiki/wikcnXXXXXX" \
|
|
34
34
|
--slide @page3.xml
|
|
@@ -58,7 +58,7 @@ lark-cli slides +create --title "项目汇报" --slide @./slide-01.xml --dry-run
|
|
|
58
58
|
> [!IMPORTANT]
|
|
59
59
|
> 不带页面参数时,`slides +create` 只创建空白演示文稿。创建后用 [`+add-slide`](lark-slides-add-slide.md) 逐页添加 slide 内容。
|
|
60
60
|
>
|
|
61
|
-
> 带了页面时,CLI
|
|
61
|
+
> 带了页面时,CLI 先创建空白演示文稿,再逐页添加页面。如果某一页添加失败,CLI 会停止并报错,已创建的演示文稿和已添加的页面会保留。
|
|
62
62
|
>
|
|
63
63
|
> 如果演示文稿是**以应用身份(bot)创建**的,如 `lark-cli slides +create --as bot`,CLI 会**尝试为当前 CLI 用户自动授予该演示文稿的 `full_access`(可管理权限)**。
|
|
64
64
|
>
|
|
@@ -114,7 +114,7 @@ lark-cli slides +create --title "项目汇报" --slide @./slide-01.xml --dry-run
|
|
|
114
114
|
]
|
|
115
115
|
```
|
|
116
116
|
|
|
117
|
-
数组元素是页面 XML
|
|
117
|
+
数组元素是页面 XML 原文;请求封装和逐页提交由 `+create` 完成。
|
|
118
118
|
|
|
119
119
|
> [!WARNING]
|
|
120
120
|
> `--slides '[...]'` 的风险点主要在 shell 参数传递,而不是单纯页数。即使只有 1 页,只要 XML 足够复杂,也建议改用 `--slide @page-01.xml` 逐页传文件。
|
|
@@ -142,7 +142,7 @@ lark-cli slides +create --as user --title "图测试" --slide @./slide-01.xml
|
|
|
142
142
|
- 路径相对于**当前工作目录**(CWD)解析;**必须是 CWD 内的相对路径**(如 `./pic.png`、`./assets/x.png`)
|
|
143
143
|
- 同一份图被多次引用时**只上传一次**(按路径去重)
|
|
144
144
|
- `src` 不以 `@` 开头的会原样保留,但**只允许写 `slides +media-upload` 拿到的 `file_token`**;**禁止写 http(s) 外链 URL**:飞书 slides 渲染端不会代理外链图片,外链 src 通常显示破图。要用网图必须先下载到 CWD 内、再走上传流程
|
|
145
|
-
- 单张图片最大 20 MB
|
|
145
|
+
- 单张图片最大 20 MB(媒体上传不支持分片)
|
|
146
146
|
- 校验阶段就会检查所有占位符文件存在及大小;缺文件或超限直接报错,不会创建空白 PPT 占位
|
|
147
147
|
- 创空白 PPT → 上传所有图 → 替换 token → 逐页创建 slide,按这个顺序执行
|
|
148
148
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
从演示文稿删除**一页**,按 `slide_id` 指定。只改一页里的局部内容用 [`+replace-slide`](lark-slides-replace-slide.md),不要删了重建。
|
|
4
4
|
|
|
5
|
-
`--presentation` 接受 token / `/slides/` URL / `/wiki/` URL
|
|
5
|
+
`--presentation` 接受 token / `/slides/` URL / `/wiki/` URL,页面 ID 通过 `--slide-id` 传入。
|
|
6
6
|
|
|
7
7
|
> `--slide-id` 只接受单个 ID —— 不支持逗号分隔的列表(`+screenshot` 的 `--slide-id` 支持,这个不支持),也不支持按页号删。
|
|
8
8
|
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
4. 使用 `+history-revert` 发起回滚。接口会立即返回 `task_id`,回滚任务在服务端异步执行。
|
|
13
13
|
5. 如果返回 `status: running`,保存 `task_id`,按照返回的 `poll_after_ms` 等待后调用 `+history-revert-status`。任务创建成功后,不得因为状态查询失败而重新发起回滚。
|
|
14
14
|
6. 状态变为 `done`、`partial_failed` 或 `failed` 后停止轮询;达到整体轮询上限时也停止轮询,并向用户返回 `task_id` 和当前状态。
|
|
15
|
-
7. 回滚完成后,用 `slides +xml-get`
|
|
15
|
+
7. 回滚完成后,用 `slides +xml-get` 读取演示文稿确认内容。
|
|
16
16
|
|
|
17
17
|
## 按 revision_id 或时间点回滚
|
|
18
18
|
|
|
@@ -123,10 +123,3 @@ lark-cli slides +history-revert-status --presentation "<slides_url_or_token>" --
|
|
|
123
123
|
```bash
|
|
124
124
|
lark-cli slides +xml-get --presentation "<slides_url_or_token>" --output ./presentation.xml
|
|
125
125
|
```
|
|
126
|
-
|
|
127
|
-
如果只需要快速检查返回结构,也可以走 raw OpenAPI:
|
|
128
|
-
|
|
129
|
-
```bash
|
|
130
|
-
lark-cli api get "/open-apis/slides_ai/v1/xml_presentations/<xml_presentation_id>" \
|
|
131
|
-
--params '{"revision_id":-1}'
|
|
132
|
-
```
|
|
@@ -15,7 +15,7 @@ lark-cli slides +media-upload --as user \
|
|
|
15
15
|
--file ./chart.png \
|
|
16
16
|
--presentation "https://xxx.feishu.cn/slides/slidesXXXXXXXXXXXXXXXXXXXXXX"
|
|
17
17
|
|
|
18
|
-
# 传 wiki URL(CLI
|
|
18
|
+
# 传 wiki URL(CLI 自动通过 node_by_token 接口解析真实 token,校验 obj_type=slides)
|
|
19
19
|
lark-cli slides +media-upload --as user \
|
|
20
20
|
--file ./pic.png \
|
|
21
21
|
--presentation "https://xxx.feishu.cn/wiki/wikcnXXXXXX"
|
|
@@ -43,7 +43,7 @@ lark-cli slides +media-upload --file ./pic.png --presentation $PRES_ID --dry-run
|
|
|
43
43
|
|
|
44
44
|
| 参数 | 必填 | 说明 |
|
|
45
45
|
|------|------|------|
|
|
46
|
-
| `--file` | 是 | 本地图片路径,**必须是 CWD 内的相对路径**(如 `./pic.png`)。**最大 20 MB
|
|
46
|
+
| `--file` | 是 | 本地图片路径,**必须是 CWD 内的相对路径**(如 `./pic.png`)。**最大 20 MB**(媒体上传不支持分片)。**仅支持 png / jpeg / gif / bmp / tiff / webp** |
|
|
47
47
|
| `--presentation` | 是 | `xml_presentation_id`、`/slides/<token>` URL,或 `/wiki/<token>` URL |
|
|
48
48
|
|
|
49
49
|
> [!IMPORTANT]
|
|
@@ -78,21 +78,16 @@ lark-cli slides +replace-slide --as user \
|
|
|
78
78
|
1. **`<img>` 坐标避开现有元素** —— 先读现有元素 bbox 挑空白区;空间不够就先用 `block_replace` 挪动/缩小现有元素后再放图
|
|
79
79
|
2. **`<img>` 的 `width:height` 对齐原图比例** —— 比例不一致会被裁剪,参见 [xml-schema-quick-ref.md](../xml/xml-schema-quick-ref.md) `<img>` 说明
|
|
80
80
|
|
|
81
|
-
##
|
|
81
|
+
## 上传约束
|
|
82
82
|
|
|
83
|
-
`+media-upload`
|
|
84
|
-
|
|
85
|
-
- `parent_type=slide_file`(slides 后端唯一接受的取值)
|
|
86
|
-
- `parent_node=<xml_presentation_id>`
|
|
87
|
-
|
|
88
|
-
**不要尝试用 `slides_image`、`slide_image` 等 parent_type**——后端会返回 1061001 / 1061002 错误。这是 slides 的特殊约定。
|
|
83
|
+
`+media-upload` 会处理 Slides 所需的媒体归属参数;调用者只需传入 `--file` 和 `--presentation`。单张图片最大 20 MB。
|
|
89
84
|
|
|
90
85
|
## 常见错误
|
|
91
86
|
|
|
92
87
|
| 错误码 | 含义 | 解决方案 |
|
|
93
88
|
|--------|------|----------|
|
|
94
|
-
| 1061002 | params error / 不支持的 parent_type |
|
|
95
|
-
| 1061004 | forbidden:当前身份对该演示文稿无编辑权限 | 确认当前身份(user 或 bot)对目标 PPT 有编辑权限。bot 模式常见原因:PPT 不是该 bot 创建的——可用 `+create --as bot` 新建,或以 user
|
|
89
|
+
| 1061002 | params error / 不支持的 parent_type | 使用 `+media-upload`;它会采用 Slides 所需的 `parent_type` |
|
|
90
|
+
| 1061004 | forbidden:当前身份对该演示文稿无编辑权限 | 确认当前身份(user 或 bot)对目标 PPT 有编辑权限。bot 模式常见原因:PPT 不是该 bot 创建的——可用 `+create --as bot` 新建,或以 user 身份执行 `lark-cli drive +member-add --as user --token "$PRES_ID" --type slides --member-id "$BOT_OPEN_ID" --member-type openid --perm full_access --yes` 给 bot 授权 |
|
|
96
91
|
| 1061044 | parent node not exist | `--presentation` 给的 token 不对,或不是 slides 类型 |
|
|
97
92
|
| 403 | 权限不足 | 检查 `docs:document.media:upload` scope;wiki URL 还需要 `wiki:node:read` |
|
|
98
93
|
|
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
|
|
5
5
|
> **编写 `--parts` 时只使用标准 action 和字段**:`block_replace` 使用 `block_id` + `replacement`,`block_insert` 使用 `insertion`(可选 `insert_before_block_id`)。不要根据其他 API 或自然语言猜 action、字段名;具体结构以本文表格为准。
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
此 shortcut 的四个关键能力:
|
|
8
8
|
|
|
9
9
|
1. `--presentation` 接受 `xml_presentation_id` / `/slides/` URL / `/wiki/` URL(wiki 自动解析);
|
|
10
|
-
2. `block_replace` 的 `replacement` 根元素 `id
|
|
10
|
+
2. `block_replace` 的 `replacement` 根元素 `id` 会被 CLI 自动注入为 `block_id`;3350001 时优先确认 `block_id` 来自最新 `+xml-get --slide-id` 且存在于当前页;
|
|
11
11
|
3. `<shape>` 元素缺少 `<content/>` 子元素时由 CLI 自动注入——SML 2.0 schema 要求每个 `<shape>` 必须有 `<content/>` 子元素,缺失同样触发 3350001;自闭合的 `<shape .../>` 也会被自动展开为 `<shape ...><content/></shape>`;
|
|
12
12
|
4. 3350001 错误时提供上下文感知的 hint,帮助 AI agent 和用户快速定位原因。
|
|
13
13
|
|
|
@@ -32,7 +32,7 @@ lark-cli slides +replace-slide --as user \
|
|
|
32
32
|
cat parts.json | lark-cli slides +replace-slide --as user \
|
|
33
33
|
--presentation $PRES_ID --slide-id $SID --parts -
|
|
34
34
|
|
|
35
|
-
# wiki URL 直接传(CLI
|
|
35
|
+
# wiki URL 直接传(CLI 自动通过 node_by_token 拿真实 xml_presentation_id)
|
|
36
36
|
lark-cli slides +replace-slide --as user \
|
|
37
37
|
--presentation "https://xxx.feishu.cn/wiki/wikcnXXXXXX" --slide-id pfG \
|
|
38
38
|
--parts '[{"action":"block_insert","insertion":"<shape type=\"rect\" width=\"100\" height=\"100\"/>"}]'
|
|
@@ -47,7 +47,7 @@ lark-cli slides +replace-slide --as user \
|
|
|
47
47
|
| 参数 | 必填 | 说明 |
|
|
48
48
|
|------|------|------|
|
|
49
49
|
| `--presentation` | 是 | `xml_presentation_id`、`/slides/<token>` URL,或 `/wiki/<token>` URL |
|
|
50
|
-
| `--slide-id` | 是 | 页面 ID
|
|
50
|
+
| `--slide-id` | 是 | 页面 ID(通过 `slides +xml-get` 获取) |
|
|
51
51
|
| `--parts` | 是 | JSON 数组(`[{...}, ...]`),单次最多 200 条。支持 `@<file>` 和 `-`(stdin)读取 |
|
|
52
52
|
| `--revision-id` | 否 | 基础版本号;默认 `-1` 表示基于最新版执行;传具体版本号时,服务端以该版本为 base 执行;**传不存在的版本号(超过当前 revision)返回 3350002** |
|
|
53
53
|
| `--tid` | 否 | 并发事务 ID;多人协作长事务才用,单次单人调用留空 |
|
|
@@ -63,7 +63,7 @@ lark-cli slides +replace-slide --as user \
|
|
|
63
63
|
| 字段 | 必填 | 说明 |
|
|
64
64
|
|------|------|------|
|
|
65
65
|
| `action` | 是 | `"block_replace"` |
|
|
66
|
-
| `block_id` | 是 | 目标块的 3 位 short element ID(从
|
|
66
|
+
| `block_id` | 是 | 目标块的 3 位 short element ID(从 `+xml-get --slide-id` 返回 XML 里读) |
|
|
67
67
|
| `replacement` | 是 | 新 XML 片段;**根元素 `id` 会被 CLI 自动注入为 `block_id`**,用户不用自己加(如果已经加了且不一致会被覆盖为正确值) |
|
|
68
68
|
|
|
69
69
|
### action = `block_insert`
|
|
@@ -102,7 +102,7 @@ lark-cli slides +replace-slide --as user \
|
|
|
102
102
|
| `<img>` | 图片 | `src` 必须是 [`+media-upload`](lark-slides-media-upload.md) 返回的 `file_token`,不能是 URL |
|
|
103
103
|
| `<icon>` | 图标 | `iconType` 取自 iconpark 资源;语义图标先用 `scripts/iconpark_tool.py search` 检索 |
|
|
104
104
|
| `<table>` | 表格 | 整表替换会**重建内部 td id**,旧 td block_id 立即失效 |
|
|
105
|
-
| `<td>` | 单元格局部替换 | 只能 `block_replace`,不能 `block_insert`;`block_id` 必须是最新
|
|
105
|
+
| `<td>` | 单元格局部替换 | 只能 `block_replace`,不能 `block_insert`;`block_id` 必须是最新 `+xml-get --slide-id` 拿到的 td id |
|
|
106
106
|
| `<chart>` | 图表(line/bar/column/pie/area/radar/combo) | 必须嵌 `<chartPlotArea>` + `<chartData>` + `<dim1>/<dim2>/<chartField>` |
|
|
107
107
|
|
|
108
108
|
**不可作为根元素**:
|
|
@@ -137,7 +137,7 @@ lark-cli slides +replace-slide --as user \
|
|
|
137
137
|
</table>
|
|
138
138
|
```
|
|
139
139
|
|
|
140
|
-
`<td>`(`block_replace` 单元格;`block_id` 必须是最新
|
|
140
|
+
`<td>`(`block_replace` 单元格;`block_id` 必须是最新 `+xml-get --slide-id` 拿到的 td id):
|
|
141
141
|
```xml
|
|
142
142
|
<td><content><p>新内容</p></content></td>
|
|
143
143
|
```
|
|
@@ -198,8 +198,8 @@ lark-cli slides +replace-slide --as user \
|
|
|
198
198
|
|
|
199
199
|
```bash
|
|
200
200
|
# 先拿原页 XML,从里面找到标题块的 3 位 short id(如 bUn)
|
|
201
|
-
lark-cli slides
|
|
202
|
-
--
|
|
201
|
+
lark-cli slides +xml-get --as user \
|
|
202
|
+
--presentation "$PRES_ID" --slide-id "$SID" --raw
|
|
203
203
|
|
|
204
204
|
# block_replace 换掉整个标题块(id 自动注入)
|
|
205
205
|
lark-cli slides +replace-slide --as user \
|
|
@@ -224,8 +224,8 @@ lark-cli slides +replace-slide --as user \
|
|
|
224
224
|
|
|
225
225
|
```bash
|
|
226
226
|
# 读时记录 revision_id
|
|
227
|
-
REV=$(lark-cli slides
|
|
228
|
-
--
|
|
227
|
+
REV=$(lark-cli slides +xml-get --as user \
|
|
228
|
+
--presentation "$PRES_ID" --slide-id "$SID" \
|
|
229
229
|
--jq '.data.revision_id')
|
|
230
230
|
|
|
231
231
|
# 写时传 --revision-id;传不存在的版本号(超过当前 revision)返回 3350002
|
|
@@ -238,8 +238,8 @@ lark-cli slides +replace-slide --as user \
|
|
|
238
238
|
|
|
239
239
|
| 现象 | 原因 | 对策 |
|
|
240
240
|
|------|------|------|
|
|
241
|
-
| 3350001 + hint "block_id not found" | `parts[i].block_id` 在当前页不存在 |
|
|
242
|
-
| 3350002 not found | `--revision-id` 传了不存在的版本号(超过当前 revision) | 用 `-1` 或用
|
|
241
|
+
| 3350001 + hint "block_id not found" | `parts[i].block_id` 在当前页不存在 | 重新用 `+xml-get --slide-id` 拿最新 XML,按里面的 short ID 再填 |
|
|
242
|
+
| 3350002 not found | `--revision-id` 传了不存在的版本号(超过当前 revision) | 用 `-1` 或用 `+xml-get --slide-id` 拿到的有效 `revision_id` |
|
|
243
243
|
| `--parts invalid JSON` | JSON 本身不完整,或被 shell 引号/转义破坏 | 将数组写入 `parts.json` 后传 `--parts @parts.json`,或通过 stdin 传给 `--parts -` |
|
|
244
244
|
| `--parts[i] action "str_replace" is not supported` | CLI 不暴露 `str_replace` | 把替换需求改写成 `block_replace` / `block_insert` |
|
|
245
245
|
| `--parts[i] action "page_replace" / "slide_replace" means whole-page replacement` | 把整页更新意图传给了块级 shortcut | 改用 [`slides +update-slide`](lark-slides-update-slide.md) 整页原地写回 |
|
|
@@ -248,12 +248,11 @@ lark-cli slides +replace-slide --as user \
|
|
|
248
248
|
| `--parts[i] unknown field "insertion"; it belongs to block_insert` | 字段和 `action` 不配对 | 按 action 取字段:`block_replace` = `block_id` + `replacement`;`block_insert` = `insertion` (+ `insert_before_block_id`) |
|
|
249
249
|
| `--parts[i] (block_replace) requires non-empty block_id` / `replacement` | 字段名对,但值缺失或是空串 | 按 parts 元素结构补齐值 |
|
|
250
250
|
| `<img>` 不显示 / 显示破图 | `src` 写了外链 URL | 换成通过 [`+media-upload`](lark-slides-media-upload.md) 拿到的 `file_token` |
|
|
251
|
-
| 3350001 | `replacement` 不是合法单根 XML 片段,或 `block_id` 不存在 | CLI 已自动注入 `id` 和 `<content/>`;如果仍报错,重新
|
|
251
|
+
| 3350001 | `replacement` 不是合法单根 XML 片段,或 `block_id` 不存在 | CLI 已自动注入 `id` 和 `<content/>`;如果仍报错,重新 `+xml-get --slide-id` 拿最新 XML 确认 `block_id` 存在;检查 XML 结构是否合法;坐标是否超出 960×540 |
|
|
252
252
|
| 403 | 权限不足 | 需要 `slides:presentation:update` 或 `slides:presentation:write_only`;wiki URL 还需要 `wiki:node:read` |
|
|
253
253
|
|
|
254
254
|
## 相关命令
|
|
255
255
|
|
|
256
|
-
- [
|
|
257
|
-
- [xml_presentation.slide replace](lark-slides-xml-presentation-slide-replace.md) — 底层 replace API 参考
|
|
256
|
+
- [slides +xml-get](lark-slides-xml-presentations-get.md) — 读原页拿 `block_id` / `revision_id`
|
|
258
257
|
- [+media-upload](lark-slides-media-upload.md) — 上传图片拿 `file_token`
|
|
259
258
|
- [slides-editing.md](../workflow/slides-editing.md) — 读-改-写闭环 + 决策树
|
|
@@ -36,7 +36,7 @@ lark-cli slides +update-slide --as user \
|
|
|
36
36
|
| `--tid` | 否 | 调用方提供的任务/事务标识,CLI 原样透传;用于关联同一编辑任务或重试,不等同于版本前置条件,不能单独保证并发冲突时拒绝写入。一般留空 |
|
|
37
37
|
|
|
38
38
|
`@file` 和 `+xml-get --output` 一样**只接受当前目录下的相对路径**,绝对路径会被拒。
|
|
39
|
-
命令别名:`slides +update
|
|
39
|
+
命令别名:`slides +update`(隐藏)。
|
|
40
40
|
|
|
41
41
|
如果要求“从读取之后页面一旦变化就不再写入”,不能只传 `--revision-id` 或 `--tid`。写入前必须再次用 `+xml-get` 回读最新版,比较读取期间是否发生变化;有变化时先基于最新版重新合并本次修改,再执行整页写回。当前 shortcut 不提供严格的 compare-and-swap 保证。
|
|
42
42
|
|
|
@@ -106,7 +106,7 @@ lark-cli slides +update-slide --as user \
|
|
|
106
106
|
|
|
107
107
|
- **只改一个元素** → 用 [`+replace-slide`](lark-slides-replace-slide.md),一条 `block_replace` part 更省,也不用带上整页
|
|
108
108
|
- **要改多个页面** → 对每一页各跑一次本命令
|
|
109
|
-
- **要新建页面** → `slides +create` 或 `
|
|
109
|
+
- **要新建页面** → `slides +create` 或 `slides +add-slide`
|
|
110
110
|
|
|
111
111
|
## 提交前与写入后验证
|
|
112
112
|
|
|
@@ -1,110 +1,5 @@
|
|
|
1
|
-
#
|
|
1
|
+
# slides +xml-get(单页读取兼容入口)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
本文档已合并至 [lark-slides-xml-presentations-get.md](lark-slides-xml-presentations-get.md)。
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
## 命令
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
lark-cli slides xml_presentation.slide get --as user --params '<json_params>'
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
## 参数说明
|
|
14
|
-
|
|
15
|
-
| 参数 | 类型 | 必需 | 说明 |
|
|
16
|
-
|------|------|------|------|
|
|
17
|
-
| `--params` | JSON string | 是 | 路径参数与查询参数 |
|
|
18
|
-
|
|
19
|
-
### params JSON 结构
|
|
20
|
-
|
|
21
|
-
```json
|
|
22
|
-
{
|
|
23
|
-
"xml_presentation_id": "slides_example_presentation_id",
|
|
24
|
-
"slide_id": "slide_example_id",
|
|
25
|
-
"revision_id": -1
|
|
26
|
-
}
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
| 字段 | 类型 | 必需 | 说明 |
|
|
30
|
-
|------|------|------|------|
|
|
31
|
-
| `xml_presentation_id` | string | 是 | 目标演示文稿唯一标识 |
|
|
32
|
-
| `slide_id` | string | 是 | 目标页面唯一标识 |
|
|
33
|
-
| `revision_id` | integer | 否 | 版本号,`-1` 表示最新版(默认)|
|
|
34
|
-
|
|
35
|
-
## 使用示例
|
|
36
|
-
|
|
37
|
-
### 读最新版本
|
|
38
|
-
|
|
39
|
-
```bash
|
|
40
|
-
lark-cli slides xml_presentation.slide get --as user --params '{
|
|
41
|
-
"xml_presentation_id": "slides_example_presentation_id",
|
|
42
|
-
"slide_id": "slide_example_id"
|
|
43
|
-
}'
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
### 只提取 XML 内容
|
|
47
|
-
|
|
48
|
-
```bash
|
|
49
|
-
lark-cli slides xml_presentation.slide get --as user \
|
|
50
|
-
--params '{"xml_presentation_id":"slides_example_presentation_id","slide_id":"slide_example_id"}' \
|
|
51
|
-
--jq '.data.slide.content'
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
### 读指定历史版本
|
|
55
|
-
|
|
56
|
-
```bash
|
|
57
|
-
lark-cli slides xml_presentation.slide get --as user --params '{
|
|
58
|
-
"xml_presentation_id": "slides_example_presentation_id",
|
|
59
|
-
"slide_id": "slide_example_id",
|
|
60
|
-
"revision_id": 42
|
|
61
|
-
}'
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
## 返回值
|
|
65
|
-
|
|
66
|
-
```json
|
|
67
|
-
{
|
|
68
|
-
"ok": true,
|
|
69
|
-
"identity": "user",
|
|
70
|
-
"data": {
|
|
71
|
-
"slide": {
|
|
72
|
-
"slide_id": "slide_example_id",
|
|
73
|
-
"content": "<slide id=\"slide_example_id\"><style/><data>...</data></slide>"
|
|
74
|
-
},
|
|
75
|
-
"revision_id": 100
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
| 字段 | 类型 | 说明 |
|
|
81
|
-
|------|------|------|
|
|
82
|
-
| `data.slide.slide_id` | string | 页面唯一标识 |
|
|
83
|
-
| `data.slide.content` | string | 页面完整 XML(`<slide>` 根节点,不含 xmlns)|
|
|
84
|
-
| `data.revision_id` | integer | 此次读到的版本号,可用于后续 replace 的乐观锁 |
|
|
85
|
-
|
|
86
|
-
## 常见错误
|
|
87
|
-
|
|
88
|
-
| 错误码 | 含义 | 解决方案 |
|
|
89
|
-
|--------|------|----------|
|
|
90
|
-
| 404 | 演示文稿或页面不存在 | 检查 `xml_presentation_id` / `slide_id` |
|
|
91
|
-
| 403 | 权限不足 | 需要 `slides:presentation:read` scope,并对该 PPT 有访问权限 |
|
|
92
|
-
| 400 | `revision_id` 不存在 | 传了无效版本号,用 `-1` 或真实存在的版本号 |
|
|
93
|
-
|
|
94
|
-
## 注意事项
|
|
95
|
-
|
|
96
|
-
1. **执行前必做**:`lark-cli schema slides.xml_presentation.slide.get` 查看最新参数结构
|
|
97
|
-
2. **block_id 提取**:返回 XML 里每个顶层块(shape、img、table、chart 等)的 `id` 属性即为 `block_id`,通常是 3 字符短码,例如 `<shape id="bUn" ...>`。用以下命令列出当前页所有 block_id:
|
|
98
|
-
|
|
99
|
-
```bash
|
|
100
|
-
lark-cli slides xml_presentation.slide get --as user \
|
|
101
|
-
--params "{\"xml_presentation_id\":\"$PRES_ID\",\"slide_id\":\"$SID\"}" \
|
|
102
|
-
--jq '.data.slide.content' | grep -oE 'id="[^"]+"' | sed 's/id="//;s/"//'
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
## 相关命令
|
|
106
|
-
|
|
107
|
-
- [slides +replace-slide](lark-slides-replace-slide.md) — 块级替换 shortcut(推荐)
|
|
108
|
-
- [xml_presentation.slide replace](lark-slides-xml-presentation-slide-replace.md) — 底层 replace API 参考
|
|
109
|
-
- [slides +xml-get](lark-slides-xml-presentations-get.md) — 读整个 PPT 并保存到本地文件
|
|
110
|
-
- [slides-editing.md](../workflow/slides-editing.md) — 读-改-写闭环
|
|
5
|
+
此文件保留已发布路径兼容性;后续引用请使用该正式 reference。
|