Mengelola Tugas Kelas dan Nilai

UI Classroom mendukung lima jenis Tugas Kelas: Tugas, Tugas Kuis, Pertanyaan jawaban singkat, Pertanyaan pilihan ganda, dan Materi. Classroom API saat ini mendukung tiga jenis ini, yang dikenal sebagai CourseWorkType untuk API: Tugas, Jawaban singkat pertanyaan, dan Pertanyaan pilihan ganda.

Untuk mengakses fungsi ini, Anda dapat menggunakan Referensi CourseWork, yang mewakili Tugas atau Pertanyaan yang telah diberikan kepada siswa dalam materi tertentu, termasuk materi dan detail tambahan apa pun, seperti tanggal atau skor maks.

Selain materi CourseWork, Anda dapat mengelola tugas yang telah selesai dengan resource StudentSubmission. Bagian berikut menjelaskan hal ini secara lebih detail.

Membuat tugas

Tugas hanya dapat dibuat atas nama pengajar kursus dan mencoba membuat tugas di mata pelajaran atas nama siswa akan menghasilkan dalam error PERMISSION_DENIED 403. Demikian juga, admin domain juga tidak dapat membuat tugas untuk mata pelajaran yang tidak mereka ajarkan dan berusaha melakukannya melalui API juga akan menghasilkan error PERMISSION_DENIED 403.

Saat membuat tugas menggunakan metode courses.courseWork.create, Anda dapat melampirkan link sebagai materials, yang ditampilkan pada kode contoh di bawah:

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)

Hasilnya mencakup ID yang ditetapkan server yang dapat digunakan untuk mereferensikan penetapan dalam permintaan API lainnya.

Untuk menyertakan materi yang ditautkan dalam tugas yang dibuat melalui Classroom API, gunakan Link resource, yang menentukan URL target. Classroom akan mengambil judul dan gambar thumbnail secara otomatis. Classroom API juga mendukung materi Google Drive dan YouTube secara native, yang dapat disertakan dengan resource DriveFile atau Referensi YouTubeVideo dengan cara serupa sebelumnya.

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

Mengambil tugas dan pertanyaan

Anda dapat mengambil tugas dan pertanyaan untuk siswa dan pengajar terkait atau oleh administrator domain. Untuk mengambil tugas atau pertanyaan, gunakan course.courseWork.get. Untuk mengambil semua tugas atau pertanyaan (cocok dengan beberapa kriteria), gunakan courses.courseWork.list.

Cakupan yang diperlukan bergantung pada peran yang dimiliki pengguna yang meminta dalam materi sebelumnya. 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 opsi berikut cakupan:

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

Memiliki izin untuk mengambil tugas atau pertanyaan tidak berarti izin akses untuk mengakses material atau metadata material. Dalam praktiknya, ini berarti administrator mungkin tidak melihat judul file Drive yang dilampirkan jika bukan anggota pelatihan. Jika Anda ingin mengizinkan administrator mengakses pengguna lihat direktori seluruh domain delegasi kami.

Mengelola jawaban siswa

StudentSubmission sumber daya mewakili pekerjaan yang dilakukan dan nilai siswa untuk tugas atau pertanyaan tersebut. StudentSubmission secara implisit dibuat untuk setiap siswa ketika ada pertanyaan baru atau tugas dibuat.

Bagian berikut menjelaskan tindakan umum yang mengelola respons siswa.

Mengambil jawaban siswa

Siswa dapat mengambil kiriman mereka sendiri, pengajar dapat mengambil kiriman untuk semua siswa dalam mata pelajaran mereka, dan administrator domain dapat mengambil semua kiriman untuk semua siswa di domain mereka. Setiap kiriman siswa diberi ID; jika Anda tahu pengidentifikasinya, gunakan courses.courseWork.studentSubmissions.get untuk mengambilnya.

Gunakan metode courses.courseWork.studentSubmissions.list untuk mendapatkan Resource StudentSubmission yang cocok dengan beberapa kriteria, seperti yang ditampilkan 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)

Mengambil materi StudentSubmission milik siswa tertentu dengan yang 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 berdasarkan ID unik atau alamat email pengguna, sebagai yang ditampilkan oleh Google Admin SDK. Pengguna saat ini juga dapat merujuk ke ID menggunakan singkatan "me".

Anda juga dapat memperoleh pengumpulan tugas dari siswa dalam materi sebelumnya. 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 materi sebelumnya. Gunakan cakupan berikut jika pengguna adalah pengajar atau domain administrator:

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

Gunakan cakupan berikut jika pengguna adalah siswa:

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

Memiliki izin untuk mengambil tugas yang dikirimkan siswa tidak berarti izin untuk mengakses lampiran atau metadata lampiran. Dalam praktiknya, berarti bahwa administrator mungkin tidak melihat judul dari file Drive yang dilampirkan jika mereka bukan anggota pelatihan. Jika Anda ingin mengizinkan akses administrator ke file pengguna, lihat panduan delegasi tingkat domain.

Menambahkan lampiran ke respons siswa

Anda dapat melampirkan link ke kiriman siswa dengan melampirkan 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 akan otomatis mengambil judul dan gambar thumbnail. Anda dapat mempelajari tentang materi lainnya di halaman referensi masing-masing.

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

Cakupan yang diperlukan bergantung pada peran yang dimiliki pengguna yang meminta dalam materi sebelumnya. Gunakan cakupan berikut jika pengguna adalah pengajar:

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

Gunakan cakupan berikut jika pengguna adalah siswa:

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

Mengelola status respons siswa

Jawaban siswa mungkin dibatalkan pengirimannya, diserahkan, atau dikembalikan. Kolom negara bagian di StudentSubmission menunjukkan status saat ini. Untuk mengubah status, panggil salah satu metode berikut:

Semua metode ini menggunakan isi kosong. Contoh:

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

Hanya siswa yang memiliki StudentSubmission yang dapat menyerahkan atau mengklaimnya kembali. Hanya kiriman yang telah diserahkan yang dapat diklaim kembali. Pengajar kursus hanya dapat mengembalikan StudentSubmission yang berada dalam status diserahkan.

Menilai respons siswa

Resource StudentSubmission memiliki dua kolom untuk menyimpan nilai: assignedGrade, yang merupakan nilai yang dilaporkan kepada siswa, dan draftGrade, yaitu kelas sementara yang hanya dapat dilihat oleh pengajar. Kolom ini diperbarui menggunakan courses.courseWork.studentSubmissions.patch dengan mask kolom berisi bidang yang sesuai, seperti yang ditunjukkan dalam contoh berikut.

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

Saat menggunakan UI Classroom, pengajar tidak dapat memberikan nilai sampai mereka menyimpan draf nilai terlebih dahulu. Nilai yang diberikan kemudian dapat dikembalikan ke seorang siswa. Aplikasi harus mengemulasikan perilaku ini. Permohonan Anda dapat menilai tugas siswa dengan salah satu dari dua cara berikut:

  • Tetapkan draftGrade saja. Hal ini berguna, misalnya, untuk memungkinkan pengajar meninjau nilai secara manual sebelum menyelesaikannya. Siswa tidak dapat melihat draf nilai.

  • Tetapkan draftGrade dan assignedGrade untuk menilai tugas sepenuhnya.

Mencantumkan nilai yang diberikan

Anda dapat mencantumkan semua nilai untuk item tugas mata pelajaran tertentu dengan menjelajahi Objek respons metode 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'))}")