Verwenden Ihre Nutzer Classroom mit Google Meet? Sehen Sie sich die Apps Script-Kurzanleitung zum Ansehen der Teilnahme von Schülern/Studenten in Google Meet-Kursen an.

Kursaufgaben und Noten verwalten

Die Classroom-Benutzeroberfläche unterstützt fünf Arten von Kursaufgaben: Aufgaben, Quizaufgaben, Kurzantwort-Fragen, Multiple-Choice-Fragen und Materialien. Die Classroom API unterstützt derzeit drei dieser Typen. Sie werden für die API als CourseWorkType bezeichnet: Aufgaben, Kurzfragen und Multiple-Choice-Fragen.

Für diese Funktion können Sie die CourseWork-Ressource verwenden. Dabei handelt es sich um eine Aufgabe oder Frage, die Schülern in einem bestimmten Kurs zugewiesen wurde, einschließlich zusätzlicher Materialien und Details wie Abgabetermin oder maximale Punktzahl.

Zusätzlich zur Ressource „Kurswork“ können Sie abgeschlossene Aufgaben mit der Ressource StudentSubmission verwalten. In den folgenden Abschnitten wird dies ausführlicher beschrieben.

Aufgaben erstellen

Aufgaben können nur im Namen der Lehrkraft erstellt werden. Wenn Sie versuchen, im Namen eines Schülers/Studenten eine Aufgabe in einem Kurs zu erstellen, wird der Fehler 403 PERMISSION_DENIED angezeigt. Ebenso können Domain-Administratoren keine Zuweisungen für Kurse erstellen, in denen sie nicht unterrichtet werden. Wird dies über die API versucht, führt dies ebenfalls zum Fehler 403 PERMISSION_DENIED.

Wenn Sie Zuweisungen mit der Methode courses.courseWork.create erstellen, können Sie Links als materials anhängen, wie im Beispielcode unten gezeigt:

Java

Kursraum/Snippets/src/main/java/CreateCourseWork.java
CourseWork courseWork = null;
try {
  // Create a link to add as a material on course work.
  Link articleLink =
      new Link()
          .setTitle("SR-71 Blackbird")
          .setUrl("https://www.lockheedmartin.com/en-us/news/features/history/blackbird.html");

  // Create a list of Materials to add to course work.
  List<Material> materials = Arrays.asList(new Material().setLink(articleLink));

  /* Create new CourseWork object with the material attached.
  Set workType to `ASSIGNMENT`. Possible values of workType can be found here:
  https://developers.google.com/classroom/reference/rest/v1/CourseWorkType
  Set state to `PUBLISHED`. Possible values of state can be found here:
  https://developers.google.com/classroom/reference/rest/v1/courses.courseWork#courseworkstate */
  CourseWork content =
      new CourseWork()
          .setTitle("Supersonic aviation")
          .setDescription(
              "Read about how the SR-71 Blackbird, the world’s fastest and "
                  + "highest-flying manned aircraft, was built.")
          .setMaterials(materials)
          .setWorkType("ASSIGNMENT")
          .setState("PUBLISHED");

  courseWork = service.courses().courseWork().create(courseId, content).execute();

  /* Prints the created courseWork. */
  System.out.printf("CourseWork created: %s\n", courseWork.getTitle());
} catch (GoogleJsonResponseException e) {
  // TODO (developer) - handle error appropriately
  GoogleJsonError error = e.getDetails();
  if (error.getCode() == 404) {
    System.out.printf("The courseId does not exist: %s.\n", courseId);
  } else {
    throw e;
  }
  throw e;
} catch (Exception e) {
  throw e;
}
return courseWork;

Python

Kursraum/Ausschnitte/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)

Das Ergebnis enthält eine vom Server zugewiesene Kennung, mit der auf die Zuweisung in anderen API-Anfragen verwiesen werden kann.

