Mengelola Tugas Mata Pelajaran

Aplikasi Classroom mendukung tiga jenis item streaming: CourseWork, CourseWorkMaterials, dan Announcements. Panduan ini menjelaskan cara mengelola CourseWork, tetapi API untuk semua item streaming mirip. Lihat Referensi API untuk mempelajari lebih lanjut jenis item streaming dan perbedaannya.

Resource CourseWork mewakili item pekerjaan yang telah diberikan kepada siswa di kursus tertentu, termasuk materi dan detail tambahan, seperti tanggal jatuh tempo atau skor maksimum. Ada empat subjenis CourseWork: tugas, tugas kuis, pertanyaan jawaban singkat, dan pertanyaan pilihan ganda. Classroom API mendukung tiga subjenis ini: tugas, pertanyaan jawaban singkat, dan pertanyaan pilihan ganda. Jenis ini diwakili oleh kolom CourseWork.workType.

Selain resource CourseWork, Anda dapat mengelola pekerjaan yang telah selesai dengan resource StudentSubmission.

Membuat Tugas Kursus

CourseWork hanya dapat dibuat atas nama pengajar kursus. Mencoba membuat CourseWork atas nama siswa, atau administrator domain yang bukan pengajar di kursus, akan menghasilkan error PERMISSION_DENIED. Lihat Jenis pengguna untuk mempelajari lebih lanjut berbagai peran di Classroom.

Saat membuat CourseWork menggunakan metode courses.courseWork.create, Anda dapat melampirkan link sebagai materials, yang ditunjukkan dalam contoh kode di bawah ini:

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

Kolom title dan workType wajib diisi. Semua kolom lainnya bersifat opsional. Jika state tidak ditentukan, CourseWork akan dibuat dalam status draf.

Gunakan Resource link dengan target url yang ditentukan untuk menyertakan materi tertaut dalam CourseWork. Classroom otomatis mengambil title dan URL gambar thumbnail (thumbnailUrl). Classroom API juga mendukung materi Google Drive dan YouTube secara native, yang dapat disertakan dengan resource DriveFile atau resource YouTubeVideo dengan cara yang serupa.

Untuk menentukan batas waktu, tetapkan kolom dueDate dan dueTime ke waktu UTC yang sesuai. Batas waktu harus di masa mendatang.

Respons CourseWork menyertakan ID yang ditetapkan server yang dapat digunakan untuk mereferensikan penetapan dalam permintaan API lainnya.

Mengambil Tugas Kursus

Anda dapat mengambil CourseWork atas nama siswa dan pengajar kursus yang sesuai. Anda juga dapat mengambil CourseWork atas nama administrator domain, meskipun mereka bukan pengajar di kursus. Untuk mengambil CourseWork tertentu, gunakan courses.courseWork.get. Untuk mengambil semua CourseWork (opsional yang cocok dengan beberapa kriteria), gunakan courses.courseWork.list.

Cakupan yang diperlukan bergantung pada peran yang dimiliki pengguna yang meminta dalam kursus. Jika pengguna adalah siswa, gunakan salah satu cakupan berikut:

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

Jika pengguna adalah pengajar atau administrator domain, gunakan salah satu cakupan berikut:

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

Memiliki izin untuk mengambil CourseWork tidak menyiratkan izin untuk mengakses materi atau metadata materi. Dalam praktiknya, hal ini berarti administrator mungkin tidak melihat judul file Drive terlampir jika mereka bukan anggota kursus.

Mengelola respons siswa

Resource StudentSubmission mewakili pekerjaan yang dilakukan oleh siswa untuk CourseWork. Referensi ini mencakup metadata yang terkait dengan pekerjaan, seperti status dan nilai pekerjaan. StudentSubmission dibuat secara implisit untuk setiap siswa saat CourseWork baru dibuat.

Bagian berikut menjelaskan tindakan umum yang mengelola respons siswa.

Mengambil respons siswa

Siswa dapat mengambil kiriman mereka sendiri, pengajar dapat mengambil kiriman untuk semua siswa di kursus mereka, dan administrator domain dapat mengambil semua kiriman untuk semua siswa di domain mereka. Setiap StudentSubmission diberi ID. Jika Anda mengetahui ID-nya, gunakan courses.courseWork.studentSubmissions.get untuk mengambil kiriman.

Gunakan metode courses.courseWork.studentSubmissions.list untuk mendapatkan semua resource StudentSubmission yang cocok dengan beberapa kriteria, seperti yang ditunjukkan dalam contoh berikut:

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

Ambil resource StudentSubmission milik siswa tertentu dengan menentukan parameter userId, seperti yang ditunjukkan dalam contoh berikut:

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

Siswa diidentifikasi dengan ID unik atau alamat email, seperti yang direpresentasikan dalam resource Student. Pengguna saat ini juga dapat merujuk ke ID-nya sendiri menggunakan singkatan "me".

Anda juga dapat mengambil kiriman siswa untuk semua tugas dalam kursus. Untuk melakukannya, gunakan "-" literal sebagai courseWorkId, seperti yang ditunjukkan dalam contoh berikut:

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

Cakupan yang diperlukan bergantung pada peran yang dimiliki pengguna yang meminta dalam kursus. Jika pengguna adalah pengajar atau administrator domain, gunakan cakupan berikut:

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

Jika pengguna adalah siswa, gunakan cakupan berikut:

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

Memiliki izin untuk mengambil StudentSubmission tidak menyiratkan izin untuk mengakses lampiran atau metadata lampiran. Dalam praktiknya, ini berarti bahwa administrator mungkin tidak melihat judul file Drive yang dilampirkan jika mereka bukan anggota kursus.

Menambahkan lampiran ke jawaban siswa

Anda dapat melampirkan link ke kiriman siswa dengan melampirkan resource Link, DriveFile, atau YouTubeVideo. Hal ini dilakukan dengan courses.courseWork.studentSubmissions.modifyAttachments, seperti yang ditunjukkan dalam contoh berikut:

Java

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;

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

Lampiran Link ditentukan oleh url target; Classroom otomatis mengambil title dan gambar thumbnail (thumbnailUrl). Lihat Material untuk mempelajari materi yang dapat dilampirkan ke StudentSubmissions.

StudentSubmission hanya dapat diubah oleh pengajar kursus atau oleh siswa yang memilikinya. Anda hanya dapat melampirkan Materials jika CourseWorkType dari StudentSubmission adalah ASSIGNMENT.

Cakupan yang diperlukan bergantung pada peran yang dimiliki pengguna yang meminta dalam kursus. Jika pengguna adalah pengajar, gunakan cakupan berikut:

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

Jika pengguna adalah siswa, gunakan cakupan berikut:

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