مدیریت دروس و نمرات

رابط کاربری کلاس از پنج نوع کار کلاسی پشتیبانی می کند: تکالیف، تکالیف امتحانی، سؤالات پاسخ کوتاه، سؤالات چند گزینه ای و مواد. Classroom API در حال حاضر از سه نوع از این نوع پشتیبانی می کند که به عنوان CourseWorkType برای API شناخته می شوند: تکالیف، سؤالات پاسخ کوتاه و سؤالات چند گزینه ای.

برای دسترسی به این قابلیت، می‌توانید از منبع CourseWork استفاده کنید، که نشان‌دهنده یک تکلیف یا سؤال است که در یک دوره خاص به دانش‌آموزان اختصاص داده شده است، از جمله هر گونه مطالب و جزئیات اضافی، مانند تاریخ سررسید یا حداکثر امتیاز.

علاوه بر منبع CourseWork، می توانید تکالیف تکمیل شده را با منبع StudentSubmission مدیریت کنید. بخش های بعدی این موارد را با جزئیات بیشتری توضیح می دهند.

تکالیف ایجاد کنید

تکالیف را فقط می توان از طرف معلم یا معلمان دوره ایجاد کرد و تلاش برای ایجاد تکالیف در یک دوره از طرف یک دانش آموز منجر به خطای 403 PERMISSION_DENIED می شود. به همین ترتیب، مدیران دامنه نیز نمی‌توانند برای دوره‌هایی که تدریس نمی‌کنند، تکالیف ایجاد کنند و تلاش برای انجام این کار از طریق API نیز منجر به خطای 403 PERMISSION_DENIED می‌شود.

هنگام ایجاد تکالیف با استفاده از روش courses.courseWork.create ، می توانید پیوندهایی را به عنوان materials پیوست کنید که در کد نمونه زیر نشان داده شده است:

جاوا

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;

پایتون

classroom/snippets/classroom_create_coursework.py
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 استفاده شود.

برای گنجاندن مطالب مرتبط در تکلیفی که از طریق Classroom API ایجاد شده است، از یک منبع پیوند استفاده کنید و URL مورد نظر را مشخص کنید. Classroom به طور خودکار عنوان و تصویر کوچک را واکشی می کند. Classroom API همچنین به صورت بومی از مطالب Google Drive و 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

داشتن مجوز برای بازیابی یک تکلیف یا سؤال به معنای مجوز دسترسی به مطالب یا فراداده مواد نیست. در عمل، این بدان معنی است که اگر یک سرپرست عضو دوره نباشد، ممکن است عنوان فایل Drive پیوست شده را نبیند. اگر می‌خواهید به مدیران اجازه دسترسی به فایل‌های کاربر را بدهید، راهنمای تفویض اختیار در دامنه را ببینید.

مدیریت پاسخ های دانش آموزان

منبع StudentSubmission نشان دهنده کار انجام شده و نمره دانش آموز برای یک تکلیف یا سوال است. هنگامی که یک سوال یا تکلیف جدید ایجاد می شود، منبع StudentSubmission به طور ضمنی برای هر دانش آموز ایجاد می شود.

بخش‌های زیر اقدامات رایجی را که پاسخ‌های دانش‌آموز را مدیریت می‌کنند توضیح می‌دهند.

بازیابی پاسخ های دانش آموزان

دانش‌آموزان می‌توانند مطالب ارسالی خود را بازیابی کنند، معلمان می‌توانند موارد ارسالی را برای همه دانش‌آموزان در دوره‌های خود بازیابی کنند، و مدیران دامنه می‌توانند همه موارد ارسالی را برای همه دانش‌آموزان در حوزه خود بازیابی کنند. به هر ارسال دانشجویی یک شناسه اختصاص داده می شود. اگر شناسه را می‌شناسید، از courses.courseWork.studentSubmissions.get برای بازیابی آن استفاده کنید.

همانطور که در نمونه زیر نشان داده شده است، از روش courses.courseWork.studentSubmissions.list برای دریافت منابع StudentSubmission که با برخی از معیارها مطابقت دارند، استفاده کنید:

جاوا

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;

پایتون

