Sınıf Çalışmalarını ve Notları Yönetme

Classroom kullanıcı arayüzü beş Sınıf Çalışması türünü destekler: Ödevler, Test Ödevleri, Kısa yanıtlı sorular, Çoktan seçmeli sorular ve Malzemeler. Classroom API şu anda bu türlerden üçünü desteklemektedir. API için CourseWorkType olarak bilinir: Ödevler, Kısa yanıt ve çoktan seçmeli sorular arasında seçim yapabilirsiniz.

Bu işleve erişmek için CourseWork kaynağı olduğu için Bu alan, şuradaki öğrencilere atanmış bir Ödev veya Soruyu tüm ek materyaller ve ayrıntılar da dahil olmak üzere görevleri zamanında tamamlamak için veya maks. 10 puan olabilir.

CourseWork kaynağına ek olarak tamamlanmış ödevleri yönetebilirsiniz StudentSubmission kaynağıyla değiştirin. Aşağıdaki bölümlerde bu özellikler, ayrıntılı olarak inceleyelim.

Ödev oluşturma

Ödevler yalnızca dersin öğretmenleri ve öğretmenleri adına oluşturulabilir bir öğrenci adına derste ödev oluşturmaya çalışmak 403 PERMISSION_DENIED hatası verir. Benzer şekilde, alan yöneticileri de Öğretmedikleri derslerle ilgili ödevler verme ve bunu API üzerinden yapmaya çalıştıkları 403 PERMISSION_DENIED hatasına da neden olur.

courses.courseWork.create yöntemini kullanarak ödev oluştururken , aşağıdaki örnek kodda gösterildiği gibi, bağlantıları materials olarak ekleyebilir:

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)

Sonuç, referans olarak kullanılabilecek, sunucu tarafından atanmış bir tanımlayıcı içerir diğer API isteklerindeki atamayı oluşturur.

Classroom API üzerinden oluşturulan bir ödeve bağlantılı materyalleri dahil etmek için: Aşağıdaki seçenekleri kullanarak bir Kaynağı bağla'yı kullanın: hedef URL. Classroom, başlığı ve küçük resmi otomatik olarak getirir. Classroom API, Google Drive ve YouTube materyallerini yerleşik olarak destekler. bir DriveFile kaynağı veya Benzer bir YouTubeVideo kaynağı sağlar.

Bir teslim tarihi belirtmek için dueDate ve dueTime alanlarını karşılık gelen UTC saatine göre belirlenir. Son tarih gelecekte olmalıdır.

Ödev ve soruları alma

Şuradaki öğrenci ve öğretmenleri için ödev ve soruları alabilirsiniz: bir alan adı yöneticisi tarafından yapılır. Belirli bir veya soruya yanıt vermek istiyorsanız, course.courseWork.get adresini kullanın. Tümünü almak için (isteğe bağlı olarak bazı ölçütlerle eşleşen ödevler veya sorular) courses.courseWork.list.

Gerekli kapsam, istekte bulunan kullanıcının ele alacağız. Kullanıcı bir öğrenciyse aşağıdaki kapsamlardan birini kullanın:

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

Kullanıcı bir öğretmen veya alan yöneticisi ise aşağıdakilerden birini kullanın: kapsamlar:

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

Bir ödevi veya soruyu alma iznine sahip olmak, materyallere veya malzeme meta verilerine erişim izinleri. Pratikte bu, ekteki bir Drive dosyasının başlığını göremeyebilir. bu kursun üyesi değilsiniz. Yöneticilerin kullanıcıya erişmesine izin vermek istiyorsanız hakkında daha fazla bilgi için alan genelinde yetki rehberini inceleyin.

Öğrenci yanıtlarını yönetme

StudentSubmission kaynak, öğrencinin bir ödev için yaptığı çalışmayı ve notunu temsil eder soru. StudentSubmission yeni bir soru ortaya çıktığında veya her öğrenci için atama işlemi oluşturulur.

Aşağıdaki bölümlerde, öğrenci yanıtlarını yöneten yaygın işlemler açıklanmaktadır.

Öğrenci yanıtlarını alma

Öğrenciler kendi gönderimlerini, öğretmenler ise gönderimleri alabilir. olanak sağlar ve alan yöneticileri tüm öğrencilerin gönderimlerini ekleyebilirsiniz. Her öğrenci gönderimi bir tanımlayıcı atayan; tanımlayıcıyı biliyorsanız Anahtarı almak için courses.courseWork.studentSubmissions.get.

