จัดการงานของชั้นเรียน

Classroom มีงานของชั้นเรียน 5 ประเภท ได้แก่ งาน แบบทดสอบ คําถาม (คําตอบสั้นๆ และตัวเลือกหลายข้อ) และสื่อการสอน ขณะนี้ Classroom API ช่วยให้นักพัฒนาซอฟต์แวร์อ่านและเขียนประเภท 3 ประเภทต่อไปนี้ได้ งาน คําถาม และสื่อการสอน

หากต้องการเข้าถึงฟังก์ชันการทํางานนี้ คุณสามารถใช้ทรัพยากรของ Classroom ซึ่งแสดงถึงงานหรือคําถามที่มอบหมายให้นักเรียนในหลักสูตรนั้นๆ รวมถึงสื่อและรายละเอียดเพิ่มเติม เช่น วันที่ครบกําหนดหรือคะแนนสูงสุด

นอกจากทรัพยากรใน CourseWork แล้ว คุณยังจัดการงานที่ทําเสร็จแล้วได้ด้วยทรัพยากร StudentSubmission ส่วนต่อไปนี้จะอธิบายหัวข้อเหล่านี้โดยละเอียด

สร้างงาน

สร้างงานใน Google ในนามของครูได้เท่านั้นและพยายามสร้างงานในหลักสูตรในนามของนักเรียนจะทําให้เกิดข้อผิดพลาด 403 PERMISSION_DENIED ในทํานองเดียวกัน ผู้ดูแลระบบโดเมนก็ไม่สามารถสร้างหลักสูตรสําหรับหลักสูตรที่ไม่ได้สอน และพยายามทําเช่นนั้นผ่าน API จะส่งผลให้เกิดข้อผิดพลาด PERMISSION_DENIED 403 ด้วยเช่นกัน

เมื่อสร้างงาน คุณจะแนบลิงก์เป็น materials ได้ ดังที่แสดงไว้ในโค้ดตัวอย่างด้านล่าง

Python

Classroom/snippets/classroom_create_coursework.py
from __future__ import print_function

import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError


def classroom_create_coursework(course_id):

    """
    Creates the coursework the user has access to.
    Load pre-authorized user credentials from the environment.
    TODO(developer) - See https://developers.google.com/identity
    for guides on implementing OAuth2 for the application.
    """

    creds, _ = google.auth.default()
    # pylint: disable=maybe-no-member

    try:
        service = build('classroom', 'v1', credentials=creds)
        coursework = {
            'title': 'Ant colonies',
            'description': '''Read the article about ant colonies
                              and complete the quiz.''',
            'materials': [
                {'link': {'url': 'http://example.com/ant-colonies'}},
                {'link': {'url': 'http://example.com/ant-quiz'}}
            ],
            'workType': 'ASSIGNMENT',
            'state': 'PUBLISHED',
        }
        coursework = service.courses().courseWork().create(
            courseId=course_id, body=coursework).execute()
        print(f"Assignment created with ID {coursework.get('id')}")
        return coursework

    except HttpError as error:
        print(f"An error occurred: {error}")
        return error


if __name__ == '__main__':
    # Put the course_id of course whose coursework needs to be created,
    # the user has access to.
    classroom_create_coursework(453686957652)

ผลลัพธ์จะมีตัวระบุที่เซิร์ฟเวอร์กําหนดซึ่งใช้เพื่ออ้างอิงงานในคําขอ API อื่นๆ ได้

หากต้องการรวมสื่อที่ลิงก์ไว้ในงานซึ่งสร้างผ่าน Classroom API ให้ใช้ทรัพยากรลิงก์ โดยระบุ URL เป้าหมาย Classroom จะดึงข้อมูลชื่อและภาพขนาดย่อโดยอัตโนมัติ Classroom API ยังรองรับเนื้อหาในไดรฟ์และ YouTube อยู่แล้ว ซึ่งควรรวมอยู่ในทรัพยากร DriveFile หรือทรัพยากรวิดีโอ YouTube ด้วยวิธีที่คล้ายกัน

หากต้องการระบุวันที่ครบกําหนด ให้ตั้งค่าช่อง dueDate และ dueTime เป็นเวลา UTC ที่เกี่ยวข้อง วันที่ครบกําหนดจะต้องเป็นวันที่ในอนาคต

