gogcli `gog sheets copy-paste` 完全指南:跨区域复制值/公式/格式与平铺填充(fill down/across)
2026/9/17 23:43:50 网站建设 项目流程

gogcligog sheets copy-paste完全指南:跨区域复制值/公式/格式与平铺填充(fill down/across)

【免费下载链接】gogcliGoogle Workspace in your terminal.项目地址: https://gitcode.com/GitHub_Trending/gogcl/gogcli

导读

gog sheets copy-paste是 gogcli(Google Workspace in your terminal)为 Google Sheets 提供的一键复制命令:它可以将指定源区域的值、公式、格式、边框、数据验证规则或条件格式复制到目标区域,并且当目标区域大于源区域时,会自动把源内容平铺(tile)填充到整个目标范围——这是快速填充公式列、跨列扩展格式的利器。本文以 docs/commands/gog-sheets-copy-paste.md 为主线,结合 internal/cmd/sheets_copy_paste.go、internal/cmd/sheets_copy_paste_test.go 与 internal/sheetsvalidation/copy.go 等源码,完整讲解命令用法、每种粘贴类型的语义、平铺与转置行为、安全约束及底层实现原理,读完即可在终端中可靠地完成复杂表格复制任务。

一、命令概览与定位

gog sheets copy-paste归属于gog sheets子命令族(见 gog sheets),注册于 internal/cmd/sheets.go#L48:

CopyPaste SheetsCopyPasteCmd `cmd:"" name:"copy-paste" aliases:"fill,copy-range" help:"Copy a range's values/formulas/format to another range (tiles to fill down/across)"`

copy-paste外,它还提供两个便捷别名:fillcopy-range。因此下面三种写法等价:

gog sheets copy-paste <spreadsheetId> <source> <dest> gog sheets fill <spreadsheetId> <source> <dest> gog sheets copy-range <spreadsheetId> <source> <dest>

与同族命令的区分:gog sheets copy(别名cp/duplicate)是复制整个电子表格(通过 Drive API),而copy-paste只复制表格内的一个区域,作用范围完全不同。

完整用法

gog sheets (sheet) copy-paste (fill,copy-range) <spreadsheetId> <source> <dest> [flags]

三个位置参数:

参数说明示例
spreadsheetId电子表格 ID(支持normalizeGoogleID归一化,见下文)1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms
source源区域,A1 表示法,必须包含工作表名Sheet1!A2:H71
dest目标区域,A1 表示法;目标大于源时会平铺填充源以铺满目标Sheet1!A2:H120

参数校验位于 internal/cmd/sheets_copy_paste.go#L29-L37:空spreadsheetId、空source、空dest均会直接报 usage 错误。

二、核心参数:--type粘贴类型

--type决定复制时携带哪些内容,默认值为NORMAL,取值范围与说明:

--type取值对应 Google Sheets API 常量复制内容
NORMAL(默认)PASTE_NORMAL值 + 公式 + 格式 + 数据验证,等价于界面里普通粘贴
VALUESPASTE_VALUES仅粘贴值(公式求值结果),不携带格式
FORMATPASTE_FORMAT仅粘贴格式(颜色、边框、字体等),不改动数据
FORMULAPASTE_FORMULA仅粘贴公式,且相对引用会按目标位置自动调整
NO_BORDERSPASTE_NO_BORDERS类似 NORMAL 但不携带边框
DATA_VALIDATIONPASTE_DATA_VALIDATION仅粘贴数据验证规则(下拉、数字范围等)
CONDITIONAL_FORMATTINGPASTE_CONDITIONAL_FORMATTING仅粘贴条件格式规则

源码 internal/cmd/sheets_copy_paste.go#L143-L155 中的normalizePasteType做了三项归一化:

  1. 输入先strings.ToUpper+TrimSpace,所以--type values--type VALUES等价;
  2. 自动剥掉可选的PASTE_前缀(--type PASTE_FORMAT合法);
  3. 白名单之外的值直接报错:invalid --type "BOGUS" (expected NORMAL, VALUES, FORMAT, FORMULA, NO_BORDERS, DATA_VALIDATION, or CONDITIONAL_FORMATTING)

