gogcli 实战:使用gog classroom submissions get在终端中查询学生提交详情
【免费下载链接】gogcliGoogle Workspace in your terminal.项目地址: https://gitcode.com/GitHub_Trending/gogcl/gogcli
本文是 gogcli(Google Workspace in your terminal)Classroom 命令族的实战指南,聚焦于gog classroom submissions get这一只读查询命令:它通过 Google Classroom API 按课程、作业与提交标识获取单个学生提交(Student Submission)的完整状态,包括提交状态(state)、是否迟交(late)、草稿成绩与已评定成绩(draft/assigned grade)等核心字段。读完本文,你将掌握该命令的完整语法、输出格式、常用 Flag 用法,并能结合源码理解其底层实现与常见错误处理策略,从而在脚本或自动化工作流中可靠地查询提交状态。
命令定位:Classroom 命令族中的只读查询入口
gog classroom submissions get位于 gogcli 的 classroom 子命令体系中。在命令族定义中,ClassroomCmd聚合了 courses、coursework、submissions、announcements 等十余个功能域,其中ClassroomSubmissionsCmd统一管理学生提交相关操作:
list(别名ls):列出学生提交(参考文档)get(别名info、show):获取单个学生提交(即本文主题)turn-in(别名turnin):交卷reclaim(别名undo):撤回提交return(别名send):返回提交grade(别名set、edit):设置草稿/已评定成绩
从源码角度看,get只调用 Google Classroom API 的StudentSubmissions.Get方法(只读操作),因此它天然适合与--readonly这类安全 Flag 组合使用,是巡检提交状态、编写脚本的理想入口。其兄弟命令的文档与定位详见 gog classroom submissions 总览。
使用语法与位置参数
命令的基本语法如下(括号内为可选别名,尖括号内为必填位置参数):
gog classroom (class) submissions (submission) get (info,show) <courseId> <courseworkId> <submissionId>三个位置参数缺一不可,其含义为:
| 参数 | 含义 | 说明 |
|---|---|---|
courseId | 课程 ID | 课程标识符或别名,来自gog classroom courses list |
courseworkId | 作业 ID | 该课程下的作业(CourseWork)标识符 |
submissionId | 提交 ID | 学生提交(StudentSubmission)标识符 |
在实际运行前,命令会先做参数校验:在 ClassroomSubmissionsGetCmd.Run 的实现 中,三个参数都会先经strings.TrimSpace去空白,任何一个为空都会返回usage错误(如empty courseId、empty courseworkId、empty submissionId),避免带着空参数发起无意义的 API 请求。
如何拿到这三个 ID
通常的工作流是先用列表命令找到目标:
# 1. 查看课程 gog classroom courses list # 2. 查看某课程下的作业 gog classroom coursework list <courseId> # 3. 查看某作业下的所有提交(含 submissionId) gog classroom submissions list <courseId> <courseworkId>列表命令支持--state、--user、--late、--max等过滤条件(详见 gog classroom submissions list 文档),可以快速定位到目标提交,再用get查看其完整状态。
输出格式:默认文本、JSON 与 TSV
get命令的输出模式受全局 Flag 控制,默认情况下输出为稳定的「字段名\t字段值」文本行。依据源码输出逻辑,默认输出包含以下字段:
| 输出字段 | 说明 | 输出条件 |
|---|---|---|
id | 提交 ID | 总是输出 |
user_id | 提交学生用户 ID | 总是输出 |
state | 提交状态 | 总是输出 |
late | 是否迟交(true/false) | 总是输出 |
draft_grade | 草稿成绩 | 总是输出(空值显示为空) |
assigned_grade | 已评定成绩 | 总是输出(空值显示为空) |
updated | 更新时间(RFC3339) | 仅当 API 返回 UpdateTime 非空时 |
link | 网页端替代链接(AlternateLink) | 仅当 API 返回 AlternateLink 非空时 |
成绩字段经过formatFloatValue格式化(见 classroom_helpers.go),会去掉多余的尾随零(例如5.50显示为5.5),便于阅读与二次解析。
JSON 模式:脚本化首选
添加-j/--json/--machine后,命令输出标准的 JSON 结构,外层包裹一个submission键:
gog classroom submissions get -j <courseId> <courseworkId> <submissionId>{ "submission": { "id": "123456789", "userId": "student@example.com", "state": "TURNED_IN", "late": false, "draftGrade": 9.5, "assignedGrade": 10, "updateTime": "2026-09-10T08:30:00Z", "alternateLink": "https://classroom.google.com/c/..." } }JSON 模式与--results-only(只输出主结果,丢弃 envelope 字段)、--select(按逗号分隔字段选择输出,支持点路径)可组合使用,便于在 jq 等工具中进一步加工。
其他输出相关 Flag
-p/--plain/--tsv:输出稳定、可解析的 TSV 文本,无颜色渲染,适合 CI 与管道处理。--color(默认auto):控制颜色输出,可选auto|always|never。--wrap-untrusted:在 JSON/raw 输出中,为外部获取的文本字段加上不受信内容标记。
全局 Flag 一览
get命令继承 gogcli 全部根级 Flag,下表为完整清单(取自命令参考文档):
| Flag | Type | Default | Help |
|---|---|---|---|
--access-token | string | Use provided access token directly (bypasses stored refresh tokens; token expires in ~1h) | |
-a--account--acct | string | Account email, alias, or auto for authenticated Google API commands | |
--client | string | OAuth client name (selects stored credentials + token bucket) | |
--color | string | auto | Color output: auto|always|never |
--disable-commands | string | Comma-separated list of disabled commands; dot paths allowed | |
-n--dry-run--dryrun--noop--preview | bool | Do not make changes; print intended actions and exit successfully | |
--enable-commands | string | Comma-separated list of enabled command prefixes; dot paths allowed (restricts CLI) | |
--enable-commands-exact | string | Comma-separated list of exact enabled commands; dot paths allowed and parent commands do not enable children | |
-y--force--assume-yes--yes | bool | Skip confirmations for destructive commands | |
--gmail-no-send | bool | false | Block Gmail send operations (agent safety) |
-h--help | kong.helpFlag | Show context-sensitive help. | |
--home | string | Override gogcli config/data/state/cache root (equivalent to GOG_HOME) | |
-j--json--machine | bool | false | Output JSON to stdout (best for scripting) |
--no-input--non-interactive--noninteractive | bool | Never prompt; fail instead (useful for CI) | |
-p--plain--tsv | bool | false | Output stable, parseable text to stdout (TSV; no colors) |
--quota-project | string | Google Cloud project to bill for API usage (sent as X-Goog-User-Project; some APIs require it with --access-token or ADC) | |
--readonly | bool | false | Block mutating API requests at runtime; auth add also requests read-only OAuth scopes |
--results-only | bool | In JSON mode, emit only the primary result (drops envelope fields like nextPageToken) | |
--select--pick--project | string | In JSON mode, select comma-separated fields (best-effort; supports dot paths). Desire path: use --fields for most commands. | |
-v--verbose | bool | Enable verbose logging | |
--version | kong.VersionFlag | Print version and exit | |
--wrap-untrusted | bool | false | In JSON/raw output, wrap fetched text fields in external untrusted-content markers |
几个与本命令强相关的 Flag 使用建议:
--account/--acct:指定账户邮箱或别名;未指定时使用默认账户。get是认证命令,通过requireAccount(flags)解析账户。--access-token:直接使用提供的访问令牌,绕过存储的刷新令牌(注意令牌约 1 小时过期),适合临时凭据场景。--quota-project:指定用于 API 配额计费的 Google Cloud 项目(以X-Goog-User-Project头发送),某些 API 在使用--access-token或 ADC 时必须配置。--readonly:在运行时拦截所有变更类 API 请求,且auth add时只申请只读 OAuth scope;get为只读操作,与该 Flag 天然兼容。--no-input/--non-interactive:CI 环境下禁止交互提示,遇到需要确认的场景直接失败。
源码级原理:一条命令的完整调用链
理解底层实现有助于判断命令行为与排障。get的完整调用链如下:
- 账户解析:
Run方法首先调用requireAccount(flags)确定使用哪个 Google 账户(对应internal/cmd/classroom_submissions.go中ClassroomSubmissionsGetCmd.Run)。 - 服务构建:通过
classroomService(ctx, account)创建 Classroom API 服务客户端。其底层实现在 internal/googleapi/classroom.go,即NewClassroom使用googleauth.ServiceClassroom服务名注册表创建classroom.NewService,按账户隔离凭据与令牌桶。 - 参数校验:三个位置参数去空白后逐一非空校验,空值直接返回 usage 错误。
- API 调用:执行
svc.Courses.CourseWork.StudentSubmissions.Get(courseID, courseworkID, submissionID).Context(ctx).Do(),即 Google Classroom API 的courses.courseWork.studentSubmissions.get接口。 - 错误包装:失败时经
wrapClassroomError统一包装(见 classroom_helpers.go),对两类典型错误给出可执行提示。 - 输出:按 JSON 或默认文本模式渲染结果。
值得注意的是,整个调用链与turn-in、reclaim、return、grade共享同一套账户解析与服务构建逻辑(见 classroom_submissions.go 中submissionAction与ClassroomSubmissionsGradeCmd),而grade还会通过buildClassroomSubmissionGradePlan生成 updateMask 后调用Patch(相关单测见 classroom_submissions_plan_test.go),说明 gogcli 对提交域的操作采用统一的规划-执行模式,get是其只读端点。
错误处理与排障指南
依据 wrapClassroomError 的实现,get命令会针对两类高频错误输出可执行的修复提示:
- Classroom API 未启用:当错误信息包含
accessNotConfigured或Classroom API has not been used时,提示需要在 Google Cloud Console 中启用 Classroom API(classroom.googleapis.com)。 - 权限不足:当错误信息包含
insufficientPermissions或insufficient authentication scopes时,提示使用gog auth add <account> --services classroom重新认证以获取 Classroom 相关 OAuth scope。
其他常见问题:
- 参数错误:任何 ID 为空都会立即返回 usage 错误(
empty courseId等),不会发起网络请求,可通过-h查看帮助确认参数顺序。 - 找不到提交:若
courseId、courseworkId、submissionId组合不匹配(例如提交不属于该作业),API 会返回 NOT_FOUND 类错误,此时建议用list复核 ID。 - CI 场景:搭配
-j --no-input可避免任何交互阻塞;若需要在无结果场景下区分成功/失败,可参考list的--fail-empty语义设计自己的退出码判断。
实战示例
# 默认文本输出 gog classroom submissions get 123456789 cw-001 sub-001 # 输出示例(文本模式) # id sub-001 # user_id student@example.com # state TURNED_IN # late false # draft_grade 9.5 # assigned_grade 10 # updated 2026-09-10T08:30:00Z # link https://classroom.google.com/c/... # JSON 输出,供 jq 消费 gog classroom submissions get -j 123456789 cw-001 sub-001 | jq '.submission.state' # 指定账户 + 明文 TSV gog classroom submissions get -p --account teacher@school.edu 123456789 cw-001 sub-001从仓库中的实时测试脚本可看到该命令族的端到端验证方式:scripts/live-tests/classroom.sh中会先创建课程与作业,再执行gog classroom submissions list "$course_id" "$cw_id" --max 1 --json获取提交列表,为get类命令准备测试数据,这同样是一套可参考的「先 list 再 get」实战流程。
小结
gog classroom submissions get是 gogcli Classroom 提交域中轻量、只读、适合脚本化的查询端点。它用三个 ID 精确定位提交,默认输出稳定文本、可选 JSON/TSV 模式,并内置了针对「API 未启用」「权限不足」两类高频错误的可执行提示。结合其兄弟命令list/grade/return等(见 命令索引),可以在终端中完成从查看提交、评定成绩到返回提交的完整教学管理闭环。
延伸阅读
- gog classroom submissions 命令族总览
- gog classroom submissions list(获取提交 ID)
- gog classroom submissions grade(设置成绩)
- gog classroom 命令族
- 提交域命令源码
- Classroom API 服务构建与错误包装 与 classroom_helpers.go
- 实时测试脚本 classroom.sh
【免费下载链接】gogcliGoogle Workspace in your terminal.项目地址: https://gitcode.com/GitHub_Trending/gogcl/gogcli
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考