เรียกข้อมูลงานและคําถาม

คุณสามารถเรียกดูงานและคําถามของนักเรียนและครูของหลักสูตรที่เกี่ยวข้องหรือผู้ดูแลระบบโดเมน หากต้องการเรียกดูงานหรือคําถามที่ต้องการโดยเฉพาะ ให้ใช้course.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

การจะมีสิทธิ์เรียกข้อมูลงานหรือคําถามไม่ได้บอกเป็นนัยว่ามีสิทธิ์เข้าถึงเนื้อหาหรือข้อมูลเมตาของเนื้อหา ในทางปฏิบัติหมายความว่าผู้ดูแลระบบจะไม่เห็นชื่อไฟล์ของไฟล์แนบ หากผู้ใช้เหล่านั้นไม่ใช่สมาชิกของหลักสูตร หากต้องการอนุญาตให้ผู้ดูแลระบบเข้าถึงไฟล์ของผู้ใช้ โปรดดูคู่มือการมอบสิทธิ์ทั่วทั้งโดเมน

จัดการคําตอบของนักเรียน

ทรัพยากร StudentSubmission แสดงถึงงานที่ทําและให้คะแนนนักเรียนสําหรับงานหรือคําถาม ทรัพยากร StudentSubmission สร้างขึ้นสําหรับนักเรียนแต่ละคนโดยปริยายเมื่อมีการสร้างคําถามหรืองานใหม่

ส่วนต่อไปนี้จะอธิบายการดําเนินการทั่วไปที่จัดการคําตอบของนักเรียน

เรียกดูคําตอบของนักเรียน

นักเรียนสามารถเรียกงานที่ส่งของตนเอง ครูสามารถดึงงานให้นักเรียนทุกคนในหลักสูตร และผู้ดูแลระบบโดเมนสามารถเรียกการส่งทั้งหมดสําหรับนักเรียนทั้งหมดในโดเมน จะมีการส่งตัวระบุให้กับนักเรียนแต่ละคน หากคุณทราบตัวระบุ ให้ใช้ courses.courseWork.studentSubmissions.get เพื่อเรียกข้อมูล

ใช้course.courseWork.studentSubmissions.list เพื่อรับ StudentSubmission ที่ตรงกับเกณฑ์บางประการดังตัวอย่างต่อไปนี้

Python

Classroom/snippets/classroom_list_submissions.py
from __future__ import print_function

import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError


def classroom_list_submissions(course_id, coursework_id):
    """
    Creates the courses the user has access to.
    Load pre-authorized user credentials from the environment.
    TODO(developer) - See https://developers.google.com/identity
    for guides on implementing OAuth2 for the application.
    """

    creds, _ = google.auth.default()
    # pylint: disable=maybe-no-member
    submissions = []
    page_token = None

    try:
        service = build('classroom', 'v1', credentials=creds)
        while True:
            coursework = service.courses().courseWork()
            response = coursework.studentSubmissions().list(
                pageToken=page_token,
                courseId=course_id,
                courseWorkId=coursework_id,
                pageSize=10).execute()
            submissions.extend(response.get('studentSubmissions', []))
            page_token = response.get('nextPageToken', None)
            if not page_token:
                break

        if not submissions:
            print('No student submissions found.')

        print('Student Submissions:')
        for submission in submissions:
            print(f"Submitted at:"
                  f"{(submission.get('id'), submission.get('creationTime'))}")

    except HttpError as error:
        print(f"An error occurred: {error}")
        submissions = None
    return submissions


if __name__ == '__main__':
    # Put the course_id and coursework_id of course whose list needs to be
    # submitted.
    classroom_list_submissions(453686957652, 466086979658)

ดึงงานที่นักเรียน/นักศึกษาเป็นของนักเรียนแต่ละคนโดยการระบุพารามิเตอร์ userId ดังตัวอย่างต่อไปนี้

Python

Classroom/snippets/classroom_list_student_submissions.py
from __future__ import print_function

import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError


def classroom_list_student_submissions(course_id, coursework_id, user_id):
    """
    Creates the courses the user has access to.
    Load pre-authorized user credentials from the environment.
    TODO(developer) - See https://developers.google.com/identity
    for guides on implementing OAuth2 for the application.
    """

    creds, _ = google.auth.default()
    # pylint: disable=maybe-no-member
    submissions = []
    page_token = None

    try:
        service = build('classroom', 'v1', credentials=creds)
        while True:
            coursework = service.courses().courseWork()
            response = coursework.studentSubmissions().list(
                pageToken=page_token,
                courseId=course_id,
                courseWorkId=coursework_id,
                userId=user_id).execute()
            submissions.extend(response.get('studentSubmissions', []))
            page_token = response.get('nextPageToken', None)
            if not page_token:
                break

        if not submissions:
            print('No student submissions found.')

        print('Student Submissions:')
        for submission in submissions:
            print(f"Submitted at:"
                  f"{(submission.get('id'), submission.get('creationTime'))}")

    except HttpError as error:
        print(f"An error occurred: {error}")
    return submissions


if __name__ == '__main__':
    # Put the course_id, coursework_id and user_id of course whose list needs
    # to be submitted.
    classroom_list_student_submissions(453686957652, 466086979658, "me")

ระบบจะระบุนักเรียนด้วยรหัสที่ไม่ซ้ํากันหรืออีเมลของผู้ใช้ตามที่ Google Admin SDK แสดงผลไว้ ผู้ใช้ปัจจุบันอาจดูรหัสของตนเองได้โดยใช้ "me" แบบสั้น

นอกจากนี้ยังรับงานของนักเรียนสําหรับงานทั้งหมดภายในหลักสูตรได้ด้วย โดยใช้อักขระ "-" ตามตัวอักษรเป็นCourseWorkId ตามที่แสดงในตัวอย่างต่อไปนี้

Python

service.courses().courseWork().studentSubmissions().list(
    courseId=<course ID or alias>,
    courseWorkId='-',
    userId=<user ID>).execute()

ขอบเขตที่จําเป็นขึ้นอยู่กับบทบาทที่ผู้ใช้ขอในหลักสูตรนี้ ใช้ขอบเขตต่อไปนี้หากผู้ใช้เป็นครูหรือผู้ดูแลระบบโดเมน

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

ใช้ขอบเขตต่อไปนี้หากผู้ใช้เป็นนักเรียน

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

การมีสิทธิ์เรียกข้อมูลงานที่นักเรียนส่งไม่ได้เป็นการบอกเป็นนัยว่า มีสิทธิ์เข้าถึงไฟล์แนบหรือข้อมูลเมตาของไฟล์แนบ ในทางปฏิบัติหมายความว่าผู้ดูแลระบบจะไม่เห็นชื่อไฟล์ของไฟล์แนบ หากผู้ใช้เหล่านั้นไม่ได้เป็นสมาชิกของหลักสูตร หากต้องการอนุญาตให้ผู้ดูแลระบบเข้าถึงไฟล์ของผู้ใช้ โปรดดูคําแนะนําที่การมอบสิทธิ์ทั่วทั้งโดเมน

การเพิ่มไฟล์แนบในคําตอบของนักเรียน

คุณสามารถแนบลิงก์ไปยังงานที่ส่งโดยแนบแหล่งข้อมูล Link, DriveFile หรือ YouTubeVideo ก็ได้ ดังตัวอย่างต่อไปนี้มี courses.courseWork.studentSubmissions.modifyAttachments ดังที่แสดงในตัวอย่างต่อไปนี้

Python

Classroom/snippets/classroom_add_attachment.py

def classroom_add_attachment(course_id, coursework_id, submission_id):
    """
    Adds attachment to existing course with specific course_id.
    Load pre-authorized user credentials from the environment.
    TODO(developer) - See https://developers.google.com/identity
    for guides on implementing OAuth2 for the application.
    """
    creds, _ = google.auth.default()
    # pylint: disable=maybe-no-member
    request = {
        'addAttachments': [
            {'link': {'url': 'http://example.com/quiz-results'}},
            {'link': {'url': 'http://example.com/quiz-reading'}}
        ]
    }

    try:
        service = build('classroom', 'v1', credentials=creds)
        while True:
            coursework = service.courses().courseWork()
            coursework.studentSubmissions().modifyAttachments(
                courseId=course_id,
                courseWorkId=coursework_id,
                id=submission_id,
                body=request).execute()

    except HttpError as error:
        print(f"An error occurred: {error}")