Wenn Sie verknüpfte Materialien in eine Aufgabe einbinden möchten, die über die Classroom API erstellt wurde, verwenden Sie eine Linkressource und geben Sie die Ziel-URL an. Classroom ruft automatisch den Titel und das Thumbnail ab. Die Classroom API unterstützt außerdem Google Drive- und YouTube-Material, das auf ähnliche Weise in einer DriveFile-Ressource oder einer YouTubeVideo-Ressource enthalten sein kann.

Wenn Sie ein Fälligkeitsdatum festlegen möchten, legen Sie die Felder dueDate und dueTime auf die entsprechende UTC-Zeit fest. Der Abgabetermin muss in der Zukunft liegen.

Aufgaben und Fragen abrufen

Sie können Aufgaben und Fragen für Schüler/Studenten und Lehrkräfte des entsprechenden Kurses oder von einem Domainadministrator abrufen. Wenn Sie eine bestimmte Aufgabe oder Frage abrufen möchten, verwenden Sie die Klasse „course.courseWork.get“. Mit {0}courses.courseWork.list{/1} können Sie alle Zuweisungen oder Fragen abrufen (optional, die bestimmten Kriterien entsprechen).

Der erforderliche Bereich hängt von der Rolle ab, die der anfragende Nutzer im Kurs hat. Wenn der Nutzer ein Schüler oder Student ist, verwenden Sie einen der folgenden Bereiche:

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

Wenn der Nutzer eine Lehrkraft oder ein Domainadministrator ist, verwenden Sie einen der folgenden Bereiche:

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

Das Gewähren der Berechtigung zum Abrufen einer Aufgabe oder Frage impliziert keine Berechtigungen für den Zugriff auf Materialien oder Materialmetadaten. In der Praxis bedeutet das, dass ein Administrator den Titel einer angehängten Drive-Datei möglicherweise nicht sieht, wenn er kein Mitglied des Kurses ist. Informationen dazu, wie Sie Administratoren Zugriff auf Nutzerdateien gewähren, finden Sie im Leitfaden zur domainweiten Delegierung.

Antworten der Schüler oder Studenten verwalten

Eine StudentSubmission-Ressource stellt die erledigte und benotete Aufgabe eines Schülers/Studenten für eine Aufgabe oder Frage dar. Für jeden Schüler/Studenten wird implizit eine StudentSubmission-Ressource erstellt, wenn eine neue Frage oder Aufgabe erstellt wird.

In den folgenden Abschnitten werden häufige Aktionen erläutert, mit denen die Antworten der Schüler oder Studenten verwaltet werden.

Schüler-/Studentenantworten abrufen

Lernende können ihre eigenen abgegebenen Aufgaben abrufen, Lehrkräfte können abgegebene Aufgaben für alle Teilnehmer in ihren Kursen abrufen und Domain-Administratoren können alle Einreichungen für alle Teilnehmer in ihrer Domain abrufen. Jedem abgegebenen Schüler wird eine Kennung zugewiesen. Wenn Sie ihn kennen, können Sie ihn mit courses.courseWork.studentSubmissions.get abrufen.

Verwenden Sie die Methode courses.courseWork.studentSubmissions.list, um StudentSubmission-Ressourcen abzurufen, die einigen Kriterien entsprechen, wie im folgenden Beispiel gezeigt:

Java

Kursraum/Snippets/src/main/java/ListSubmissions.java
List<StudentSubmission> studentSubmissions = new ArrayList<>();
String pageToken = null;