Aşağıdakileri almak için courses.courseWork.studentSubmissions.list yöntemini kullanın: Şu kriterlerde gösterildiği gibi bazı kriterlerle eşleşen StudentSubmission kaynaklar: şu örnekteki gibi:

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)

Belirli bir öğrenciye ait StudentSubmission kaynaklarını şu şekilde alma: aşağıdaki örnekte gösterildiği gibi userId parametresini belirtir:

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

Öğrenciler, kullanıcının benzersiz kimliği veya e-posta adresiyle şu şekilde tanımlanır: Google Yönetici Konsolu SDK'sı tarafından döndürüldü. Geçerli kullanıcı kendi "me" kısaltmasını kullanan kimlik.

Ayrıca, belirli bir zaman dilimindeki tüm ödevler için ele alacağız. Bunun için courseWorkId olarak, "-" değişmez değerini kullanın: şu örnekteki gibi:

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

Gerekli kapsam, istekte bulunan kullanıcının ele alacağız. Kullanıcı bir öğretmen veya alan ise aşağıdaki kapsamı kullanın yönetici:

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

Kullanıcı bir öğrenciyse aşağıdaki kapsamı kullanın:

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

Bir öğrencinin ödevini alma iznine sahip olmak, eklere veya ek meta verilerine erişim iznidir. Pratikte bu bir yöneticinin, aşağıdaki durumlarda ekli bir Drive dosyasının başlığını göremeyeceği anlamına gelir: bu kursa üye değiller. Yöneticilerin erişimine izin vermek istiyorsanız kullanıcı dosyalarına eklemek için alan genelinde yetki rehberini inceleyin.

Öğrenci yanıtına dosya ekleme

Bir Link, DriveFile veya YouTubeVideo kaynağı. Bu işlem şununla yapılır: courses.courseWork.studentSubmissions.modifyAttachments, şu örnekteki gibi:

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

Bağlantı eki, hedef URL tarafından tanımlanır; Classroom, başlığı ve küçük resmi getirir. Diğer materyaller hakkında bilgi edinmek için şu adresi ziyaret edin: ilgili referans sayfaları oluşturabilirsiniz.

StudentSubmission yalnızca bir dersin öğretmeni veya tarafından değiştirilebilir. öğrenciyi seçin. Materials simgesini yalnızca Öğrenci gönderiminin CourseWorkType kadarı ASSIGNMENT.

Gerekli kapsam, istekte bulunan kullanıcının ele alacağız. Kullanıcı bir öğretmense aşağıdaki kapsamı kullanın:

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

Kullanıcı bir öğrenciyse aşağıdaki kapsamı kullanın:

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

Öğrenci yanıtı durumunu yönetme

Bir öğrencinin yanıtı iptal edilebilir, teslim edilebilir veya geri verilebilir. Eyalet alanı StudentSubmission ifadesi geçerli durumu belirtir. Durumu değiştirmek için şu numarayı arayın: aşağıdaki yöntemlerden birini uygulayabilirsiniz:

Tüm bu yöntemler boş bir gövde alır. Örnek:

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

Yalnızca StudentSubmission sahibi olan öğrenci bunu teslim edebilir veya geri almak isteyebilir. Yalnızca teslim edilmiş ödevler geri alınabilir. Ders öğretmenleri yalnızca Teslim edilmiş durumdaki StudentSubmission.

Öğrenci yanıtlarına not verme

StudentSubmission kaynağında notları depolamak için iki alan bulunur: Öğrencilere bildirilen not olan assignedGrade ve draftGrade, Bu, yalnızca öğretmenlerin görebildiği geçici bir nottur. Bu alanlar güncellenir courses.courseWork.studentSubmissions.patch'i alan maskesiyle kullanarak aşağıdaki örnekte gösterildiği gibi uygun alanları içeren bir satır öğesi seçin.

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

Öğretmenler Classroom kullanıcı arayüzüyle çalışırken, gerekli işlemleri yapana kadar not atayamazlar. önce geçici not kaydettiniz. Böylece, atanan not daha sonra öğrenciyim. Uygulamaların bu davranışı emüle etmesi gerekir. Uygulamanız şunları yapabilir: öğrencinin ödevine iki yöntemden birini kullanarak not verebilirsiniz:

  • Yalnızca draftGrade bilgisini atayın. Bu özellik örneğin, öğretmenin notları manuel olarak incelemelidir. Öğrenciler geçici notları göremez.

  • Bir ödeve tam not vermek için hem draftGrade hem de assignedGrade ödev verin.

Atanan notları listeleme

Belirli bir sınıf çalışması öğesine ilişkin tüm notları courses.courseWork.studentSubmissions.list yönteminin yanıt nesnesi:

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