사용자가 Google Meet에서 클래스룸을 사용 중인가요? Google Meet에서 학생의 참석 여부를 확인하는 방법 관련 Apps Script 빠른 시작을 확인하세요.

수업 과제 관리

클래스룸에는 과제 도구, 퀴즈 과제, 질문 (단답형 및 객관식), 머티리얼 등 5가지 유형의 수업 과제가 있습니다. 개발자는 현재 클래스룸 API를 통해 과제, 질문, 자료의 3가지 유형을 읽고 쓸 수 있습니다.

이 기능에 액세스하려면 마감일이나 최고 점수와 같은 추가 자료와 세부정보를 포함하여 특정 과정의 학생에게 할당된 과제 또는 질문을 나타내는 CourseWork 리소스를 사용하면 됩니다.

CourseWork 리소스 외에도 StudentSubmission 리소스를 사용하여 완료된 과제를 관리할 수 있습니다. 다음 섹션에서 이를 자세히 설명합니다.

할당 만들기

과제는 교사의 교사만 생성할 수 있으며, 학생을 대신하여 과정에서 과제를 만드는 경우 403 PERMISSION_DENIED 오류가 발생합니다. 마찬가지로 도메인 관리자가 가르치지 않는 과정에 대한 할당을 만들 수 없으며 API를 통해 이를 시도하면 403 PERMISSION_DENIED 오류가 발생합니다.

할당을 만들 때 아래 샘플 코드와 같이 materials로 링크를 연결할 수 있습니다.

Python

classroom/snippets/classroom_create_coursework.py
from __future__ import print_function

import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError


def classroom_create_coursework(course_id):

    """
    Creates the coursework the user has access to.
    Load pre-authorized user credentials from the environment.
    TODO(developer) - See https://developers.google.com/identity
    for guides on implementing OAuth2 for the application.
    """

    creds, _ = google.auth.default()
    # pylint: disable=maybe-no-member

    try:
        service = build('classroom', 'v1', credentials=creds)
        coursework = {
            'title': 'Ant colonies',
            'description': '''Read the article about ant colonies
                              and complete the quiz.''',
            'materials': [
                {'link': {'url': 'http://example.com/ant-colonies'}},
                {'link': {'url': 'http://example.com/ant-quiz'}}
            ],
            'workType': 'ASSIGNMENT',
            'state': 'PUBLISHED',
        }
        coursework = service.courses().courseWork().create(
            courseId=course_id, body=coursework).execute()
        print(f"Assignment created with ID {coursework.get('id')}")
        return coursework

    except HttpError as error:
        print(f"An error occurred: {error}")
        return error


if __name__ == '__main__':
    # Put the course_id of course whose coursework needs to be created,
    # the user has access to.
    classroom_create_coursework(453686957652)

결과에는 다른 API 요청에서 할당을 참조하는 데 사용할 수 있는 서버 할당 식별자가 포함됩니다.

클래스룸 API를 통해 만든 과제에 연결된 자료를 포함하려면 Link resource를 사용하여 대상 URL을 지정합니다. 클래스룸에서 제목과 썸네일 이미지를 자동으로 가져옵니다. 또한 클래스룸 API는 DriveFile 리소스 또는 YouTubeVideo 리소스와 유사한 방법으로 Drive 및 YouTube 자료를 기본적으로 지원합니다.

마감일을 지정하려면 dueDatedueTime 필드를 해당하는 UTC 시간으로 설정합니다. 마감일은 미래 날짜여야 합니다.

과제 및 질문 가져오기

해당 과정의 학생 및 교사 또는 도메인 관리자가 과제와 질문을 검색할 수 있습니다. 특정 과제나 질문을 검색하려면 course.courseWork.get을 사용합니다. 모든 과제 또는 질문을 가져오려면 (선택사항으로 일부 기준과 일치) courses.courseWork.list를 사용합니다.

필수 범위는 요청 사용자가 과정에서 갖는 역할에 따라 다릅니다. 사용자가 학생인 경우 다음 범위 중 하나를 사용하세요.

  • https://www.googleapis.com/auth/classroom.coursework.me.readonly
  • https://www.googleapis.com/auth/classroom.coursework.me

사용자가 교사 또는 도메인 관리자라면 다음 범위 중 하나를 사용하세요.

  • https://www.googleapis.com/auth/classroom.coursework.students.readonly
  • https://www.googleapis.com/auth/classroom.coursework.students

과제나 질문을 가져올 수 있는 권한이 있다고 해서 머티리얼 또는 머티리얼 메타데이터에 액세스할 권한이 있는 것은 아닙니다. 실질적으로는 관리자가 수업의 구성원이 아닌 경우 첨부된 Drive 파일의 제목이 표시되지 않을 수 있습니다. 관리자가 사용자 파일에 액세스하도록 허용하려면 도메인 전체 위임 가이드를 참조하세요.

학생 답변 관리하기