try {
  do {
    ListStudentSubmissionsResponse response =
        service
            .courses()
            .courseWork()
            .studentSubmissions()
            .list(courseId, courseWorkId)
            .setPageToken(pageToken)
            .execute();

    /* Ensure that the response is not null before retrieving data from it to avoid errors. */
    if (response.getStudentSubmissions() != null) {
      studentSubmissions.addAll(response.getStudentSubmissions());
      pageToken = response.getNextPageToken();
    }
  } while (pageToken != null);

  if (studentSubmissions.isEmpty()) {
    System.out.println("No student submission found.");
  } else {
    for (StudentSubmission submission : studentSubmissions) {
      System.out.printf(
          "Student id (%s), student submission id (%s)\n",
          submission.getUserId(), submission.getId());
    }
  }
} catch (GoogleJsonResponseException e) {
  // TODO (developer) - handle error appropriately
  GoogleJsonError error = e.getDetails();
  if (error.getCode() == 404) {
    System.out.printf(
        "The courseId (%s) or courseWorkId (%s) does not exist.\n", courseId, courseWorkId);
  } else {
    throw e;
  }
} catch (Exception e) {
  throw e;
}
return studentSubmissions;

Python

Kursraum/Ausschnitte/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)

Rufen Sie StudentSubmission-Ressourcen ab, die zu einem bestimmten Schüler oder Studenten gehören, indem Sie den Parameter userId angeben, wie im folgenden Beispiel gezeigt:

Java

Kursraum/Snippets/src/main/java/ListStudentSubmissions.java
List<StudentSubmission> studentSubmissions = new ArrayList<>();
String pageToken = null;

