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外,它还提供两个便捷别名:fill与copy-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 | 值 + 公式 + 格式 + 数据验证,等价于界面里普通粘贴 |
VALUES | PASTE_VALUES | 仅粘贴值(公式求值结果),不携带格式 |
FORMAT | PASTE_FORMAT | 仅粘贴格式(颜色、边框、字体等),不改动数据 |
FORMULA | PASTE_FORMULA | 仅粘贴公式,且相对引用会按目标位置自动调整 |
NO_BORDERS | PASTE_NO_BORDERS | 类似 NORMAL 但不携带边框 |
DATA_VALIDATION | PASTE_DATA_VALIDATION | 仅粘贴数据验证规则(下拉、数字范围等) |
CONDITIONAL_FORMATTING | PASTE_CONDITIONAL_FORMATTING | 仅粘贴条件格式规则 |
源码 internal/cmd/sheets_copy_paste.go#L143-L155 中的normalizePasteType做了三项归一化:
- 输入先
strings.ToUpper+TrimSpace,所以--type values、--type VALUES等价; - 自动剥掉可选的
PASTE_前缀(--type PASTE_FORMAT合法); - 白名单之外的值直接报错:
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 FORMULAdest中的!在部分 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_NORMAL、PASTE_FORMAT、PASTE_NO_BORDERS、PASTE_DATA_VALIDATION四种),命令会额外执行表格感知的验证规则复制:
fetchTableValidationSpans拉取工作表中**表格(Table)列的验证规则区间;resolveTableValidationCopyOptions计算复制选项(internal/cmd/sheets_validation.go#L503-L519 等);sheetsvalidation.BuildCopyRequests在 internal/sheetsvalidation/copy.go#L32-L91 中规划补充请求,把源区的普通验证单元与目标区表格列验证做差分处理;- 追加进同一批
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))。
六、区域解析与越界裁剪
在发起请求前,命令会做两轮区域处理:
parseSheetRange解析 A1 表示法为结构化行列(internal/cmd/sheets_validation.go#L666);gridRangeFromMap结合fetchSpreadsheetRangeCatalog拉取的工作表目录(SheetIDsByTitle,见 internal/cmd/sheets_range_resolve.go#L23-L73),把 A1 中的表名解析为数字SheetId;boundGridRangeToSheet(internal/cmd/sheets_validation.go#L422-L440)负责越界裁剪:当范围未显式指定结束行/列时,自动用该工作表GridProperties的RowCount/ColumnCount补全,避免 API 报"超出网格范围"。
其中normalizeGoogleID(internal/cmd/googleid.go#L10)会清理用户粘贴的 spreadsheetId,支持带协议/路径的完整 URL 形式,方便直接复制浏览器地址栏中的表格链接作为第一个参数。
七、完整 Flags 参考
所有全局 flags 均适用于本命令,以下为高价值项(完整表格见 docs/commands/gog-sheets-copy-paste.md):
| Flag | 类型 | 默认 | 说明 |
|---|---|---|---|
--type | string | NORMAL | 粘贴类型:NORMAL、VALUES、FORMAT、FORMULA、NO_BORDERS、DATA_VALIDATION、CONDITIONAL_FORMATTING(命令专属) |
--transpose | bool | false | 转置粘贴(命令专属) |
-n/--dry-run/--noop/--preview | bool | 不真正修改表格,打印预期操作并成功退出(见runSheetsMutation中的dryRunExit) | |
-a/--account/--acct | string | 指定账户邮箱、别名或auto | |
--client | string | OAuth client 名称(选择对应凭证与 token 桶) | |
-j/--json/--machine | bool | false | JSON 输出到 stdout(脚本友好) |
-p/--plain/--tsv | bool | false | 稳定的 TSV 文本输出,无颜色 |
--results-only | bool | JSON 模式只输出主结果,丢弃nextPageToken等信封字段 | |
--select/--pick/--project | string | JSON 模式下选择逗号分隔字段(支持点路径) | |
-y/--force/--assume-yes | bool | 跳过破坏性命令确认 | |
--readonly | bool | false | 运行时拦截一切变更 API 请求(本命令会直接失败) |
--no-input/--non-interactive | bool | 永不提示,改为失败(CI 场景) | |
--quota-project | string | 计费项目(作为X-Goog-User-Project头发送) | |
--access-token | string | 直接使用传入的 access token(绕过存储的 refresh token,约 1 小时过期) | |
--disable-commands/--enable-commands/--enable-commands-exact | string | 逗号分隔的命令启用/禁用(支持点路径),可用来在受限环境中精确放行sheets.copy-paste | |
--gmail-no-send | bool | false | 阻止 Gmail 发送操作(Agent 安全) |
--home | string | 覆盖 gogcli 配置/数据/状态/缓存根目录(等价于GOG_HOME) | |
-v/--verbose | bool | 打开详细日志 | |
-h/--help | 上下文相关帮助 | ||
--version | 打印版本并退出 |
八、实际使用场景与组合示例
1. 向下填充公式(fill down)——最典型用法,公式相对引用自动随行调整:
gog sheets copy-paste 1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms \ 'Sheet1!A2:H71' 'Sheet1!A2:H120' --type FORMULA2. 复制纯值(去公式化)——把计算区域固化为数值:
gog sheets copy-paste <spreadsheetId> 'Sheet1!B2:B100' 'Sheet1!C2:C100' --type VALUES3. 仅搬格式到更大的目标区(格式平铺扩展):
gog sheets copy-paste <spreadsheetId> 'Sheet1!A1:H1' 'Sheet1!A1:H50' --type FORMAT4. 行列转置:
gog sheets copy-paste <spreadsheetId> 'Sheet1!A1:C10' 'Sheet1!E1:M3' --transpose5. 带数据验证的下拉规则复制:
gog sheets copy-paste <spreadsheetId> 'Sheet1!B2:B30' 'Sheet1!D2:D60' --type DATA_VALIDATION6. 脚本安全预演——配合--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 载荷字段:
source、dest、type(PASTE_*形式)、orientation(NORMAL/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),仅供参考