if __name__ == '__main__':
    # Put the course_id, coursework_id and submission_id of course in which
    # attachment needs to be added.
    classroom_add_attachment('course_id', 'coursework_id', "me")

ไฟล์แนบของลิงก์จะกําหนดโดย URL เป้าหมาย Classroom จะดึงข้อมูลชื่อและภาพขนาดย่อโดยอัตโนมัติ และดูข้อมูลเพิ่มเติมเกี่ยวกับเนื้อหาอื่นๆ ได้ในหน้าอ้างอิงที่เกี่ยวข้อง

ครูสามารถสร้างเนื้อหาได้โดยนักเรียนของหลักสูตรหรือโดยนักเรียนที่เป็นเจ้าของงานที่ส่งที่เกี่ยวข้อง แต่เฉพาะสําหรับงานที่นักเรียนส่งซึ่งมี courseWorkType จาก "ASSIGNMENT" รายการ

ขอบเขตที่จําเป็นขึ้นอยู่กับบทบาทที่ผู้ใช้ขอในหลักสูตรนี้ ใช้ขอบเขตต่อไปนี้หากผู้ใช้เป็นครู

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

ใช้ขอบเขตต่อไปนี้หากผู้ใช้เป็นนักเรียน

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

จัดการสถานะคําตอบของนักเรียน

นักเรียนอาจส่งงาน ส่งคืน หรือส่งคืนไม่ได้ ช่องสถานะใน StudentSubmission จะระบุสถานะปัจจุบัน หากต้องการเปลี่ยนสถานะ ให้เรียกวิธีใดวิธีหนึ่งต่อไปนี้

วิธีการเหล่านี้ทั้งหมดจะใช้เนื้อหาว่างเปล่า เช่น

Python

service.courses().courseWork().studentSubmission().turnIn(
    courseId=<course ID or alias>,
    courseWorkId=<courseWork ID>,
    id=<studentSubmission ID>,
    body={}).execute()

เฉพาะนักเรียนที่เป็นเจ้าของงานของนักเรียนเท่านั้นที่จะส่งงานหรืออ้างสิทธิ์คืนได้ เฉพาะงานที่ส่งแล้วเท่านั้นที่สามารถอ้างสิทธิ์ซ้ําได้ ครูผู้สอนของหลักสูตรจะส่งได้เฉพาะ StudentSubmission ที่อยู่ในสถานะนักเรียนส่งเท่านั้น

ให้คะแนนคําตอบของนักเรียน

ทรัพยากร StudentSubmission มีช่องสําหรับจัดเก็บเกรด 2 ช่อง ได้แก่ assignedGrade ซึ่งเป็นเกรดที่รายงานให้นักเรียน และ draftGrade ซึ่งเป็นเกรดเบื้องต้นที่ครูเห็นได้อย่างเดียว ช่องเหล่านี้ได้รับการอัปเดตโดยใช้ courses.courseWork.studentSubmissions.patch ที่มีมาสก์ของช่องที่มีช่องที่เหมาะสมดังที่แสดงในตัวอย่างต่อไปนี้

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

เมื่อใช้ UI ของ Classroom ครูจะมอบหมายคะแนนไม่ได้จนกว่าจะบันทึกคะแนนคร่าวๆ ก่อน จากนั้นจึงส่งคืนคะแนนที่มอบหมายให้กับนักเรียนได้ แอปพลิเคชันต้องจําลองการทํางานนี้ แอปพลิเคชันจะให้คะแนนงานของนักเรียนได้โดยใช้วิธีใดวิธีหนึ่งจาก 2 วิธีนี้

  • กําหนดเฉพาะ draftGrade ซึ่งจะมีประโยชน์ เช่น ให้ครูได้ ตรวจสอบคะแนนด้วยตนเองก่อนสรุปผล นักเรียนจะไม่เห็นคะแนนคร่าวๆ

  • มอบหมายทั้ง draftGrade และ assignedGrade เพื่อให้คะแนนงานอย่างเต็มที่