try {
  do {
    // Set the userId as a query parameter on the request.
    ListStudentSubmissionsResponse response =
        service
            .courses()
            .courseWork()
            .studentSubmissions()
            .list(courseId, courseWorkId)
            .setPageToken(pageToken)
            .set("userId", userId)
            .execute();

    /* Ensure that the response is not null before retrieving data from it to avoid errors. */
    if (response.getStudentSubmissions() != null) {
      studentSubmissions.addAll(response.getStudentSubmissions());
      pageToken = response.getNextPageToken();
    }
  } while (pageToken != null);

  if (studentSubmissions.isEmpty()) {
    System.out.println("No student submission found.");
  } else {
    for (StudentSubmission submission : studentSubmissions) {
      System.out.printf("Student submission: %s.\n", submission.getId());
    }
  }

Python

Kursraum/Ausschnitte/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")

Schüler/Studenten werden durch die eindeutige ID oder E-Mail-Adresse des Nutzers identifiziert, die vom Google Admin SDK zurückgegeben wird. Der aktuelle Nutzer kann mithilfe des "me"-Kurzbefehls auch auf seine eigene ID verweisen.

Es ist auch möglich, für alle Aufgaben in einem Kurs eine abgegebene Aufgabe der Lernenden einzureichen. Verwenden Sie dazu das Literal "-" als courseWorkId, wie im folgenden Beispiel gezeigt:

Java

service.courses().courseWork().studentSubmissions()
    .list(courseId, "-")
    .set("userId", userId)
    .execute();

Python

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

Der erforderliche Bereich hängt von der Rolle ab, die der anfragende Nutzer im Kurs hat. Verwenden Sie den folgenden Bereich, wenn der Nutzer eine Lehrkraft oder ein Domainadministrator ist:

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

Verwenden Sie den folgenden Umfang, wenn der Nutzer ein Schüler oder Student ist:

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

Die Berechtigung zum Abrufen einer abgegebenen Aufgabe von Schülern und Studenten beinhaltet keine Berechtigungen für den Zugriff auf Anhänge oder Metadaten von Anhängen. In der Praxis bedeutet das, dass ein Administrator den Titel einer angehängten Drive-Datei möglicherweise nicht sieht, wenn er kein Mitglied des Kurses ist. Informationen, wie Sie Administratoren Zugriff auf Nutzerdateien gewähren, finden Sie im Leitfaden Domainweite Delegierung.

Einer Schüler-Antwort Anhänge hinzufügen

Sie können Links an eine abgegebene Aufgabe anhängen, indem Sie eine Link-, DriveFile- oder YouTubeVideo-Ressource anhängen. Dazu verwenden Sie courses.courseWork.studentSubmissions.modifyAttachments, wie im folgenden Beispiel gezeigt:

Java

Kursraum/Snippets/src/main/java/ModifyAttachmentsStudentSubmission.java
StudentSubmission studentSubmission = null;
try {
  // Create ModifyAttachmentRequest object that includes a new attachment with a link.
  Link link = new Link().setUrl("https://en.wikipedia.org/wiki/Irrational_number");
  Attachment attachment = new Attachment().setLink(link);
  ModifyAttachmentsRequest modifyAttachmentsRequest =
      new ModifyAttachmentsRequest().setAddAttachments(Arrays.asList(attachment));

  // The modified studentSubmission object is returned with the new attachment added to it.
  studentSubmission =
      service
          .courses()
          .courseWork()
          .studentSubmissions()
          .modifyAttachments(courseId, courseWorkId, id, modifyAttachmentsRequest)
          .execute();

  /* Prints the modified student submission. */
  System.out.printf(
      "Modified student submission attachments: '%s'.\n",
      studentSubmission.getAssignmentSubmission().getAttachments());
} catch (GoogleJsonResponseException e) {
  // TODO (developer) - handle error appropriately
  GoogleJsonError error = e.getDetails();
  if (error.getCode() == 404) {
    System.out.printf(
        "The courseId (%s), courseWorkId (%s), or studentSubmissionId (%s) does "
            + "not exist.\n",
        courseId, courseWorkId, id);
  } else {
    throw e;
  }
} catch (Exception e) {
  throw e;
}
return studentSubmission;

Python

Kursraum/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")

Ein Linkanhang wird durch die Ziel-URL definiert. Classroom ruft automatisch den Titel und das Thumbnail ab. Weitere Informationen zu den anderen Materialien findest du auf den entsprechenden Referenzseiten.

Die StudentSubmission kann nur von einer Lehrkraft oder dem Teilnehmer geändert werden, zu dem sie gehört. Sie können nur dann Materials anhängen, wenn die CourseWorkType der abgegebenen Aufgabe ASSIGNMENT ist.

Der erforderliche Bereich hängt von der Rolle ab, die der anfragende Nutzer im Kurs hat. Verwenden Sie den folgenden Umfang, wenn der Nutzer eine Lehrkraft ist:

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

Verwenden Sie den folgenden Umfang, wenn der Nutzer ein Schüler oder Student ist:

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

Antwortstatus von Schülern/Studenten verwalten

Die Antworten der Schüler oder Studenten können zurückgezogen, abgegeben oder zurückgegeben werden. Das Feld „state“ in StudentSubmission gibt den aktuellen Status an. Rufen Sie zum Ändern des Status eine der folgenden Methoden auf:

Bei allen diesen Methoden ist der Text leer. Beispiel:

Java

Kursraum/Snippets/src/main/java/ReturnStudentSubmission.java
try {
  service
      .courses()
      .courseWork()
      .studentSubmissions()
      .classroomReturn(courseId, courseWorkId, id, null)
      .execute();
} catch (GoogleJsonResponseException e) {
  // TODO (developer) - handle error appropriately
  GoogleJsonError error = e.getDetails();
  if (error.getCode() == 404) {
    System.out.printf(
        "The courseId (%s), courseWorkId (%s), or studentSubmissionId (%s) does "
            + "not exist.\n",
        courseId, courseWorkId, id);
  } else {
    throw e;
  }
} catch (Exception e) {
  throw e;
}

Python

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

Nur der Schüler/Student, der Inhaber einer StudentSubmission ist, kann die Aufgabe abgeben oder reaktivieren. Nur eine abgegebene Aufgabe kann zurückgefordert werden. Kurslehrer können nur StudentSubmission zurückgeben, die sich im Status „Abgegeben“ befinden.

Antworten von Schülern/Studenten benoten

Die Ressource StudentSubmission hat zwei Felder zum Speichern von Noten: assignedGrade (die für Schüler/Studenten gemeldete Note) und draftGrade (eine vorläufige Note, die nur für Lehrkräfte sichtbar ist). Diese Felder werden mit courses.courseWork.studentSubmissions.patch mit einer Feldmaske aktualisiert, die die entsprechenden Felder enthält, wie im folgenden Beispiel gezeigt.

Java

Kursraum/Snippets/src/main/java/PatchStudentSubmission.java
StudentSubmission studentSubmission = null;
try {
  // Updating the draftGrade and assignedGrade fields for the specific student submission.
  StudentSubmission content =
      service
          .courses()
          .courseWork()
          .studentSubmissions()
          .get(courseId, courseWorkId, id)
          .execute();
  content.setAssignedGrade(90.00);
  content.setDraftGrade(80.00);

  // The updated studentSubmission object is returned with the new draftGrade and assignedGrade.
  studentSubmission =
      service
          .courses()
          .courseWork()
          .studentSubmissions()
          .patch(courseId, courseWorkId, id, content)
          .set("updateMask", "draftGrade,assignedGrade")
          .execute();

  /* Prints the updated student submission. */
  System.out.printf(
      "Updated student submission draft grade (%s) and assigned grade (%s).\n",
      studentSubmission.getDraftGrade(), studentSubmission.getAssignedGrade());
} catch (GoogleJsonResponseException e) {
  // TODO (developer) - handle error appropriately
  GoogleJsonError error = e.getDetails();
  if (error.getCode() == 404) {
    System.out.printf(
        "The courseId (%s), courseWorkId (%s), or studentSubmissionId (%s) does "
            + "not exist.\n",
        courseId, courseWorkId, id);
  } else {
    throw e;
  }
} catch (Exception e) {
  throw e;
}
return studentSubmission;

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()

Bei der Arbeit mit der Classroom-Benutzeroberfläche können Lehrkräfte erst Noten zuweisen, nachdem sie den Notenentwurf gespeichert haben. Die zugewiesene Note kann dann an einen Schüler/Studenten zurückgegeben werden. Anwendungen müssen dieses Verhalten emulieren. In einer Anwendung gibt es zwei Möglichkeiten, die Aufgabe eines Schülers oder Studenten zu benoten:

  • Weisen Sie nur die draftGrade zu. Das ist z. B. hilfreich, wenn die Lehrkraft die Noten manuell prüfen soll, bevor sie sie fertigstellen. Schüler oder Studenten können Notenentwürfe nicht sehen.

  • Weisen Sie sowohl draftGrade als auch assignedGrade zu, um eine Aufgabe vollständig zu benoten.

Zugewiesene Noten auflisten

Sie können alle Noten für ein bestimmtes Kursaufgabenelement auflisten, indem Sie das Antwortobjekt der Methode courses.courseWork.studentSubmissions.list untersuchen:

Java

Kursraum/Snippets/src/main/java/ListStudentSubmissions.java
  ListStudentSubmissionsResponse response =
      service
          .courses()
          .courseWork()
          .studentSubmissions()
          .list(courseId, courseWorkId)
          .setPageToken(pageToken)
          .execute();

  /* Ensure that the response is not null before retrieving data from it to avoid errors. */
  if (response.getStudentSubmissions() != null) {
    studentSubmissions.addAll(response.getStudentSubmissions());
    pageToken = response.getNextPageToken();
  }
} while (pageToken != null);

if (studentSubmissions.isEmpty()) {
  System.out.println("No student submissions found.");
} else {
  for (StudentSubmission submission : studentSubmissions) {
    System.out.printf(
        "User ID %s, Assigned grade: %s\n",
        submission.getUserId(), submission.getAssignedGrade());
  }
}

Python

response = coursework.studentSubmissions().list(
    courseId=course_id,
    courseWorkId=coursework_id,
    pageSize=10).execute()
submissions.extend(response.get('studentSubmissions', []))

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

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