classroom/snippets/classroom_list_submissions.py
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(
          "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 بازیابی کنید:

جاوا

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

پایتون

classroom/snippets/classroom_list_student_submissions.py
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(
          "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 بازگردانده می‌شود، شناسایی می‌شوند. کاربر فعلی همچنین ممکن است با استفاده از خلاصه "me" به شناسه خود مراجعه کند.

همچنین امکان دریافت مطالب ارسالی دانش‌آموز برای همه تکالیف در یک دوره وجود دارد. برای انجام این کار، همانطور که در نمونه زیر نشان داده شده است، از کلمه "-" به عنوان courseWorkId استفاده کنید:

جاوا

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

پایتون

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 انجام می شود، همانطور که در نمونه زیر نشان داده شده است:

جاوا

classroom/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;

پایتون

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

مدیریت وضعیت پاسخ دانش آموز

پاسخ دانش آموز ممکن است ارسال نشود، تحویل داده شود یا برگردانده شود. فیلد State در StudentSubmission وضعیت فعلی را نشان می دهد. برای تغییر وضعیت، یکی از روش های زیر را فراخوانی کنید:

همه این روش ها بدن خالی می گیرند. مثال:

جاوا

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;
}

پایتون

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 با یک فیلد ماسک حاوی فیلدهای مناسب، همانطور که در نمونه زیر نشان داده شده است، به روز می شوند.

جاوا

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;

پایتون

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 را اختصاص دهید. برای مثال، به معلم اجازه می دهد نمرات را قبل از نهایی کردن آنها به صورت دستی بررسی کند، مفید است. دانش آموزان نمی توانند نمرات پیش نویس را ببینند.

  • هم draftGrade و هم assignedGrade را برای درجه بندی کامل یک تکلیف اختصاص دهید.

نمرات اختصاص داده شده را فهرست کنید

می‌توانید با کاوش در شی پاسخ متد courses.courseWork.studentSubmissions.list همه نمرات را برای یک آیتم درسی خاص فهرست کنید:

جاوا

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

پایتون

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

رابط کاربری کلاس از پنج نوع کار کلاسی پشتیبانی می کند: تکالیف، تکالیف امتحانی، سؤالات پاسخ کوتاه، سؤالات چند گزینه ای و مواد. Classroom API در حال حاضر از سه نوع از این نوع پشتیبانی می کند که به عنوان CourseWorkType برای API شناخته می شوند: تکالیف، سؤالات پاسخ کوتاه و سؤالات چند گزینه ای.

برای دسترسی به این قابلیت، می‌توانید از منبع CourseWork استفاده کنید، که نشان‌دهنده یک تکلیف یا سؤال است که در یک دوره خاص به دانش‌آموزان اختصاص داده شده است، از جمله هر گونه مطالب و جزئیات اضافی، مانند تاریخ سررسید یا حداکثر امتیاز.

علاوه بر منبع CourseWork، می توانید تکالیف تکمیل شده را با منبع StudentSubmission مدیریت کنید. بخش های بعدی این موارد را با جزئیات بیشتری توضیح می دهند.

تکالیف ایجاد کنید

تکالیف را فقط می توان از طرف معلم یا معلمان دوره ایجاد کرد و تلاش برای ایجاد تکالیف در یک دوره از طرف یک دانش آموز منجر به خطای 403 PERMISSION_DENIED می شود. به همین ترتیب، مدیران دامنه نیز نمی‌توانند برای دوره‌هایی که تدریس نمی‌کنند، تکالیف ایجاد کنند و تلاش برای انجام این کار از طریق API نیز منجر به خطای 403 PERMISSION_DENIED می‌شود.

هنگام ایجاد تکالیف با استفاده از روش courses.courseWork.create ، می توانید پیوندهایی را به عنوان materials پیوست کنید که در کد نمونه زیر نشان داده شده است:

جاوا

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;

پایتون

classroom/snippets/classroom_create_coursework.py
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 استفاده شود.

برای گنجاندن مطالب مرتبط در تکلیفی که از طریق Classroom API ایجاد شده است، از یک منبع پیوند استفاده کنید و URL مورد نظر را مشخص کنید. Classroom به طور خودکار عنوان و تصویر کوچک را واکشی می کند. Classroom API همچنین به صورت بومی از مطالب Google Drive و 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

داشتن مجوز برای بازیابی یک تکلیف یا سؤال به معنای مجوز دسترسی به مطالب یا فراداده مواد نیست. در عمل، این بدان معنی است که اگر یک سرپرست عضو دوره نباشد، ممکن است عنوان فایل Drive پیوست شده را نبیند. اگر می‌خواهید به مدیران اجازه دسترسی به فایل‌های کاربر را بدهید، راهنمای تفویض اختیار در دامنه را ببینید.

مدیریت پاسخ های دانش آموزان

منبع StudentSubmission نشان دهنده کار انجام شده و نمره دانش آموز برای یک تکلیف یا سوال است. هنگامی که یک سوال یا تکلیف جدید ایجاد می شود، منبع StudentSubmission به طور ضمنی برای هر دانش آموز ایجاد می شود.

بخش‌های زیر اقدامات رایجی را که پاسخ‌های دانش‌آموز را مدیریت می‌کنند توضیح می‌دهند.

بازیابی پاسخ های دانش آموزان

دانش‌آموزان می‌توانند مطالب ارسالی خود را بازیابی کنند، معلمان می‌توانند موارد ارسالی را برای همه دانش‌آموزان در دوره‌های خود بازیابی کنند، و مدیران دامنه می‌توانند همه موارد ارسالی را برای همه دانش‌آموزان در حوزه خود بازیابی کنند. به هر ارسال دانشجویی یک شناسه اختصاص داده می شود. اگر شناسه را می‌شناسید، از courses.courseWork.studentSubmissions.get برای بازیابی آن استفاده کنید.

همانطور که در نمونه زیر نشان داده شده است، از روش courses.courseWork.studentSubmissions.list برای دریافت منابع StudentSubmission که با برخی از معیارها مطابقت دارند، استفاده کنید:

جاوا

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;

پایتون

classroom/snippets/classroom_list_submissions.py
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(
          "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 بازیابی کنید:

جاوا

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

پایتون

classroom/snippets/classroom_list_student_submissions.py
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(
          "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 بازگردانده می‌شود، شناسایی می‌شوند. کاربر فعلی همچنین ممکن است با استفاده از خلاصه "me" به شناسه خود مراجعه کند.

همچنین امکان دریافت مطالب ارسالی دانش‌آموز برای همه تکالیف در یک دوره وجود دارد. برای انجام این کار، همانطور که در نمونه زیر نشان داده شده است، از کلمه "-" به عنوان courseWorkId استفاده کنید:

جاوا

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

پایتون

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 انجام می شود، همانطور که در نمونه زیر نشان داده شده است:

جاوا

classroom/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;

پایتون

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

مدیریت وضعیت پاسخ دانش آموز

پاسخ دانش آموز ممکن است ارسال نشود، تحویل داده شود یا برگردانده شود. فیلد State در StudentSubmission وضعیت فعلی را نشان می دهد. برای تغییر وضعیت، یکی از روش های زیر را فراخوانی کنید:

همه این روش ها بدن خالی می گیرند. مثال:

جاوا

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;
}

پایتون

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 با یک فیلد ماسک حاوی فیلدهای مناسب، همانطور که در نمونه زیر نشان داده شده است، به روز می شوند.

جاوا

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;

پایتون

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 را اختصاص دهید. برای مثال، به معلم اجازه می دهد نمرات را قبل از نهایی کردن آنها به صورت دستی بررسی کند، مفید است. دانش آموزان نمی توانند نمرات پیش نویس را ببینند.

  • هم draftGrade و هم assignedGrade را برای درجه بندی کامل یک تکلیف اختصاص دهید.

نمرات اختصاص داده شده را فهرست کنید

می‌توانید با کاوش در شی پاسخ متد courses.courseWork.studentSubmissions.list همه نمرات را برای یک آیتم درسی خاص فهرست کنید:

جاوا

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

پایتون

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

رابط کاربری کلاس از پنج نوع کار کلاسی پشتیبانی می کند: تکالیف، تکالیف امتحانی، سؤالات پاسخ کوتاه، سؤالات چند گزینه ای و مواد. Classroom API در حال حاضر از سه نوع از این نوع پشتیبانی می کند که به عنوان CourseWorkType برای API شناخته می شوند: تکالیف، سؤالات پاسخ کوتاه و سؤالات چند گزینه ای.

برای دسترسی به این قابلیت، می‌توانید از منبع CourseWork استفاده کنید، که نشان‌دهنده یک تکلیف یا سؤال است که در یک دوره خاص به دانش‌آموزان اختصاص داده شده است، از جمله هر گونه مطالب و جزئیات اضافی، مانند تاریخ سررسید یا حداکثر امتیاز.

علاوه بر منبع CourseWork، می توانید تکالیف تکمیل شده را با منبع StudentSubmission مدیریت کنید. بخش های بعدی این موارد را با جزئیات بیشتری توضیح می دهند.

تکالیف ایجاد کنید

تکالیف را فقط می توان از طرف معلم یا معلمان دوره ایجاد کرد و تلاش برای ایجاد تکالیف در یک دوره از طرف یک دانش آموز منجر به خطای 403 PERMISSION_DENIED می شود. به همین ترتیب، مدیران دامنه نیز نمی‌توانند برای دوره‌هایی که تدریس نمی‌کنند، تکالیف ایجاد کنند و تلاش برای انجام این کار از طریق API نیز منجر به خطای 403 PERMISSION_DENIED می‌شود.

هنگام ایجاد تکالیف با استفاده از روش courses.courseWork.create ، می توانید پیوندهایی را به عنوان materials پیوست کنید که در کد نمونه زیر نشان داده شده است:

جاوا

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;

پایتون

classroom/snippets/classroom_create_coursework.py
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 استفاده شود.

برای گنجاندن مطالب مرتبط در تکلیفی که از طریق Classroom API ایجاد شده است، از یک منبع پیوند استفاده کنید و URL مورد نظر را مشخص کنید. Classroom به طور خودکار عنوان و تصویر کوچک را واکشی می کند. Classroom API همچنین به صورت بومی از مطالب Google Drive و 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

داشتن مجوز برای بازیابی یک تکلیف یا سؤال به معنای مجوز دسترسی به مطالب یا فراداده مواد نیست. در عمل، این بدان معنی است که اگر یک سرپرست عضو دوره نباشد، ممکن است عنوان فایل Drive پیوست شده را نبیند. اگر می‌خواهید به مدیران اجازه دسترسی به فایل‌های کاربر را بدهید، راهنمای تفویض اختیار در دامنه را ببینید.

مدیریت پاسخ های دانش آموزان

منبع StudentSubmission نشان دهنده کار انجام شده و نمره دانش آموز برای یک تکلیف یا سوال است. هنگامی که یک سوال یا تکلیف جدید ایجاد می شود، منبع StudentSubmission به طور ضمنی برای هر دانش آموز ایجاد می شود.

بخش‌های زیر اقدامات رایجی را که پاسخ‌های دانش‌آموز را مدیریت می‌کنند توضیح می‌دهند.

بازیابی پاسخ های دانش آموزان

دانش‌آموزان می‌توانند مطالب ارسالی خود را بازیابی کنند، معلمان می‌توانند موارد ارسالی را برای همه دانش‌آموزان در دوره‌های خود بازیابی کنند، و مدیران دامنه می‌توانند همه موارد ارسالی را برای همه دانش‌آموزان در حوزه خود بازیابی کنند. به هر ارسال دانشجویی یک شناسه اختصاص داده می شود. اگر شناسه را می‌شناسید، از courses.courseWork.studentSubmissions.get برای بازیابی آن استفاده کنید.

همانطور که در نمونه زیر نشان داده شده است، از روش courses.courseWork.studentSubmissions.list برای دریافت منابع StudentSubmission که با برخی از معیارها مطابقت دارند، استفاده کنید:

جاوا

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;

پایتون

classroom/snippets/classroom_list_submissions.py
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(
          "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 بازیابی کنید:

جاوا

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

پایتون

classroom/snippets/classroom_list_student_submissions.py
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(
          "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 بازگردانده می‌شود، شناسایی می‌شوند. کاربر فعلی همچنین ممکن است با استفاده از خلاصه "me" به شناسه خود مراجعه کند.

همچنین امکان دریافت مطالب ارسالی دانش‌آموز برای همه تکالیف در یک دوره وجود دارد. برای انجام این کار، همانطور که در نمونه زیر نشان داده شده است، از کلمه "-" به عنوان courseWorkId استفاده کنید:

جاوا

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

پایتون

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 انجام می شود، همانطور که در نمونه زیر نشان داده شده است:

جاوا

classroom/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;

پایتون

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

مدیریت وضعیت پاسخ دانش آموز

پاسخ دانش آموز ممکن است ارسال نشود، تحویل داده شود یا برگردانده شود. فیلد State در StudentSubmission وضعیت فعلی را نشان می دهد. برای تغییر وضعیت، یکی از روش های زیر را فراخوانی کنید:

همه این روش ها بدن خالی می گیرند. مثال:

جاوا

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;
}

پایتون

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 با یک فیلد ماسک حاوی فیلدهای مناسب، همانطور که در نمونه زیر نشان داده شده است، به روز می شوند.

جاوا

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;

پایتون

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 را اختصاص دهید. برای مثال، به معلم اجازه می دهد نمرات را قبل از نهایی کردن آنها به صورت دستی بررسی کند، مفید است. دانش آموزان نمی توانند نمرات پیش نویس را ببینند.

  • هم draftGrade و هم assignedGrade را برای درجه بندی کامل یک تکلیف اختصاص دهید.

نمرات اختصاص داده شده را فهرست کنید

می‌توانید با کاوش در شی پاسخ متد courses.courseWork.studentSubmissions.list همه نمرات را برای یک آیتم درسی خاص فهرست کنید:

جاوا

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

پایتون

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