开始使用评分准则

rubric是教师在为学生评分时可以使用的模板 提交内容。借助 Classroom API,您可以代表 管理这些评分准则。

Google 课堂界面中的评分准则视图 图 1. 查看 Google 课堂作业中的评分准则示例。

本指南介绍了 Rubrics API 的基本概念和功能。请参阅 这些帮助中心文章,详细了解 评分准则的结构以及如何根据评分准则 评分在 Google 课堂界面中完成。

前提条件

本指南假定您满足以下条件:

为桌面应用授权凭据

如需以最终用户身份进行身份验证并访问应用中的用户数据,您需要创建一个或多个 OAuth 2.0 客户端 ID。客户端 ID 用于标识 连接到 Google OAuth 服务器。如果您的应用在多个平台上运行 您必须为每个平台创建一个单独的客户端 ID。

  1. 前往 Google Cloud 中的“凭据”页面, Google Cloud 控制台。
  2. 点击创建凭据 >OAuth 客户端 ID
  3. 点击应用类型 >桌面应用
  4. 名称字段中,输入凭据的名称。只有 显示在 Google Cloud 控制台中。例如,“评分准则预览客户端”。
  5. 点击创建。此时会显示“已创建 OAuth 客户端”屏幕,其中会显示您的新 客户端 ID 和客户端密钥。
  6. 点击下载 JSON,然后点击确定。新创建的凭据 显示在 OAuth 2.0 客户端 ID 下。
  7. 将下载的 JSON 文件保存为 credentials.json,并将该文件移至 工作目录
  8. 点击创建凭据 >API 密钥,并记下 API 密钥。

如需了解详情,请参阅创建访问凭据

配置 OAuth 范围

根据您的项目的现有 OAuth 范围,您可能需要配置 附加范围。

  1. 前往 OAuth 同意屏幕
  2. 点击修改应用 >保存并继续以转到“范围”屏幕。
  3. 点击添加或移除范围
  4. 如果您还没有以下范围,请添加:
    • https://www.googleapis.com/auth/classroom.coursework.students
    • https://www.googleapis.com/auth/classroom.courses
  5. 然后点击“更新”>保存并继续 >保存并继续 > 返回信息中心

如需了解详情,请参阅配置 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_idcoursework_id。所有评分准则 CRUD 都需要 操作。

现在,Google 课堂中应该有一个示例 CourseWork

在 Google 课堂界面中查看作业 图 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 属性的等级)必须按积分排序 按升序或降序排序(不能随机排序)。
  • 教师可以对评分标准和评分等级进行重新排序(但不能对未评分等级进行重新排序) 它们会改变它们在数据中的顺序。

有关评分准则结构的更多注意事项,请参阅限制

返回界面,您应该会在作业中看到评分准则。

Google 课堂界面中的评分准则视图 图 3. 查看 Google 课堂作业中的评分准则示例。

阅读评分准则

可以使用标准的 ListGet 方法读取评分准则。

一项作业中最多只能有 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 属性。

更新规则如下:

  1. 系统会将添加时不含 ID 的条件或等级视为条件 additions
  2. 会考虑之前缺失的标准或等级 删除
  3. 系统会将已有 ID 但数据经过修改的条件或级别纳入考虑范围 修改。未修改的属性将保持不变。
  4. 系统会将带有新 ID 或未知 ID的标准或等级视为条件 错误
  5. 系统会将新标准和等级的顺序视为新的界面顺序。 (需遵循上述限制)。

添加一个用于更新评分准则的函数:

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 课堂中。

在 Google 课堂界面中查看更新后的评分准则 图 4. 更新后的评分准则的视图。

查看根据评分准则打分的提交内容

目前,API 还不能使用评分准则对学生提交的作业进行评分,但是您可以 对于已使用评分准则打分的提交的作业,您可以在 “课堂”界面

以学生身份在 Google 课堂界面中,完成并上交示例作业。 然后,以教师身份手动使用评分准则为作业评分

在 Google 课堂界面中查看评分准则成绩 图 5. 教师评分时可以查看的评分准则。

使用评分准则评分的学生提交的作业有两个新报告: 属性:draftRubricGradesassignedRubricGrades,分别表示 教师在草稿阶段选择的分值和等级,并给出评分 状态。

此外,学生提交的带有相关评分准则的内容会包含 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))

draftRubricGradesassignedRubricGrades 包含:

  • 相应评分准则标准的 criterionId
  • 教师为每个评分标准分配的 points。可能来自 但教师也可能会覆盖此设置
  • 为每条条件选择的等级的 levelId。如果老师没有 选择一个级别,但仍为标准分配了分,此字段为 不存在。

这些列表中仅包含教师 选择了一个级别或设置分数。例如,如果某位教师选择 与评分标准中的一个评分标准:draftRubricGradesassignedRubricGrades将只有一项,即使评分准则中有很多项 条件。

删除评分准则

您可以使用标准 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

反馈

如果您发现任何问题或有意见,欢迎分享反馈