إدارة المهام الدراسية والدرجات

تنظيم صفحاتك في مجموعات يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.

تدعم واجهة مستخدم Classroom خمسة أنواع من الواجبات الدراسية: المهام، والمهام الدراسية للاختبار، وأسئلة ذات إجابات قصيرة، وأسئلة الخيارات المتعدّدة، والمواد. تتيح واجهة برمجة تطبيقات Classroom حاليًا استخدام ثلاثة أنواع من هذه الأنواع، والتي تُعرف باسم CourseWorkType لواجهة برمجة التطبيقات: "مهام" وأسئلة ذات إجابات قصيرة وأسئلة "خيارات متعدّدة".

للوصول إلى هذه الوظيفة، يمكنك استخدام مورد CourseWork الذي يمثل مهمة دراسية أو سؤال تم تعيينه للطلاب في دورة تدريبية معيّنة، بما في ذلك أي مواد وتفاصيل إضافية، مثل تاريخ التسليم أو الحد الأقصى للنتائج.

بالإضافة إلى مورد CourseWork، يمكنك إدارة المهام المكتملة باستخدام مورد StudentSubmission. تصف الأقسام التالية هذه بشكل أكثر تفصيلاً.

إنشاء مهام

يمكن إنشاء المهام الدراسية فقط نيابةً عن معلِّمي الدورة التدريبية، وسيؤدي محاولة إنشاء مهام دراسية في دورة تدريبية نيابةً عن الطالب إلى ظهور خطأ PERMISSION_DENIED 403. وبالمثل، لا يمكن لمشرفي النطاقات أيضًا إنشاء مهام دراسية للدورات التعليمية التي لا يدرسون لها، كما سيؤدي إجراء ذلك من خلال واجهة برمجة التطبيقات إلى حدوث خطأ 403 PERMISSION_DENIED أيضًا.

عند إنشاء المهام باستخدام طريقة courses.courseWork.create، يمكنك إرفاق الروابط بتنسيق materials، الموضحة في نموذج الرمز أدناه:

لغة Java

Classroom/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

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)

تتضمن النتيجة معرّفًا يعيّنه الخادم يمكن استخدامه للإشارة إلى التخصيص في طلبات واجهة برمجة التطبيقات الأخرى.

لتضمين مواد مرتبطة في مهمة دراسية تم إنشاؤها من خلال Classroom API، يمكنك استخداممورد الرابط، مع تحديد عنوان URL المستهدف. يجلب تطبيق Classroom العنوان والصورة المصغّرة تلقائيًا. تتوافق أيضًا واجهة برمجة تطبيقات Classroom في الأصل مع مواد Google Drive وYouTube، والتي يمكن تضمينها مع مورد DriveFile أو مورد فيديو YouTube بطريقة مماثلة.

لتحديد تاريخ تسليم، اضبط الحقلين dueDate وdueTime على التوقيت العالمي المنسّق المقابل. يجب أن يكون تاريخ التسليم في المستقبل.

استرداد المهام والأسئلة

يمكنك استرداد المهام والأسئلة للطلاب والمعلمين في الدورة التدريبية المطابقة أو عن طريق مشرف النطاق. لاسترداد مهمة دراسية أو سؤال معيّن، استخدم الدورة التدريبية.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 التي تطابق بعض المعايير، كما هو موضّح في النموذج التالي:

لغة Java

Classroom/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

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)

يمكنك استرداد موارد StudentSubmission التي تخص طالبًا معيّنًا من خلال تحديد المعلمة userId، كما هو موضّح في العينة التالية:

لغة Java

Classroom/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

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

يتم تحديد الطلاب من خلال رقم التعريف الفريد أو عنوان البريد الإلكتروني للمستخدم، كما يتم عرضه بواسطة SDK لوحدة تحكم المشرف في Google. يمكن للمستخدم الحالي أيضًا الإشارة إلى رقم تعريفه باستخدام اختصار "me".

من الممكن أيضًا الحصول على تسليمات الطلاب لجميع المهام الدراسية ضمن الدورة التدريبية. لإجراء ذلك، استخدم الحرفي "-" باعتباره courseWorkId، كما هو موضح في النموذج التالي:

لغة 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()

يعتمد النطاق المطلوب على الدور الذي يؤديه المستخدم صاحب الطلب في الدورة التدريبية. استخدم النطاق التالي إذا كان المستخدم مدرسًا أو مشرف نطاق:

  • 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 المُرفَق إذا لم يكن عضوًا في الدورة التدريبية. إذا كنت ترغب في السماح للمشرفين بالوصول إلى ملفات المستخدم، فراجع دليل التفويض على مستوى النطاق.

إضافة مرفقات إلى رد الطالب

يمكنك إرفاق روابط إلى الوثائق التي أرسلها الطالب من خلال إرفاق مورد Link أو DriveFile أو YouTubeVideo. ويتم هذا باستخدام courses.courseWork.studentSubmissions.modifyAttachments، كما هو موضّح في النموذج التالي:

لغة Java

Classroom/snippets/src/main/java/ModifyAttachmentStudentSubmission.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

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 المستهدف، وسيعمل تطبيق Classroom على جلب العنوان والصورة المصغرة تلقائيًا. يمكنك التعرف على المواد الأخرى في الصفحات المرجعية لكل منها.

لا يمكن تعديل StudentSubmission إلا من قِبل معلّم الدورة التدريبية أو الطالب الذي يملكه. لا يمكنك إرفاق Materials إلا إذا كانت السمة CourseWorkType التي أرسلها الطالب ASSIGNMENT.

يعتمد النطاق المطلوب على الدور الذي يؤديه المستخدم صاحب الطلب في الدورة التدريبية. استخدم النطاق التالي إذا كان المستخدم معلّمًا:

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

استخدم النطاق التالي إذا كان المستخدم طالبًا:

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

إدارة حالة استجابة الطالب

قد يتم إلغاء إرسال رد الطالب أو تسليمه أو إرجاعه. يشير حقل الولاية في StudentSubmission إلى الحالة الحالية. لتغيير الحالة، يمكنك الاتصال بإحدى الطرق التالية:

تأخذ جميع هذه الطرق نصًا فارغًا. مثال:

لغة Java

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

يمكن للطالب الذي يملك StudentSubmission فقط تسليمه أو استرداده. لا يمكن استرداد إلا إرسال تم تسليمه. لا يمكن لمعلّمي الدورات التدريبية عرض سوى StudentSubmission التي تم تحويلها.

وضع درجات لردود الطلاب

يحتوي مورد StudentSubmission على حقلين لتخزين الدرجات: assignedGrade، وهو الصف الذي يتم الإبلاغ عنه للطلاب، وdraftGrade، وهو درجة مبدئية مرئية فقط للمعلّمين. يتم تعديل هذه الحقول باستخدام courses.courseWork.studentSubmissions.patch باستخدام قناع حقل يحتوي على الحقول المناسبة، كما هو موضّح في النموذج التالي.

لغة Java

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

عند استخدام واجهة مستخدم Classroom، لا يمكن للمعلّمين تحديد درجة إلا بعد حفظ الدرجة الأولية. يمكن بعد ذلك إرجاع الدرجة المعينة إلى طالب. ويجب أن تحاكي التطبيقات هذا السلوك. يمكن لتطبيقك وضع الدرجات في مهمة الطالب الدراسية بإحدى طريقتين:

  • يمكنك تخصيص draftGrade فقط. وهذا مفيد، على سبيل المثال، للسماح للمدرس بمراجعة الدرجات يدويًا قبل وضع الدرجات عليها. لا يمكن للطلاب الاطّلاع على الدرجات الأولية.

  • يمكنك تحديد كل من draftGrade وassignedGrade لوضع درجات على مهمة بالكامل.

سرد الدرجات المعيّنة

يمكنك إدراج جميع الدرجات لعنصر دورة تدريبية معيّن من خلال استكشاف كائن الاستجابة الخاص بطريقة courses.courseWork.studentSubmissions.list:

لغة Java

Classroom/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'))}")