ユーザーが Classroom と Google Meet を使用している場合は、Google Meet コースの生徒の出席状況を確認する Apps Script クイックスタートをご覧ください。

授業の管理

Classroom には、課題、テスト、質問(記述式、多肢選択式)、資料の 5 種類の授業があります。 Classroom API では現在のところ、課題、質問、資料の 3 つのタイプの読み取り / 書き込みが可能です。

この機能にアクセスするには、CourseWork リソースを使用します。これは、特定のコースの生徒に割り当てられた課題や質問(追加の資料や詳細(期限や最大スコアなど)

CourseWork リソースに加え、StudentSubmission リソースを使用して完了した課題も管理できます。以降のセクションで、これらについて詳しく説明します。

課題を作成する

課題の作成は、コースの教師に代わってのみ行えます。生徒に代わってコースで課題を作成しようとすると、403 PERMISSION_DENIED エラーが発生します。 。同様に、ドメイン管理者が担当していないコースの課題も作成できず、API 経由で作成しようとすると 403 PERMISSION_DENIED エラーが発生します。

割り当てを作成する際に、以下のサンプルコードに示すように、リンクを materials としてアタッチできます。

Python

classroom/snippets/classroom_snippets.py
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('Assignment created with ID {%s}' % coursework.get('id'))

結果には、他の API リクエストで割り当てを参照するために使用できるサーバー割り当ての ID が含まれます。

Classroom API で作成された課題にリンクされた資料を追加するには、リンクリソースを使用して、対象 URL を指定します。タイトルとサムネイル画像が自動的に取得されます。 Classroom API は、ドライブと YouTube の資料もネイティブにサポートしています。これらの資料には、DriveFile リソースYouTubeVideo リソースも同様の方法で含めることができます。

期限を指定するには、dueDate フィールドと dueTime フィールドを対応する UTC 時間に設定します。期限には将来の日付を指定してください。

課題と質問を確認する

課題や質問は、対応するコースの生徒や教師に対して、またはドメイン管理者によって取得できます。特定の課題や問題を取得するには、courses.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

課題や質問を取得する権限を持っても、資料や資料メタデータにアクセスする権限がないわけではありません。実際には、このコースのメンバー以外の場合、添付ファイルにはドライブのタイトルが表示されません。管理者がユーザー ファイルにアクセスできるようにするには、ドメイン全体の委任ガイドをご覧ください。

生徒の解答を管理

StudentSubmission リソースは、課題や質問の生徒の課題と成績を表します。StudentSubmission リソースは、新しい質問や課題が作成されると、各生徒に対して暗黙的に作成されます。

以下のセクションでは、生徒の回答を管理する一般的な操作について説明します。

生徒の解答を取得する

生徒は各自で提出物を取得でき、教師は自分のコース内のすべての生徒に代わって提出物を取得できます。また、ドメイン管理者は自分のドメイン内のすべての生徒の提出物をすべて取得できます。生徒の提出物ごとに識別子が割り当てられます。 ID がわかっている場合は、courses.courseWork.studentSubmissions.get を使用して取得してください。

次のサンプルに示すように、courses.courseWork.studentSubmissions.list を使用して、いくつかの条件に一致する StudentSubmission を取得します。

Python

classroom/snippets/classroom_snippets.py
submissions = []
page_token = None

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.')
else:
    print('Student Submissions:')
    for submission in submissions:
        print("%s was submitted at %s" %
              (submission.get('id'),
               submission.get('creationTime')))
submissions = []
page_token = None

while True:
    coursework = service.courses().courseWork()
    response = coursework.studentSubmissions().list(
        pageToken=page_token,
        courseId=course_id,
        courseWorkId="-",
        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.')
else:
    print('Complete list of student Submissions:')
    for submission in submissions:
        print("%s was submitted at %s" %
              (submission.get('id'),
               submission.get('creationTime')))

次のサンプルに示すように、userId パラメータを指定して、特定の生徒に属する生徒の提出物を取得します。

Python

classroom/snippets/classroom_snippets.py
submissions = []
page_token = None

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.')
else:
    print('Student Submissions:')
    for submission in submissions:
        print("%s was submitted at %s" %
              (submission.get('id'),
               submission.get('creationTime')))

学生は、Google Admin SDK から返されたユーザーの一意の ID またはメールアドレスによって識別されます。現在のユーザーは、"me" 短縮形を使用して自分の ID を参照することもできます。

コース内のすべての課題の生徒の提出物を取得することもできます。それには、コースワーク ID としてリテラル "-" を使用します。以下に例を示します。

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

生徒の提出物を取得する権限を持っても、添付ファイルや添付ファイルのメタデータにアクセスする権限がないわけではありません。実際には、添付したドライブ ファイルのタイトルが管理者に表示されない場合、コースのタイトルは表示されません。管理者がユーザー ファイルにアクセスできるようにするには、ドメイン全体の委任ガイドをご覧ください。

生徒の解答に添付ファイルを追加する

Link、DriveFile、YouTubeVideo のリソースを添付すると、生徒の提出物にリンクを添付できます。これは、次のサンプルに示すように、courses.courseWork.studentSubmissions.modifyAttachments で実行します。

Python

classroom/snippets/classroom_snippets.py
request = {
    'addAttachments': [
        {'link': {'url': 'http://example.com/quiz-results'}},
        {'link': {'url': 'http://example.com/quiz-reading'}}
    ]
}
coursework = service.courses().courseWork()
coursework.studentSubmissions().modifyAttachments(
    courseId=course_id,
    courseWorkId=coursework_id,
    id=submission_id,
    body=request).execute()
guardian_invitation = {
    'invitedEmailAddress': 'guardian@gmail.com',
}
guardian_invitations = service.userProfiles().guardianInvitations()
guardian_invitation = guardian_invitations.create(
    # You can use a user ID or an email address.
    studentId='student@mydomain.edu',
    body=guardian_invitation).execute()
print("Invitation created with id: {%s}"
      % guardian_invitation.get('invitationId'))

リンク添付ファイルは、ターゲット URL によって定義されます。 Classroom にタイトルとサムネイルの画像が自動的に取得されます。その他の資料については、それぞれのリファレンス ページをご覧ください。

資料を作成できるのは、コースの教師か、対応する生徒の提出物を所有する生徒がですが、作成できるのは 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 のみを返すことができます。

生徒の解答を採点する

[生徒からの提出 resource には、成績を格納する 2 つのフィールドがあります。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()

Classroom の UI で課題を採点する場合は、まず成績の下書きを保存する必要があります。その場合、課題の成績を生徒に返却できます。アプリはこの動作をエミュレートする必要があります。アプリケーションは、次のいずれかの方法で生徒の課題を採点できます。

  • draftGrade のみを割り当てます。たとえば、教師が採点前に手動で成績を確認できるようにすると便利です。生徒には仮成績を表示できません。

  • 課題を完全に採点するには、draftGradeassignedGrade の両方を割り当ててください。