StudentSubmission 리소스는 과제나 질문에 대한 학생의 과제물 및 성적을 나타냅니다. 새 학생 또는 과제가 생성되면 학생별로 StudentSubmission 리소스가 암시적으로 생성됩니다.

다음 섹션에서는 학생 응답을 관리하는 일반적인 작업을 설명합니다.

학생 응답 가져오기

학생은 자신의 제출물을 검색할 수 있고, 선생님은 과정의 모든 학생에 대한 제출물을 검색할 수 있으며, 도메인 관리자는 도메인 내 모든 학생의 모든 제출물을 검색할 수 있습니다. 각 학생 제출물에 식별자가 할당됩니다. 식별자를 알고 있다면 courses.courseWork.studentSubmissions.get을 사용해 식별자를 가져옵니다.

다음 샘플과 같이 courses.courseWork.studentSubmissions.list를 사용해 일부 기준과 일치하는 StudentSubmission을 가져옵니다.

Python

classroom/snippets/classroom_list_submissions.py
from __future__ import print_function

import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError


def classroom_list_submissions(course_id, coursework_id):
    """
    Creates the courses the user has access to.
    Load pre-authorized user credentials from the environment.
    TODO(developer) - See https://developers.google.com/identity
    for guides on implementing OAuth2 for the application.
    """

    creds, _ = google.auth.default()
    # pylint: disable=maybe-no-member
    submissions = []
    page_token = None

    try:
        service = build('classroom', 'v1', credentials=creds)
        while True:
            coursework = service.courses().courseWork()
            response = coursework.studentSubmissions().list(
                pageToken=page_token,
                courseId=course_id,
                courseWorkId=coursework_id,
                pageSize=10).execute()
            submissions.extend(response.get('studentSubmissions', []))
            page_token = response.get('nextPageToken', None)
            if not page_token:
                break

        if not submissions:
            print('No student submissions found.')

        print('Student Submissions:')
        for submission in submissions:
            print(f"Submitted at:"
                  f"{(submission.get('id'), submission.get('creationTime'))}")

    except HttpError as error:
        print(f"An error occurred: {error}")
        submissions = None
    return submissions


if __name__ == '__main__':
    # Put the course_id and coursework_id of course whose list needs to be
    # submitted.
    classroom_list_submissions(453686957652, 466086979658)

다음 샘플과 같이 userId 매개변수를 지정하여 특정 학생에 속한 학생 제출물을 검색합니다.

Python

classroom/snippets/classroom_list_student_submissions.py
from __future__ import print_function

import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError


def classroom_list_student_submissions(course_id, coursework_id, user_id):
    """
    Creates the courses the user has access to.
    Load pre-authorized user credentials from the environment.
    TODO(developer) - See https://developers.google.com/identity
    for guides on implementing OAuth2 for the application.
    """

    creds, _ = google.auth.default()
    # pylint: disable=maybe-no-member
    submissions = []
    page_token = None

    try:
        service = build('classroom', 'v1', credentials=creds)
        while True:
            coursework = service.courses().courseWork()
            response = coursework.studentSubmissions().list(
                pageToken=page_token,
                courseId=course_id,
                courseWorkId=coursework_id,
                userId=user_id).execute()
            submissions.extend(response.get('studentSubmissions', []))
            page_token = response.get('nextPageToken', None)
            if not page_token:
                break

        if not submissions:
            print('No student submissions found.')

        print('Student Submissions:')
        for submission in submissions:
            print(f"Submitted at:"
                  f"{(submission.get('id'), submission.get('creationTime'))}")

    except HttpError as error:
        print(f"An error occurred: {error}")
    return submissions


if __name__ == '__main__':
    # Put the course_id, coursework_id and user_id of course whose list needs
    # to be submitted.
    classroom_list_student_submissions(453686957652, 466086979658, "me")

학생은 Google Admin SDK에서 반환한 사용자의 고유 ID나 이메일 주소로 식별됩니다. 현재 사용자는 "me" 약칭을 사용하여 자신의 ID를 참조할 수도 있습니다.

과정 내 모든 과제의 학생 제출물을 받을 수도 있습니다. 그렇게 하려면 다음 샘플과 같이 리터럴 "-"를courseWorkId로 사용합니다.

Python

service.courses().courseWork().studentSubmissions().list(
    courseId=<course ID or alias>,
    courseWorkId='-',
    userId=<user ID>).execute()

필수 범위는 요청 사용자가 과정에서 갖는 역할에 따라 다릅니다. 사용자가 교사이거나 도메인 관리자라면 다음 범위를 사용하세요.

  • https://www.googleapis.com/auth/classroom.coursework.students.readonly
  • https://www.googleapis.com/auth/classroom.coursework.students

사용자가 학생인 경우 다음 범위를 사용합니다.

  • https://www.googleapis.com/auth/classroom.coursework.me.readonly
  • https://www.googleapis.com/auth/classroom.coursework.me

