gogcli 文档建议清单全解析:用 `gog docs suggestions list` 列出 Google Docs 待处理的插入与删除建议
2026/9/17 6:45:56 网站建设 项目流程

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 listgog docs suggestions子命令组下的唯一子命令,其父命令是 gog docs suggestions,完整命令树为gog docs → gog docs suggestions → gog docs suggestions list

gog docs (doc) suggestions list (ls) <docId> [flags]

其中:

  • docdocs的别名(括号内为可用别名);
  • 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>/edit
    • https://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)值得留意:

  1. 未指定--tab时,请求不带includeTabsContent参数,直接读取文档默认内容;
  2. 指定--tab后,请求会附加IncludeTabsContent(true),将文档所有标签页内容一次性拉回,再通过 findTab 按 ID 精确匹配,其次按标题大小写不敏感匹配,找不到时报错并列出所有可用标签标题:
    tab not found: "Review" (available: "Overview", "Review", ...)
  3. 找到后通过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 数据(无颜色、无装饰),适合awkcut或 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-tokenstring直接使用给定的访问令牌(绕过存储的刷新令牌;令牌约 1 小时过期)
-a/--account/--acctstring认证的 Google API 命令使用的账号邮箱、别名或auto
--clientstringOAuth 客户端名称(选择存储的凭据 + 令牌桶)
--colorstringauto颜色输出:auto\|always\|never
--disable-commandsstring逗号分隔的禁用命令列表;支持点路径
-n/--dry-run/--dryrun/--noop/--previewbool不执行更改;打印预期动作并以成功退出
--enable-commandsstring逗号分隔的启用命令前缀列表;支持点路径(限制 CLI 可用范围)
--enable-commands-exactstring逗号分隔的精确启用命令列表;点路径下父命令不会自动启用子命令
-y/--force/--assume-yes/--yesbool跳过破坏性命令的确认提示
--gmail-no-sendboolfalse阻止 Gmail 发送操作(Agent 安全)
-h/--helpkong.helpFlag显示上下文相关帮助
--homestring覆盖 gogcli 的 config/data/state/cache 根目录(等价于GOG_HOME
-j/--json/--machineboolfalse向 stdout 输出 JSON(最适合脚本)
--no-input/--non-interactive/--noninteractivebool绝不交互式提示;失败直接报错(适合 CI)
-p/--plain/--tsvboolfalse向 stdout 输出稳定、可解析的文本(TSV;无颜色)
--quota-projectstring用于计费 API 用量的 Google Cloud 项目(以X-Goog-User-Project头发送;部分 API 在--access-token或 ADC 模式下要求此项)
--readonlyboolfalse在运行时阻止所有变更类 API 请求;auth add也只会请求只读 OAuth 范围
--results-onlyboolJSON 模式只输出主结果(丢弃nextPageToken等信封字段)
--select/--pick/--projectstringJSON 模式下按逗号分隔选择字段(尽力而为;支持点路径)。多数命令推荐使用--fields
-v/--verbosebool开启详细日志
--versionkong.VersionFlag打印版本并退出
--wrap-untrustedboolfalseJSON/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):包括段落当前的PositionedObjectIdsSuggestedPositionedObjectIds中新增的对象。

相邻片段合并逻辑

appendDocsSuggestionRange中有一个关键优化(docs_suggestions.go):当同一个建议 ID 的条目结束索引恰好等于新片段的开始索引(即建议在原文中是连续相邻的)时,会把新片段追加到已有条目的EndIndexText上,而不是新建一条。这样,一个跨多个 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

输出中的每一行就是一条待处理的建议,KINDinsertion的是"建议新增"的内容,KINDdeletion的是"建议删除"的内容。配合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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询