gogcli 文档建议清单全解析:用gog docs suggestions list列出 Google Docs 待处理的插入与删除建议
【免费下载链接】gogcliGoogle Workspace in your terminal.项目地址: https://gitcode.com/GitHub_Trending/gogcl/gogcli
导读
gog docs suggestions list是 gogcli(Google Workspace in your terminal)提供的只读命令,用于把 Google Docs 文档中"建议模式"下尚未被采纳或拒绝的文本建议(Text Suggestion)——包括插入(insertion)与删除(deletion)——一次性枚举出来。在多人审阅、内容审批、AI 协作编辑等场景中,它可以帮你快速定位一篇文档里所有"待决"的修订点,并以表格、TSV 或 JSON 的形式交给脚本做进一步处理。读完本文,你将掌握该命令的完整参数、输出格式、多 Tab 文档处理方式,以及它在 gogcli 源码中的实现原理。
命令概览:位置、别名与使用语法
gog docs suggestions list是gog docs suggestions子命令组下的唯一子命令,其父命令是 gog docs suggestions,完整命令树为gog docs → gog docs suggestions → gog docs suggestions list。
gog docs (doc) suggestions list (ls) <docId> [flags]其中:
doc是docs的别名(括号内为可用别名);list有别名ls,因此以下两种写法等价:
gog docs suggestions list <docId> gog docs suggestions ls <docId>命令用途一句话概括为:列出文档中待处理的文本插入与删除建议(List pending text insertions and deletions)。它是纯只读操作,不会对文档内容做任何修改,天然适合纳入--readonly保护下的自动化巡检流程。
必填参数:docId
<docId>是唯一的位置参数(positional argument),类型为string,含义是目标 Google Docs 文档的 ID。
从源码看(internal/cmd/docs_suggestions.go),参数定义如下:
type DocsSuggestionsListCmd struct { DocID string `arg:"" name:"docId" help:"Doc ID"` Tab string `name:"tab" help:"Tab title or ID (omit for the first tab)"` }运行前Run方法会调用normalizeGoogleID(strings.TrimSpace(c.DocID))对入参做归一化处理(googleid.go):
- 传入纯 ID(如
1AbC...xyz)时原样使用; - 传入 Google 文档分享链接时自动提取 ID,支持以下 URL 形态:
https://docs.google.com/document/d/<id>/edithttps://drive.google.com/file/d/<id>/view- 无
https://前缀的粘贴文本(如docs.google.com/document/d/...) sites.google.com/d/<id>/...等站点编辑器链接
- 若归一化后为空字符串,直接返回
empty docId错误(对应测试 TestDocsSuggestionsList_EmptyDocID)。
可选参数:--tab
--tab用于在包含多个标签页(Tab)的 Google Docs 文档中指定目标标签页,可传标签页标题或标签页 ID,省略时默认作用于第一个标签页。
其底层行为(internal/cmd/docs_suggestions.go)值得留意:
- 未指定
--tab时,请求不带includeTabsContent参数,直接读取文档默认内容; - 指定
--tab后,请求会附加IncludeTabsContent(true),将文档所有标签页内容一次性拉回,再通过 findTab 按 ID 精确匹配,其次按标题大小写不敏感匹配,找不到时报错并列出所有可用标签标题:tab not found: "Review" (available: "Overview", "Review", ...) - 找到后通过
projectRawDocumentTab把目标标签页内容投影为独立文档再枚举建议,因此最终结果中的索引位置均以该标签页自身内容为基准。
findTab匹配时会对嵌套子标签做展平处理(flattenTabs递归遍历ChildTabs),见 docs_tabs.go。
输出格式详解
默认表格输出
默认输出是带表头的表格(各列以 Tab 分隔,交给终端渲染为对齐表格):
SUGGESTION ID KIND SEGMENT START END TEXT suggestion-1 insertion body 1 6 draft各列含义:
| 列 | 说明 |
|---|---|
SUGGESTION ID | 建议 ID(对应 Google Docs API 中SuggestedInsertionIds/SuggestedDeletionIds里的标识符) |
KIND | 建议类型:insertion(插入)或deletion(删除) |
SEGMENT | 建议所在片段:正文为body,页眉为header:<id>,页脚为footer:<id>,脚注为footnote:<id> |
START/END | 建议在所属片段内的起止索引(基于 Google Docs API 的偏移量) |
TEXT | 与建议关联的文本(删除建议通常携带被删文本;结构类元素为空) |
TSV 稳定输出(--plain / --tsv)
加-p/--plain/--tsv后去掉表头,只输出稳定、可解析的 TSV 数据(无颜色、无装饰),适合awk、cut或 CI 管道直接消费:
gog docs suggestions list <docId> --plain文本字段会经过 docsTSVField 转义,把\、\t、\r、\n分别替换为\\、\t、\r、\n的字面序列,保证多行文本不会被拆散成多行记录(对应测试 TestDocsSuggestionsList_Text,期望输出中文本a\tb\n以转义形式呈现)。
JSON 输出(--json / -j / --machine)
加-j/--json/--machine后,输出为结构化 JSON,便于程序处理:
{ "documentId": "1AbC...xyz", "tabId": "", "suggestions": [ { "suggestionId": "suggestion-1", "kind": "insertion", "segment": "body", "startIndex": 1, "endIndex": 6, "text": "draft" } ] }输出信封字段说明(internal/cmd/docs_suggestions.go):
documentId:文档 ID(与传入的<docId>对应);tabId:目标标签页 ID;未指定--tab或文档无多标签时为空字符串;suggestions:建议条目数组,每项字段与表格列一一对应。
若结合--results-only,则 JSON 模式只保留suggestions主体、丢弃documentId/tabId等信封字段,便于脚本直接迭代建议数组;若结合--select(别名--pick/--project)可进一步做字段投影。这两者都是 gogcli 的全局 JSON 输出选项,详见下方 Flags 表。
完整 Flags 参考
除位置参数<docId>和--tab外,该命令继承 gogcli 全部全局标志(这些标志也同时出现在父命令 gog docs suggestions 上):
| Flag | 类型 | 默认值 | 说明 |
|---|---|---|---|
--access-token | string | 直接使用给定的访问令牌(绕过存储的刷新令牌;令牌约 1 小时过期) | |
-a/--account/--acct | string | 认证的 Google API 命令使用的账号邮箱、别名或auto | |
--client | string | OAuth 客户端名称(选择存储的凭据 + 令牌桶) | |
--color | string | auto | 颜色输出:auto\|always\|never |
--disable-commands | string | 逗号分隔的禁用命令列表;支持点路径 | |
-n/--dry-run/--dryrun/--noop/--preview | bool | 不执行更改;打印预期动作并以成功退出 | |
--enable-commands | string | 逗号分隔的启用命令前缀列表;支持点路径(限制 CLI 可用范围) | |
--enable-commands-exact | string | 逗号分隔的精确启用命令列表;点路径下父命令不会自动启用子命令 | |
-y/--force/--assume-yes/--yes | bool | 跳过破坏性命令的确认提示 | |
--gmail-no-send | bool | false | 阻止 Gmail 发送操作(Agent 安全) |
-h/--help | kong.helpFlag | 显示上下文相关帮助 | |
--home | string | 覆盖 gogcli 的 config/data/state/cache 根目录(等价于GOG_HOME) | |
-j/--json/--machine | bool | false | 向 stdout 输出 JSON(最适合脚本) |
--no-input/--non-interactive/--noninteractive | bool | 绝不交互式提示;失败直接报错(适合 CI) | |
-p/--plain/--tsv | bool | false | 向 stdout 输出稳定、可解析的文本(TSV;无颜色) |
--quota-project | string | 用于计费 API 用量的 Google Cloud 项目(以X-Goog-User-Project头发送;部分 API 在--access-token或 ADC 模式下要求此项) | |
--readonly | bool | false | 在运行时阻止所有变更类 API 请求;auth add也只会请求只读 OAuth 范围 |
--results-only | bool | JSON 模式只输出主结果(丢弃nextPageToken等信封字段) | |
--select/--pick/--project | string | JSON 模式下按逗号分隔选择字段(尽力而为;支持点路径)。多数命令推荐使用--fields | |
-v/--verbose | bool | 开启详细日志 | |
--version | kong.VersionFlag | 打印版本并退出 | |
--wrap-untrusted | bool | false | JSON/raw 输出中,为拉取的文本字段包裹外部不可信内容标记 |
与 Agent / 自动化场景相关的重要标志
--readonly:本命令本身就是只读操作,加上该标志后整个进程还会被强制运行在只读模式(运行时阻止一切变更类 API 请求),适合在自动化巡检或 Agent 环境中作为双保险。--no-input:非交互模式,任何需要人工确认的环节直接失败而非挂起等待,是 CI 管道的标准选择。--json+--results-only+--select:组合使用可把输出裁剪到脚本真正需要的字段。
实现原理:它到底是怎么"枚举建议"的?
数据来源:SUGGESTIONS_INLINE视图
命令通过 Google Docs API 的Documents.Get拉取文档,并强制指定SuggestionsViewMode("SUGGESTIONS_INLINE")(internal/cmd/docs_suggestions.go)。该视图会把文档中所有带建议的文本以"内联"形式返回——即正文仍然保留原始文本,同时在每个受影响的元素上附带SuggestedInsertionIds/SuggestedDeletionIds列表。
测试代码对这一点做了严格校验(docs_suggestions_test.go):请求 URL 中的suggestionsViewMode必须是SUGGESTIONS_INLINE,且默认请求(未指定--tab)不得携带includeTabsContent。
覆盖范围:不止正文
enumerateDocsSuggestions(internal/cmd/docs_suggestions.go)会遍历文档的多个独立片段,每一段都单独枚举:
| SEGMENT 前缀 | 来源 |
|---|---|
body | 文档正文 |
header:<id> | 页眉(按 ID 排序输出,保证结果稳定) |
footer:<id> | 页脚 |
footnote:<id> | 脚注 |
sortedDocsMapKeys对 map 键排序后再遍历,确保同样的文档永远产生相同顺序的输出。
元素类型全覆盖
在段落内部,枚举器会递归处理所有类型的ParagraphElement(docs_suggestions.go):
TextRun(普通文本,携带实际内容)AutoText(自动文本)ColumnBreak(分栏符)DateElement(日期元素)Equation(公式)FootnoteReference(脚注引用)HorizontalRule(水平分隔线)InlineObjectElement(内联对象,如嵌入图片,还会合并InlineObjectsmap 上的建议)PageBreak(分页符)Person(人员智能芯片)RichLink(富链接卡片)
对于非文本元素,text字段为空字符串,但仍保留建议 ID 与起止索引。
除此之外,以下结构级建议同样会被捕获(对应测试 TestEnumerateDocsSuggestions):
- 表格:表格结构(
SuggestedInsertionIds)、行结构、单元格结构及其内部内容的建议会逐层合并继承; - 目录(TableOfContents):目录整体及其内部内容的建议;
- 章节分隔符(SectionBreak);
- 列表(List):通过
doc.Listsmap 关联Bullet.ListId捕获列表级建议; - 定位对象(PositionedObject):包括段落当前的
PositionedObjectIds与SuggestedPositionedObjectIds中新增的对象。
相邻片段合并逻辑
appendDocsSuggestionRange中有一个关键优化(docs_suggestions.go):当同一个建议 ID 的条目结束索引恰好等于新片段的开始索引(即建议在原文中是连续相邻的)时,会把新片段追加到已有条目的EndIndex与Text上,而不是新建一条。这样,一个跨多个 TextRun 的连续插入建议会被合并成一条完整记录。
测试中的典型用例(docs_suggestions_test.go):文本hel(StartIndex 1-4)与lo(StartIndex 4-6)都挂着建议 IDinsert,最终合并为{SuggestionID: "insert", Kind: "insertion", Segment: "body", StartIndex: 1, EndIndex: 6, Text: "hello"}——这正好说明为什么一条跨 run 的建议能汇总成一段完整文本。同一个 ID 若重复出现在不同位置(测试里的nested),则会各自保留为独立条目。
错误处理
请求失败时,若底层错误属于"文档不存在"类别(isDocsNotFound,见 docs_helpers.go),命令会返回友好错误:doc not found or not a Google Doc (id=<id>);文档对象为空时返回doc not found。这提示我们:该命令仅适用于 Google Docs 类型的文档,传入非文档 ID 或无权访问的文档都会得到明确报错。
典型使用场景
1. 快速盘点一篇文档的所有待决建议
gog docs suggestions list 1AbC...xyz输出中的每一行就是一条待处理的建议,KIND为insertion的是"建议新增"的内容,KIND为deletion的是"建议删除"的内容。配合SEGMENT列可以区分建议来自正文、页眉还是脚注。
2. 只查看多标签文档的某一个标签页
gog docs suggestions list 1AbC...xyz --tab "Review"按标题或标签页 ID 定位,SEGMENT与索引均以该标签页内容为基准。
3. 交给脚本做后续分析
# TSV 模式:提取所有插入建议的文本 gog docs suggestions list 1AbC...xyz --plain | awk -F'\t' '$2=="insertion" {print $6}' # JSON 模式:统计待处理建议数量 gog docs suggestions list 1AbC...xyz --json | jq '.suggestions | length'4. 在 CI / Agent 环境中安全执行
gog docs suggestions list 1AbC...xyz --json --results-only --no-input --readonly--readonly确保整个进程不可能发起任何变更请求,--no-input避免因交互提示卡死流水线。
关联资源
- 父命令:gog docs suggestions
- 命令索引:docs/commands/README.md
- 核心实现:internal/cmd/docs_suggestions.go
- 单元测试:internal/cmd/docs_suggestions_test.go
- 标签页查找逻辑:internal/cmd/docs_tabs.go
- 文档 ID 归一化:internal/cmd/googleid.go
- Google 服务装配入口:internal/cmd/service_helpers.go
小结
gog docs suggestions list用一条命令把 Google Docs 中分散在各处、内嵌在 API 结构里的"待处理建议"汇总成统一的清单,无论是人工审阅还是脚本自动化都能直接消费。理解它的三个关键点——SUGGESTIONS_INLINE视图、正文/页眉/页脚/脚注四类片段全覆盖、以及相邻建议合并逻辑——就能准确解读输出,并将其可靠地嵌入你的文档审阅与内容自动化工作流。
【免费下载链接】gogcliGoogle Workspace in your terminal.项目地址: https://gitcode.com/GitHub_Trending/gogcl/gogcli
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考