rubric
是教师在为学生评分时可以使用的模板
提交内容。借助 Classroom API,您可以代表
管理这些评分准则。
图 1. 查看 Google 课堂作业中的评分准则示例。
本指南介绍了 Rubrics API 的基本概念和功能。请参阅 这些帮助中心文章,详细了解 评分准则的结构以及如何根据评分准则 评分在 Google 课堂界面中完成。
前提条件
本指南假定您满足以下条件:
- Python 3.8.6 或更高版本
- pip 软件包管理工具
- 具有一个 Google Cloud 项目。
- 拥有 Google 课堂的 Google Workspace 教育版账号 启用。
- 至少包含一个测试学生账号的测试课程。如果您没有 可用于测试的课堂课程 在界面中创建一个 添加测试学生。
为桌面应用授权凭据
如需以最终用户身份进行身份验证并访问应用中的用户数据,您需要创建一个或多个 OAuth 2.0 客户端 ID。客户端 ID 用于标识 连接到 Google OAuth 服务器。如果您的应用在多个平台上运行 您必须为每个平台创建一个单独的客户端 ID。
- 前往 Google Cloud 中的“凭据”页面, Google Cloud 控制台。
- 点击创建凭据 >OAuth 客户端 ID。
- 点击应用类型 >桌面应用。
- 在名称字段中,输入凭据的名称。只有 显示在 Google Cloud 控制台中。例如,“评分准则预览客户端”。
- 点击创建。此时会显示“已创建 OAuth 客户端”屏幕,其中会显示您的新 客户端 ID 和客户端密钥。
- 点击下载 JSON,然后点击确定。新创建的凭据 显示在 OAuth 2.0 客户端 ID 下。
- 将下载的 JSON 文件保存为
credentials.json
,并将该文件移至 工作目录 - 点击创建凭据 >API 密钥,并记下 API 密钥。
如需了解详情,请参阅创建访问凭据。
配置 OAuth 范围
根据您的项目的现有 OAuth 范围,您可能需要配置 附加范围。
- 前往 OAuth 同意屏幕。
- 点击修改应用 >保存并继续以转到“范围”屏幕。
- 点击添加或移除范围。
- 如果您还没有以下范围,请添加:
https://www.googleapis.com/auth/classroom.coursework.students
https://www.googleapis.com/auth/classroom.courses
- 然后点击“更新”>保存并继续 >保存并继续 > 返回信息中心。
如需了解详情,请参阅配置 OAuth 权限请求页面 。
classroom.coursework.students
范围允许对
评分准则(以及对 CourseWork
的访问权限)和 classroom.courses
范围
提供读写课程
参考文档中列出了给定方法所需的范围
方法。请参阅 courses.courseWork.rubrics.create
授权范围
示例。您可以在适用于 Google 的 OAuth 2.0 范围中查看所有 Google 课堂范围
API。由于 API 仍处于预览版阶段,因此我们未在此处提及评分准则。
配置示例
在您的工作目录中,安装适用于 Python 的 Google 客户端库:
pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
创建一个名为 main.py
的文件,用于构建客户端库并为
使用您的 API 密钥代替 YOUR_API_KEY
:
import json
import os.path
from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
# If modifying these scopes, delete the file token.json.
SCOPES = ['https://www.googleapis.com/auth/classroom.courses',
'https://www.googleapis.com/auth/classroom.coursework.students']
def build_authenticated_service(api_key):
"""Builds the Classroom service."""
creds = None
# The file token.json stores the user's access and refresh tokens, and is
# created automatically when the authorization flow completes for the first
# time.
if os.path.exists('token.json'):
creds = Credentials.from_authorized_user_file('token.json', SCOPES)
# If there are no (valid) credentials available, let the user log in.
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
'credentials.json', SCOPES)
creds = flow.run_local_server(port=0)
# Save the credentials for the next run.
with open('token.json', 'w') as token:
token.write(creds.to_json())
try:
# Build the Classroom service.
service = build(
serviceName="classroom",
version="v1",
credentials=creds,
discoveryServiceUrl=f"https://classroom.googleapis.com/$discovery/rest?labels=DEVELOPER_PREVIEW&key={api_key}")
return service
except HttpError as error:
print('An error occurred: %s' % error)
if __name__ == '__main__':
service = build_authenticated_service(YOUR_API_KEY)
使用 python main.py
运行脚本。系统会提示您登录并
同意 OAuth 范围。
创建作业
评分准则与作业(即CourseWork
)相关联,并且
在该 CourseWork
的上下文中有意义。评分准则只能由以下人员创建:
创建父级 CourseWork
项的 Google Cloud 项目。对于
请使用脚本创建新的 CourseWork
分配。
将以下内容添加到 main.py
中:
def get_latest_course(service):
"""Retrieves the last created course."""
try:
response = service.courses().list(pageSize=1).execute()
courses = response.get("courses", [])
if not courses:
print("No courses found. Did you remember to create one in the UI?")
return
course = courses[0]
return course
except HttpError as error:
print(f"An error occurred: {error}")
return error
def create_coursework(service, course_id):
"""Creates and returns a sample coursework."""
try:
coursework = {
"title": "Romeo and Juliet analysis.",
"description": """Write a paper arguing that Romeo and Juliet were
time travelers from the future.""",
"workType": "ASSIGNMENT",
"state": "PUBLISHED",
}
coursework = service.courses().courseWork().create(
courseId=course_id, body=coursework).execute()
return coursework
except HttpError as error:
print(f"An error occurred: {error}")
return error
现在,更新 main.py
以检索您刚刚完成的测试类的 course_id
创建一份新的作业示例,然后检索该作业的
coursework_id
:
if __name__ == '__main__':
service = build_authenticated_service(YOUR_API_KEY)
course = get_latest_course(service)
course_id = course.get("id")
course_name = course.get("name")
print(f"'{course_name}' course ID: {course_id}")
coursework = create_coursework(service, course_id)
coursework_id = coursework.get("id")
print(f"Assignment created with ID {coursework_id}")
#TODO(developer): Save the printed course and coursework IDs.
保存 course_id
和 coursework_id
。所有评分准则 CRUD 都需要
操作。
现在,Google 课堂中应该有一个示例 CourseWork
。
图 2. 查看 Google 课堂中的作业示例。
创建评分准则
现在,您可以开始管理评分准则了。
您可以在 CourseWork
上通过包含Create
完整的评分准则对象,其中省略了条件和等级的 ID 属性
(系统会在创建时生成)。
将以下函数添加到 main.py
:
def create_rubric(service, course_id, coursework_id):
"""Creates an example rubric on a coursework."""
try:
body = {
"criteria": [
{
"title": "Argument",
"description": "How well structured your argument is.",
"levels": [
{"title": "Convincing",
"description": "A compelling case is made.", "points": 30},
{"title": "Passable",
"description": "Missing some evidence.", "points": 20},
{"title": "Needs Work",
"description": "Not enough strong evidence..", "points": 0},
]
},
{
"title": "Spelling",
"description": "How well you spelled all the words.",
"levels": [
{"title": "Perfect",
"description": "No mistakes.", "points": 20},
{"title": "Great",
"description": "A mistake or two.", "points": 15},
{"title": "Needs Work",
"description": "Many mistakes.", "points": 5},
]
},
{
"title": "Grammar",
"description": "How grammatically correct your sentences are.",
"levels": [
{"title": "Perfect",
"description": "No mistakes.", "points": 20},
{"title": "Great",
"description": "A mistake or two.", "points": 15},
{"title": "Needs Work",
"description": "Many mistakes.", "points": 5},
]
},
]
}
rubric = service.courses().courseWork().rubrics().create(
courseId=course_id, courseWorkId=coursework_id, body=body,
# Specify the preview version. Rubrics CRUD capabilities are
# supported in V1_20231110_PREVIEW and later.
previewVersion="V1_20231110_PREVIEW"
).execute()
print(f"Rubric created with ID {rubric.get('id')}")
return rubric
except HttpError as error:
print(f"An error occurred: {error}")
return error
然后,使用您的 Course
更新并运行 main.py
,以创建评分准则示例。
和之前的 CourseWork
ID:
if __name__ == '__main__':
service = build_authenticated_service(YOUR_API_KEY)
rubric = create_rubric(service, YOUR_COURSE_ID, YOUR_COURSEWORK_ID)
print(json.dumps(rubric, indent=4))
关于评分准则表示形式的一些要点:
- 条件和等级顺序会反映在 Google 课堂界面中。
- 计分等级(具有
points
属性的等级)必须按积分排序 按升序或降序排序(不能随机排序)。 - 教师可以对评分标准和评分等级进行重新排序(但不能对未评分等级进行重新排序) 它们会改变它们在数据中的顺序。
有关评分准则结构的更多注意事项,请参阅限制。
返回界面,您应该会在作业中看到评分准则。
图 3. 查看 Google 课堂作业中的评分准则示例。
阅读评分准则
一项作业中最多只能有 1 条评分准则,因此“List
”可能看起来
不直观,但如果您还没有评分准则 ID,这会很有帮助。如果有
没有与 CourseWork
关联的评分准则,List
响应为空。
将以下函数添加到 main.py
:
def get_rubric(service, course_id, coursework_id):
"""
Get the rubric on a coursework. There can only be at most one.
Returns null if there is no rubric.
"""
try:
response = service.courses().courseWork().rubrics().list(
courseId=course_id, courseWorkId=coursework_id,
# Specify the preview version. Rubrics CRUD capabilities are
# supported in V1_20231110_PREVIEW and later.
previewVersion="V1_20231110_PREVIEW"
).execute()
rubrics = response.get("rubrics", [])
if not rubrics:
print("No rubric found for this assignment.")
return
rubric = rubrics[0]
return rubric
except HttpError as error:
print(f"An error occurred: {error}")
return error
更新并运行 main.py
以获取您添加的评分准则:
if __name__ == '__main__':
service = build_authenticated_service(YOUR_API_KEY)
rubric = get_rubric(service, YOUR_COURSE_ID, YOUR_COURSEWORK_ID)
print(json.dumps(rubric, indent=4))
#TODO(developer): Save the printed rubric ID.
在后续步骤中,请记下评分准则中的 id
属性。
拥有评分准则 ID 后,Get
可以正常运行。在函数中使用 Get
可能如下所示:
def get_rubric(service, course_id, coursework_id, rubric_id):
"""
Get the rubric on a coursework. There can only be at most one.
Returns a 404 if there is no rubric.
"""
try:
rubric = service.courses().courseWork().rubrics().get(
courseId=course_id,
courseWorkId=coursework_id,
id=rubric_id,
# Specify the preview version. Rubrics CRUD capabilities are
# supported in V1_20231110_PREVIEW and later.
previewVersion="V1_20231110_PREVIEW"
).execute()
return rubric
except HttpError as error:
print(f"An error occurred: {error}")
return error
如果没有评分准则,此实现会返回 404。
更新评分准则
可通过 Patch
调用来完成评分准则的更新。由于结构复杂
因此必须以“读取-修改-写入”模式完成更新
替换整个 criteria
属性。
更新规则如下:
- 系统会将添加时不含 ID 的条件或等级视为条件 additions。
- 会考虑之前缺失的标准或等级 删除。
- 系统会将已有 ID 但数据经过修改的条件或级别纳入考虑范围 修改。未修改的属性将保持不变。
- 系统会将带有新 ID 或未知 ID的标准或等级视为条件 错误。
- 系统会将新标准和等级的顺序视为新的界面顺序。 (需遵循上述限制)。
添加一个用于更新评分准则的函数:
def update_rubric(service, course_id, coursework_id, rubric_id, body):
"""
Updates the rubric on a coursework.
"""
try:
rubric = service.courses().courseWork().rubrics().patch(
courseId=course_id,
courseWorkId=coursework_id,
id=rubric_id,
body=body,
updateMask='criteria',
# Specify the preview version. Rubrics CRUD capabilities are
# supported in V1_20231110_PREVIEW and later.
previewVersion="V1_20231110_PREVIEW"
).execute()
return rubric
except HttpError as error:
print(f"An error occurred: {error}")
return error
在此示例中,指定 criteria
字段以使用
updateMask
。
然后修改 main.py
,针对上述每项更新进行更改
规则:
if __name__ == '__main__':
service = build_authenticated_service(YOUR_API_KEY)
# Get the latest rubric.
rubric = get_rubric(service, YOUR_COURSE_ID, YOUR_COURSEWORK_ID)
criteria = rubric.get("criteria")
"""
The "criteria" property should look like this:
[
{
"id": "NkEyMdMyMzM2Nxkw",
"title": "Argument",
"description": "How well structured your argument is.",
"levels": [
{
"id": "NkEyMdMyMzM2Nxkx",
"title": "Convincing",
"description": "A compelling case is made.",
"points": 30
},
{
"id": "NkEyMdMyMzM2Nxky",
"title": "Passable",
"description": "Missing some evidence.",
"points": 20
},
{
"id": "NkEyMdMyMzM2Nxkz",
"title": "Needs Work",
"description": "Not enough strong evidence..",
"points": 0
}
]
},
{
"id": "NkEyMdMyMzM2Nxk0",
"title": "Spelling",
"description": "How well you spelled all the words.",
"levels": [...]
},
{
"id": "NkEyMdMyMzM2Nxk4",
"title": "Grammar",
"description": "How grammatically correct your sentences are.",
"levels": [...]
}
]
"""
# Make edits. This example will make one of each type of change.
# Add a new level to the first criteria. Levels must remain sorted by
# points.
new_level = {
"title": "Profound",
"description": "Truly unique insight.",
"points": 50
}
criteria[0]["levels"].insert(0, new_level)
# Remove the last criteria.
del criteria[-1]
# Update the criteria titles with numeric prefixes.
for index, criterion in enumerate(criteria):
criterion["title"] = f"{index}: {criterion['title']}"
# Resort the levels from descending to ascending points.
for criterion in criteria:
criterion["levels"].sort(key=lambda level: level["points"])
# Update the rubric with a patch call.
new_rubric = update_rubric(
service, YOUR_COURSE_ID, YOUR_COURSEWORK_ID, YOUR_RUBRIC_ID, rubric)
print(json.dumps(new_rubric, indent=4))
现在,相应更改应该已反映在 Google 课堂中。
图 4. 更新后的评分准则的视图。
查看根据评分准则打分的提交内容
目前,API 还不能使用评分准则对学生提交的作业进行评分,但是您可以 对于已使用评分准则打分的提交的作业,您可以在 “课堂”界面
以学生身份在 Google 课堂界面中,完成并上交示例作业。 然后,以教师身份手动使用评分准则为作业评分。
图 5. 教师评分时可以查看的评分准则。
使用评分准则评分的学生提交的作业有两个新报告:
属性:draftRubricGrades
和 assignedRubricGrades
,分别表示
教师在草稿阶段选择的分值和等级,并给出评分
状态。
此外,学生提交的带有相关评分准则的内容会包含 rubricId
字段,即使在评分之前。这表示与
CourseWork
,如果教师删除并重新创建
评分准则。
您可以使用现有的 studentSubmissions.Get
和
使用 studentSubmissions.List
方法查看已评分的提交内容。
将以下函数添加到 main.py
以列出学生提交的作业:
def get_latest_submission(service, course_id, coursework_id):
"""Retrieves the last submission for an assignment."""
try:
response = service.courses().courseWork().studentSubmissions().list(
courseId = course_id,
courseWorkId = coursework_id,
pageSize=1,
# Specify the preview version. Rubrics CRUD capabilities are
# supported in V1_20231110_PREVIEW and later.
previewVersion="V1_20231110_PREVIEW"
).execute()
submissions = response.get("studentSubmissions", [])
if not submissions:
print(
"""No submissions found. Did you remember to turn in and grade
the assignment in the UI?""")
return
submission = submissions[0]
return submission
except HttpError as error:
print(f"An error occurred: {error}")
return error
然后更新并运行 main.py
,以查看提交作业的成绩。
if __name__ == '__main__':
service = build_authenticated_service(YOUR_API_KEY)
submission = get_latest_submission(
service, YOUR_COURSE_ID, YOUR_COURSEWORK_ID)
print(json.dumps(submission, indent=4))
draftRubricGrades
和 assignedRubricGrades
包含:
- 相应评分准则标准的
criterionId
。 - 教师为每个评分标准分配的
points
。可能来自 但教师也可能会覆盖此设置 - 为每条条件选择的等级的
levelId
。如果老师没有 选择一个级别,但仍为标准分配了分,此字段为 不存在。
这些列表中仅包含教师
选择了一个级别或设置分数。例如,如果某位教师选择
与评分标准中的一个评分标准:draftRubricGrades
和
assignedRubricGrades
将只有一项,即使评分准则中有很多项
条件。
删除评分准则
您可以使用标准 Delete
请求删除评分准则。以下代码
显示了一个完整性函数示例,但由于评分已有
您不能删除当前的评分准则:
def delete_rubric(service, course_id, coursework_id, rubric_id):
"""Deletes the rubric on a coursework."""
try:
service.courses().courseWork().rubrics().delete(
courseId=course_id,
courseWorkId=coursework_id,
id=rubric_id,
# Specify the preview version. Rubrics CRUD capabilities are
# supported in V1_20231110_PREVIEW and later.
previewVersion="V1_20231110_PREVIEW"
).execute()
except HttpError as error:
print(f"An error occurred: {error}")
return error
导出和导入评分准则
您可以手动将评分准则导出到 Google 供教师重复使用的电子表格。
除了在代码中指定评分准则标准之外,您还可以
您可以在这些导出的工作表中更新评分准则,只需指定
sourceSpreadsheetId
(而非 criteria
):
def create_rubric_from_sheet(service, course_id, coursework_id, sheet_id):
"""Creates an example rubric on a coursework."""
try:
body = {
"sourceSpreadsheetId": sheet_id
}
rubric = service.courses().courseWork().rubrics().create(
courseId=course_id, courseWorkId=coursework_id, body=body,
# Specify the preview version. Rubrics CRUD capabilities are
# supported in V1_20231110_PREVIEW and later.
previewVersion="V1_20231110_PREVIEW"
).execute()
print(f"Rubric created with ID {rubric.get('id')}")
return rubric
except HttpError as error:
print(f"An error occurred: {error}")
return error
反馈
如果您发现任何问题或有意见,欢迎分享反馈。