测试 internal/cmd/sheets_copy_paste_test.go#L76-L92 验证了非法类型返回退出码 2 且不会发出任何 API 请求capture.Last == nil),保证错误输入零副作用。

三、平铺填充(Tiling)——fill down / across的原理

命令描述中的 "(tiles to fill down/across)" 是它的招牌能力:dest尺寸大于source时,Google Sheets 的CopyPasteRequest会自动把源区域平铺(重复平铺)以填满目标区域。典型场景:

# 把 Sheet1!A2:H71 中的公式向下填充到 A2:H120(补全剩余 49 行) gog sheets copy-paste 1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms \ 'Sheet1!A2:H71' 'Sheet1!A2:H120' --type FORMULA

dest中的!在部分 shell(如 bash 的历史展开)下可能被转义为\!,命令内部通过cleanRange(internal/cmd/sheets.go#L29-L31)统一把\!还原为!,所以带不带转义均可安全使用。

测试 internal/cmd/sheets_copy_paste_test.go#L18-L46 对该场景做了逐字段断言:

  • PasteType == "PASTE_FORMULA"PasteOrientation == "NORMAL"
  • 源与目标在同一工作表(SheetId均为 9);
  • 源区域解析为行[1,71)(即 A2:H71),目标解析为行[1,120)(即 A2:H120)——目标更高,即"fill-down"。

由此可以确认:只要目标的行/列数超过源,Google Sheets API 就会把源内容按行列平铺重复填充,这是实现整列公式填充、整行格式扩展最直接的手段,无需循环逐格复制。

四、--transpose转置粘贴

--transpose是布尔开关(默认false),开启后行列互换后粘贴:

# 把 3 行 2 列(A1:B3)转置为 2 行 3 列(D1:F2) gog sheets copy-paste <spreadsheetId> 'Sheet1!A1:B3' 'Sheet1!D1:F2' --transpose

源码 internal/cmd/sheets_copy_paste.go#L43-L46 中,转置与否只影响PasteOrientation字段:默认为NORMAL,转置时为TRANSPOSE;该字段随CopyPasteRequest一并发送给 API。测试 internal/cmd/sheets_copy_paste_test.go#L62-L74 断言了PasteOrientation == "TRANSPOSE"

注意:转置 + 平铺的组合(目标尺寸既不等于源也不等于转置尺寸)行为由 API 端决定,请确保目标区域尺寸与转置后的源尺寸匹配,避免产生意料之外的平铺结果。

五、数据验证规则的特殊处理(表格感知复制)

这是copy-paste比裸调 Sheets API 更"聪明"的地方。当粘贴类型携带数据验证时(pasteCarriesDataValidation判断,见 internal/cmd/sheets_copy_paste.go#L134-L141,覆盖PASTE_NORMALPASTE_FORMATPASTE_NO_BORDERSPASTE_DATA_VALIDATION四种),命令会额外执行表格感知的验证规则复制:

  1. fetchTableValidationSpans拉取工作表中**表格(Table)列的验证规则区间;
  2. resolveTableValidationCopyOptions计算复制选项(internal/cmd/sheets_validation.go#L503-L519 等);
  3. sheetsvalidation.BuildCopyRequests在 internal/sheetsvalidation/copy.go#L32-L91 中规划补充请求,把源区的普通验证单元与目标区表格列验证做差分处理;
  4. 追加进同一批BatchUpdateSpreadsheetRequest,与主CopyPaste请求一次性原子提交(internal/cmd/sheets_copy_paste.go#L78-L123)。

实现层面使用 internal/sheetsvalidation 包提供的EffectiveCopyDestination(copy.go#L751,转置感知地计算有效目标区)、FirstIntersectingSpan(copy.go#L180)、RelevantSourceSpans(copy.go#L300)与SubtractSpans(planner.go#L327)。

这带来两个可预期的行为:

  • 普通单元验证复制到表格列时,要求源必须是"表格列源",否则报错copying validation into table column N in table ... requires a table-column source(copy.go#L54-L61);
  • 普通单元格验证复制进表格列被显式拒绝:copying ordinary cell validation into table column N in table ... is not supported(copy.go#L63-L79)。

结果返回中新增tableManagedValidationRequests字段,报告追加了多少个表格验证补充请求;同时最终的 API 提交统一走runSheetsMutation(internal/cmd/sheets_mutation_helpers.go#L15-L45),因此复制操作天然继承该辅助函数提供的能力:dry-run 预检、账户选择、JSON 输出、人类可读结果行(如Copied Sheet1!A2:H71 → Sheet1!A2:H120 (PASTE_FORMULA))。

六、区域解析与越界裁剪

在发起请求前,命令会做两轮区域处理:

  1. parseSheetRange解析 A1 表示法为结构化行列(internal/cmd/sheets_validation.go#L666);
  2. gridRangeFromMap结合fetchSpreadsheetRangeCatalog拉取的工作表目录(SheetIDsByTitle,见 internal/cmd/sheets_range_resolve.go#L23-L73),把 A1 中的表名解析为数字SheetId
  3. boundGridRangeToSheet(internal/cmd/sheets_validation.go#L422-L440)负责越界裁剪:当范围未显式指定结束行/列时,自动用该工作表GridPropertiesRowCount/ColumnCount补全,避免 API 报"超出网格范围"。

其中normalizeGoogleID(internal/cmd/googleid.go#L10)会清理用户粘贴的 spreadsheetId,支持带协议/路径的完整 URL 形式,方便直接复制浏览器地址栏中的表格链接作为第一个参数。

七、完整 Flags 参考

所有全局 flags 均适用于本命令,以下为高价值项(完整表格见 docs/commands/gog-sheets-copy-paste.md):

Flag类型默认说明
--typestringNORMAL粘贴类型:NORMAL、VALUES、FORMAT、FORMULA、NO_BORDERS、DATA_VALIDATION、CONDITIONAL_FORMATTING(命令专属)
--transposeboolfalse转置粘贴(命令专属)
-n/--dry-run/--noop/--previewbool不真正修改表格,打印预期操作并成功退出(见runSheetsMutation中的dryRunExit
-a/--account/--acctstring指定账户邮箱、别名或auto
--clientstringOAuth client 名称(选择对应凭证与 token 桶)
-j/--json/--machineboolfalseJSON 输出到 stdout(脚本友好)
-p/--plain/--tsvboolfalse稳定的 TSV 文本输出,无颜色
--results-onlyboolJSON 模式只输出主结果,丢弃nextPageToken等信封字段
--select/--pick/--projectstringJSON 模式下选择逗号分隔字段(支持点路径)
-y/--force/--assume-yesbool跳过破坏性命令确认
--readonlyboolfalse运行时拦截一切变更 API 请求(本命令会直接失败)
--no-input/--non-interactivebool永不提示,改为失败(CI 场景)
--quota-projectstring计费项目(作为X-Goog-User-Project头发送)
--access-tokenstring直接使用传入的 access token(绕过存储的 refresh token,约 1 小时过期)
--disable-commands/--enable-commands/--enable-commands-exactstring逗号分隔的命令启用/禁用(支持点路径),可用来在受限环境中精确放行sheets.copy-paste
--gmail-no-sendboolfalse阻止 Gmail 发送操作(Agent 安全)
--homestring覆盖 gogcli 配置/数据/状态/缓存根目录(等价于GOG_HOME
-v/--verbosebool打开详细日志
-h/--help上下文相关帮助
--version打印版本并退出

八、实际使用场景与组合示例

1. 向下填充公式(fill down)——最典型用法,公式相对引用自动随行调整:

gog sheets copy-paste 1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms \ 'Sheet1!A2:H71' 'Sheet1!A2:H120' --type FORMULA

2. 复制纯值(去公式化)——把计算区域固化为数值:

gog sheets copy-paste <spreadsheetId> 'Sheet1!B2:B100' 'Sheet1!C2:C100' --type VALUES

3. 仅搬格式到更大的目标区(格式平铺扩展):

gog sheets copy-paste <spreadsheetId> 'Sheet1!A1:H1' 'Sheet1!A1:H50' --type FORMAT

4. 行列转置

gog sheets copy-paste <spreadsheetId> 'Sheet1!A1:C10' 'Sheet1!E1:M3' --transpose

5. 带数据验证的下拉规则复制

gog sheets copy-paste <spreadsheetId> 'Sheet1!B2:B30' 'Sheet1!D2:D60' --type DATA_VALIDATION

6. 脚本安全预演——配合--dry-run--json先看将要发生的变更,再真正执行:

gog sheets copy-paste <spreadsheetId> 'Sheet1!A1:A10' 'Sheet1!A1:A100' --type FORMULA --dry-run --json

九、底层调用链速览

一次copy-paste的完整数据流(对应 internal/cmd/sheets_copy_paste.go#L25-L132):

gog sheets copy-paste └─ normalizePasteType / cleanRange / parseSheetRange 参数清洗与 A1 解析 └─ runSheetsMutation (dry-run → 选账户 → sheetsService) └─ fetchSpreadsheetRangeCatalog 拉取表 ID 目录(含 grid 尺寸) └─ gridRangeFromMap + boundGridRangeToSheet 解析 SheetId、越界裁剪 └─ sheets.CopyPasteRequest{Source, Destination, PasteType, PasteOrientation} └─ (携带验证时) sheetsvalidation.BuildCopyRequests 追加表格验证复制请求 └─ Spreadsheets.BatchUpdate 单批原子提交 └─ 输出:文本行 "Copied src → dest (TYPE)" 或 JSON 载荷
  • 结果文本:Copied Sheet1!A2:H71 → Sheet1!A2:H120 (PASTE_FORMULA)
  • JSON 载荷字段:sourcedesttypePASTE_*形式)、orientationNORMAL/TRANSPOSE)、tableManagedValidationRequests(补充的表格验证请求数)。

十、常见错误与排查

错误信息原因与处理
empty spreadsheetId/empty source range/empty dest range必填参数为空,检查位置参数是否传全(源码 sheets_copy_paste.go#L29-L37)
invalid --type "X" (...)--type不在白名单内;大小写不敏感、PASTE_前缀可选(sheets_copy_paste.go#L143-L155),退出码 2 且不发请求
copying validation into table column ... requires a table-column source把普通验证复制进表格列但源不是表格列(copy.go#L54-L61)
copying ordinary cell validation into table column ... is not supported普通单元格验证复制进表格列,属显式不支持(copy.go#L63-L79)
未知工作表名source/dest的表名不存在于目录映射,检查表名拼写与引号
越界报错使用boundGridRangeToSheet自动补全未指定行列;若仍越界,检查目标尺寸与源/转置尺寸是否匹配

结语

gog sheets copy-paste用一个命令把 Google Sheets API 的CopyPaste能力封装成了可脚本化的终端工具:支持 7 种粘贴类型、目标区自动平铺填充(fill down/across)、一键转置,并针对表格列的数据验证做了源码级的边界保护,配合--dry-run--json--plain等输出控制可以无缝嵌入自动化流水线。如需查看同族命令,可继续阅读 gog sheets 与 命令索引。

【免费下载链接】gogcliGoogle Workspace in your terminal.项目地址: https://gitcode.com/GitHub_Trending/gogcl/gogcli

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

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

立即咨询