학생 제출물을 검색할 수 있는 권한이 있다고 해서 첨부파일 또는 첨부파일 메타데이터에 액세스할 수 있는 권한은 아닙니다. 실질적으로는 관리자가 수업의 구성원이 아닌 경우 첨부된 Drive 파일의 제목이 표시되지 않을 수 있습니다. 관리자가 사용자 파일에 액세스하도록 허용하려면 도메인 전체 위임 가이드를 참조하세요.

학생 응답에 첨부파일 추가하기

링크, DriveFile 또는 YouTubeVideo 리소스를 첨부하여 학생 제출물에 링크를 연결할 수 있습니다. 다음 샘플과 같이 courses.courseWork.studentSubmissions.modify첨부파일을 사용하면 됩니다.

Python

classroom/snippets/classroom_add_attachment.py

def classroom_add_attachment(course_id, coursework_id, submission_id):
    """
    Adds attachment to existing course with specific course_id.
    Load pre-authorized user credentials from the environment.
    TODO(developer) - See https://developers.google.com/identity
    for guides on implementing OAuth2 for the application.
    """
    creds, _ = google.auth.default()
    # pylint: disable=maybe-no-member
    request = {
        'addAttachments': [
            {'link': {'url': 'http://example.com/quiz-results'}},
            {'link': {'url': 'http://example.com/quiz-reading'}}
        ]
    }

    try:
        service = build('classroom', 'v1', credentials=creds)
        while True:
            coursework = service.courses().courseWork()
            coursework.studentSubmissions().modifyAttachments(
                courseId=course_id,
                courseWorkId=coursework_id,
                id=submission_id,
                body=request).execute()

    except HttpError as error:
        print(f"An error occurred: {error}")


if __name__ == '__main__':
    # Put the course_id, coursework_id and submission_id of course in which
    # attachment needs to be added.
    classroom_add_attachment('course_id', 'coursework_id', "me")

링크 첨부파일은 대상 URL로 정의됩니다. 클래스룸에서 제목과 썸네일 이미지를 자동으로 가져옵니다. 각 참조 페이지에서 다른 자료에 대해 알아볼 수 있습니다.

자료는 과정 교사 또는 해당 학생 제출물을 소유한 학생이 만들 수 있지만 courseWorkType"ASSIGNMENT"인 학생 제출물에만 해당됩니다.

필수 범위는 요청 사용자가 과정에서 갖는 역할에 따라 다릅니다. 사용자가 교사인 경우 다음 범위를 사용하세요.

  • https://www.googleapis.com/auth/classroom.coursework.students

사용자가 학생인 경우 다음 범위를 사용합니다.

  • https://www.googleapis.com/auth/classroom.coursework.me

학생 응답 상태 관리

학생 응답은 제출 취소, 제출 또는 반환될 수 있습니다. StudentSubmission의 상태 필드는 현재 상태를 나타냅니다. 상태를 변경하려면 다음 메서드 중 하나를 호출합니다.

이러한 메서드는 모두 빈 본문을 사용합니다. 예:

Python

service.courses().courseWork().studentSubmission().turnIn(
    courseId=<course ID or alias>,
    courseWorkId=<courseWork ID>,
    id=<studentSubmission ID>,
    body={}).execute()

학생 제출을 소유한 학생만 과제를 제출하거나 회수할 수 있습니다. 제출한 과제물만 복원할 수 있습니다. 과정 교사는 제출 상태인 StudentSubmission만 반환할 수 있습니다.

학생 답변 채점하기

StudentSubmission 리소스에는 성적을 저장하는 필드 두 개가 있습니다. 하나는 학생에게 제공되는 성적인 assignedGrade이고 다른 하나는 교사에게만 표시되는 임시 성적인 draftGrade입니다. 이러한 필드는 다음 샘플과 같이 적절한 필드가 포함된 필드 마스크와 함께 courses.courseWork.studentSubmissions.patch를 사용하여 업데이트됩니다.

Python

studentSubmission = {
  'assignedGrade': 99,
  'draftGrade': 80
}
service.courses().courseWork().studentSubmissions().patch(
    courseId=<course ID or alias>,
    courseWorkId=<courseWork ID>,
    id=<studentSubmission ID>,
    updateMask='assignedGrade,draftGrade',
    body=studentSubmission).execute()

클래스룸 UI로 작업할 때 교사는 초안 성적을 먼저 저장할 때까지 성적을 할당할 수 없습니다. 그러면 할당된 성적이 학생에게 반환될 수 있습니다. 애플리케이션은 이 동작을 에뮬레이션해야 합니다. 애플리케이션은 다음 두 가지 방법 중 하나로 학생의 과제를 채점할 수 있습니다.

  • draftGrade만 할당합니다. 예를 들어 교사가 성적을 확정하기 전에 성적을 수동으로 검토하도록 할 수 있습니다. 학생에게 임시 성적이 표시되지 않습니다.

  • draftGradeassignedGrade을 모두 할당하여 과제를 완전히 채점합니다.