ציונים של קבצים מצורפים וחזרת ציונים

זוהי ההדרכה השישית בסדרת ההדרכה המפורטת על תוספים ל-Classroom.

בהדרכה המפורטת הזו תשנו את הדוגמה מהשלב הקודם של ההדרכה המפורטת כדי ליצור קובץ מצורף מסוג פעילות מסוג ציון. אתם גם מעבירים ציון חזרה ל-Google Classroom באופן פרוגרמטי, שמופיע בספר הציונים של המורה.

הדרכה מפורטת זו שונה מעט מהדרכה אחרת בסדרה, בכך שיש שתי גישות אפשריות להעברת ציונים בחזרה ל-Classroom. לשניהם יש השפעה שונה על חוויית המפתחים ועל חוויית המשתמש. כדאי להביא בחשבון את שתי הפעולות האלה כשמעצבים את התוסף ל-Classroom. לדיון נוסף על אפשרויות ההטמעה, קראו את דף המדריך בנושא אינטראקציה עם קבצים מצורפים.

שימו לב שתכונות מתן הציונים ב-API הן אופציונליות. אפשר להשתמש בהם עם כל קובץ מצורף מסוג פעילות.

במהלך ההדרכה המפורטת תשלימו את הפעולות הבאות:

  • שינוי הבקשות הקודמות ליצירת קבצים מצורפים ל-Classroom API כדי להגדיר גם את מכנה הציון של הקובץ המצורף.
  • בדקו באופן פרוגרמטי את הציון על המטלה של התלמיד, והגדירו את מונה הציונים של הקובץ המצורף.
  • יישום שתי גישות להעברת הציון של הגשה ל-Classroom באמצעות פרטי כניסה של מורה מחובר או אופליין.

כשהתהליך יסתיים, הציונים יופיעו בגיליון הציונים ב-Classroom. הרגע המדויק שבו זה קורה תלוי בגישת ההטמעה.

לצורך הדוגמה הזו, עושים שימוש חוזר בפעילות מההדרכה המפורטת הקודמת, שבה מוצגת לתלמיד תמונה של ציון דרך מפורסם, ומתבקש להזין את השם שלו. אם התלמיד יזין את השם הנכון, ציינו את כל הסימונים בצד השני, אחרת.

הסבר על תכונת מתן הציונים ב-API של תוספי Classroom

התוסף יכול להגדיר גם את מונה הציונים וגם את מכנה הציונים לצירוף. הם מוגדרים בהתאמה באמצעות הערכים pointsEarned ו-maxPoints ב-API. כרטיס מצורף בממשק המשתמש של Classroom מציג את הערך maxPoints לאחר שהגדרתם.

דוגמה למספר קבצים מצורפים עם maxPoints במטלה אחת

איור 1. ממשק המשתמש ליצירת מטלות עם שלושה כרטיסים מצורפים לתוסף שבהם השדה maxPoints מוגדר.

באמצעות ה-API של התוספים ל-Classroom אפשר לקבוע את ההגדרות של הציונים בקבצים מצורפים ולקבוע את הציון שמתקבל. הציונים האלה לא זהים לציוני המטלה. עם זאת, ההגדרות של הציון למטלה תואמות להגדרות של הציון בקובץ המצורף, עם התווית סנכרון ציונים בכרטיס המצורף. כשהקובץ המצורף 'סנכרון ציונים' מגדיר את pointsEarned להגשה של תלמיד או תלמידה, זה גם מגדיר את טיוטת הציון של התלמיד/ה במטלה.

בדרך כלל, הקובץ המצורף הראשון שצורף למטלה שמגדירה את maxPoints מקבל את התווית 'סנכרון ציונים'. אתם יכולים לראות דוגמה לשימוש בתווית 'סנכרון ציונים' כדי לראות את ממשק המשתמש ליצירת מטלות באיור 1. שימו לב שבכרטיס 'קובץ מצורף 1' מופיעה התווית 'סנכרון ציונים', והציון של המטלה בתיבה האדומה עודכן ל-50 נקודות. שימו לב גם שלמרות שבאיור 1 מוצגים שלושה כרטיסים מצורפים, רק לכרטיס אחד מופיעה התווית 'סנכרון ציונים'. זו מגבלה משמעותית בהטמעה הנוכחית: אפשר לצרף רק קובץ אחד עם התווית 'סנכרון ציונים'.

אם יש כמה קבצים מצורפים שהגדירו את maxPoints, הסרת הקובץ המצורף באמצעות 'סנכרון ציונים' לא מפעילה את האפשרות 'סנכרון ציונים' באף אחד מהקבצים המצורפים. כשמוסיפים קובץ מצורף שמגדיר את maxPoints, אפשר לסנכרן את הציונים בקובץ המצורף החדש, והציון המקסימלי למטלה ישתנה בהתאם. אין מנגנון שבאמצעותו אפשר לראות באופן פרוגרמטי לאיזה קובץ מצורף את התווית 'סנכרון ציונים', וגם לא לראות כמה קבצים מצורפים למטלה מסוימת.

הגדרת הציון המקסימלי של קובץ מצורף

בקטע הזה נסביר איך מגדירים את המכנה לציון קובץ מצורף. כלומר, הציון המקסימלי האפשרי שכל התלמידים יכולים לקבל בהגשות. כדי לעשות את זה, צריך להגדיר את ערך maxPoints של הקובץ המצורף.

כדי להפעיל את התכונות למתן ציונים, צריך לבצע רק שינוי קל בהטמעה הקיימת. כשיוצרים קובץ מצורף, צריך להוסיף את הערך maxPoints באותו אובייקט AddOnAttachment שמכיל את השדות studentWorkReviewUri, teacherViewUri ושדות נוספים של קבצים מצורפים.

שימו לב שהציון המקסימלי כברירת מחדל במטלה חדשה הוא 100. מומלץ להגדיר בשדה maxPoints ערך שונה מ-100 כדי לוודא שהציונים מוגדרים נכון. הגדרה של maxPoints ל-50 בתור הדגמה:

Python

כשיוצרים את האובייקט attachment צריך להוסיף את השדה maxPoints, רק לפני ששולחים בקשת CREATE לנקודת הקצה courses.courseWork.addOnAttachments. אפשר למצוא את המידע הזה בקובץ webapp/attachment_routes.py, אם עוקבים אחר הדוגמה שצוינה.

attachment = {
    # Specifies the route for a teacher user.
    "teacherViewUri": {
        "uri":
            flask.url_for(
                "load_activity_attachment",
                _scheme='https',
                _external=True),
    },
    # Specifies the route for a student user.
    "studentViewUri": {
        "uri":
            flask.url_for(
                "load_activity_attachment",
                _scheme='https',
                _external=True)
    },
    # Specifies the route for a teacher user when the attachment is
    # loaded in the Classroom grading view.
    "studentWorkReviewUri": {
        "uri":
            flask.url_for(
                "view_submission", _scheme='https', _external=True)
    },
    # Sets the maximum points that a student can earn for this activity.
    # This is the denominator in a fractional representation of a grade.
    "maxPoints": 50,
    # The title of the attachment.
    "title": f"Attachment {attachment_count}",
}

לצורך ההדגמה, שומרים גם את הערך maxPoints במסד הנתונים המקומי של הקבצים המצורפים, וכך חוסכים את הצורך לבצע קריאה נוספת ל-API מאוחר יותר כשבודקים מטלות שהתלמידים מגישים. עם זאת, חשוב לזכור שמורים יכולים לשנות את ההגדרות של הציונים במטלה, בנפרד מההגדרות של התוסף. שולחים בקשת GET ל-נקודת הקצה courses.courseWork כדי לראות את הערך maxPoints ברמת ההקצאה. כשעושים זאת, מעבירים את itemId בשדה CourseWork.id.

עכשיו צריך לעדכן את מודל מסד הנתונים כך שיכלול גם את הערך maxPoints של הקובץ המצורף. מומלץ להשתמש בערך maxPoints מהתשובה CREATE:

Python

קודם כול צריך להוסיף את השדה max_points לטבלה Attachment. אפשר למצוא את המידע הזה בקובץ webapp/models.py אם עוקבים אחר הדוגמה שצוינה.

# Database model to represent an attachment.
class Attachment(db.Model):
    # The attachmentId is the unique identifier for the attachment.
    attachment_id = db.Column(db.String(120), primary_key=True)

    # The image filename to store.
    image_filename = db.Column(db.String(120))

    # The image caption to store.
    image_caption = db.Column(db.String(120))

    # The maximum number of points for this activity.
    max_points = db.Column(db.Integer)

חזרה לבקשת CREATE courses.courseWork.addOnAttachments. אחסון הערך של maxPoints שהוחזר בתשובה.

new_attachment = Attachment(
    # The new attachment's unique ID, returned in the CREATE response.
    attachment_id=resp.get("id"),
    image_filename=key,
    image_caption=value,
    # Store the maxPoints value returned in the response.
    max_points=int(resp.get("maxPoints")))
db.session.add(new_attachment)
db.session.commit()

לקובץ המצורף יש עכשיו ציון מקסימלי. עכשיו תוכלו לבדוק את ההתנהגות הזו, להוסיף קובץ מצורף למטלה חדשה, ולבחון שבכרטיס הקובץ המצורף מופיעה התווית 'סנכרון ציונים' ושערך הנקודות של המטלה משתנה.

הגדרת ציון של תלמיד או תלמידה שהוגשו ב-Classroom

בקטע הזה נסביר איך מגדירים את המונה לציון קובץ מצורף. כלומר, הציון של כל תלמיד ותלמידה שמשתתפים בקובץ המצורף. כדי לעשות זאת, צריך להגדיר את הערך pointsEarned של המטלה שהוגשה.

עכשיו חשוב לקבל החלטה חשובה: איך התוסף אמור לשלוח בקשה להגדרת pointsEarned?

הבעיה היא להגדרה של pointsEarned נדרש היקף ההרשאות של teacher OAuth. אסור לתת את ההיקף של teacher למשתמשים של התלמידים. זה עלול לגרום להתנהגות לא צפויה כשתלמידים מקיימים אינטראקציה עם התוסף, כמו טעינת ה-iframe של תצוגת המורים במקום ה-iframe של 'תצוגת התלמידים'. לכן יש לכם שתי אפשרויות להגדרת pointsEarned:

  • שימוש בפרטי הכניסה של המורה שמחובר/ת לחשבון.
  • שימוש בפרטי כניסה שמורים של מורה (אופליין).

בקטעים הבאים מתוארות היתרונות של כל גישה, לפני שמדגימים כל הטמעה. שימו לב: הדוגמאות הבאות ממחישות את שתי הגישות להעברת ציון ב-Classroom. בהמשך מפורטות הוראות ספציפיות לשפה, כדי להבין איך לבחור גישה בזמן הצגת הדוגמאות:

Python

מוצאים את ההצהרה SET_GRADE_WITH_LOGGED_IN_USER_CREDENTIALS בחלק העליון של קובץ webapp/attachment_routes.py. צריך להגדיר את הערך הזה ל-True כדי להחזיר ציונים באמצעות פרטי הכניסה של המורה המחובר/ת. הגדירו את הערך הזה ל-False כדי להחזיר את הציונים באמצעות פרטי כניסה שמורים כשהתלמידים מגישים את הפעילות.

הגדרת ציונים באמצעות פרטי הכניסה של המורה המחובר/ת לחשבון

כדי לשלוח את הבקשה להגדרת pointsEarned, צריך להשתמש בפרטי הכניסה של המשתמש המחובר. זה אמור להיראות די אינטואיטיבי כי הוא משקף את שאר ההטמעה עד עכשיו, ודורש מעט מאמץ כדי להבין אותו.

עם זאת, חשוב לזכור שלמורה יש אינטראקציה רק עם ההגשה של התלמיד/ה ב-iframe של הסקירה של העבודה של התלמיד/ה. יש לכך כמה השלכות חשובות:

  • לא יאוכלסו ציונים ב-Classroom עד שהמורה יבצע פעולה בממשק המשתמש של Classroom.
  • ייתכן שהמורה יצטרך לפתוח כל תלמיד הגשה כדי למלא את כל ציוני התלמידים.
  • יש עיכוב קצר בין קבלת הציון ב-Classroom לבין האופן שבו הוא מופיע בממשק המשתמש של Classroom. ההשהיה היא בדרך כלל חמש עד עשר שניות, אבל יכולה להיות גם 30 שניות.

שילוב כל הגורמים האלה יכול לגרום למורים ולמורות להיות צריכים לבצע עבודה ידנית משמעותית וגוזלת זמן כדי לאכלס את מלוא הציונים בכיתה.

כדי ליישם את הגישה הזו, צריך להוסיף עוד קריאה אחת ל-API למסלול הבדיקה של עבודות התלמידים.

אחרי אחזור הקובץ של התלמיד ורשומות הקבצים המצורפים, בודקים את המטלות שהתלמיד או התלמידה הגישו ושומרים את הציון שהתקבל. מגדירים את הציון בשדה pointsEarned של אובייקט AddOnAttachmentStudentSubmission. לבסוף, יוצרים בקשת PATCH לנקודת הקצה courses.courseWork.addOnAttachments.studentSubmissions עם המכונה AddOnAttachmentStudentSubmission בגוף הבקשה. שימו לב שאנחנו צריכים לציין גם את pointsEarned ב-updateMask בבקשת PATCH:

Python

# Look up the student's submission in our database.
student_submission = Submission.query.get(flask.session["submissionId"])

# Look up the attachment in the database.
attachment = Attachment.query.get(student_submission.attachment_id)

grade = 0

# See if the student response matches the stored name.
if student_submission.student_response.lower(
) == attachment.image_caption.lower():
    grade = attachment.max_points

# Create an instance of the Classroom service.
classroom_service = ch._credential_handler.get_classroom_service()

# Build an AddOnAttachmentStudentSubmission instance.
add_on_attachment_student_submission = {
    # Specifies the student's score for this attachment.
    "pointsEarned": grade,
}

# Issue a PATCH request to set the grade numerator for this attachment.
patch_grade_response = classroom_service.courses().courseWork(
).addOnAttachments().studentSubmissions().patch(
    courseId=flask.session["courseId"],
    itemId=flask.session["itemId"],
    attachmentId=flask.session["attachmentId"],
    submissionId=flask.session["submissionId"],
    # updateMask is a list of fields being modified.
    updateMask="pointsEarned",
    body=add_on_attachment_student_submission).execute()

הגדרת ציונים באמצעות פרטי כניסה של מורים אופליין

בשיטה השנייה להגדרת ציונים, צריך להשתמש בפרטי כניסה שמורים למורה שיצר את הקובץ. כדי להטמיע את השיטה הזו צריך ליצור פרטי כניסה באמצעות אסימוני רענון וגישה של מורה שאושר בעבר, ואז להשתמש בפרטי הכניסה האלה כדי להגדיר את pointsEarned.

אחד היתרונות החשובים של הגישה הזו הוא שהציונים מאוכלסים בלי שתצטרכו פעולה של המורה בממשק המשתמש של Classroom, וכך הם נמנעים מהבעיות שצוינו למעלה. כתוצאה מכך, משתמשי הקצה מרגישים שחוויית מתן הציונים היא חלקה ויעילה. בנוסף, כך תוכלו לבחור את הרגע שבו התלמידים יסיימו את הפעילות או באופן אסינכרוני.

כדי ליישם את הגישה הזו, צריך לבצע את המשימות הבאות:

  1. שינוי רשומות מסד הנתונים של המשתמש כדי לאחסן אסימון גישה.
  2. שנה רשומות מסד נתונים של קבצים מצורפים כדי לאחסן מזהה מורה.
  3. מאחזרים את פרטי הכניסה של המורה, ויוצרים (אופציונלי) מופע חדש של שירות Classroom.
  4. הגדרת ציון של הגשה.

לצורך ההדגמה הזו, צריך לתת את הציון כשהתלמידים מסיימים את הפעילות. כלומר, כשהתלמידים מגישים את הטופס במסלול 'תצוגת תלמידים'.

שינוי רשומות מסד הנתונים של המשתמש כדי לאחסן אסימון גישה

שני אסימונים ייחודיים נדרשים על מנת לבצע קריאות ל-API: אסימון הרענון ואסימון הגישה. אם עקבתם אחרי הסדרה המפורטת עד עכשיו, סכימת הטבלה User אמורה לאחסן כבר אסימון רענון. האחסון של אסימון הרענון מספיק כאשר מבצעים קריאות ל-API רק מהמשתמש המחובר, מכיוון שאתם מקבלים אסימון גישה כחלק מתהליך האימות.

עם זאת, עכשיו צריך לבצע שיחות בתור מישהו שאינו המשתמש המחובר, כלומר תהליך האימות לא זמין. לכן צריך לאחסן את אסימון הגישה לצד אסימון הרענון. מעדכנים את סכימת הטבלה User כך שתכלול אסימון גישה:

Python

בדוגמה שסופקה שלנו, זהו הקובץ webapp/models.py.

# Database model to represent a user.
class User(db.Model):
    # The user's identifying information:
    id = db.Column(db.String(120), primary_key=True)
    display_name = db.Column(db.String(80))
    email = db.Column(db.String(120), unique=True)
    portrait_url = db.Column(db.Text())

    # The user's refresh token, which will be used to obtain an access token.
    # Note that refresh tokens will become invalid if:
    # - The refresh token has not been used for six months.
    # - The user revokes your app's access permissions.
    # - The user changes passwords.
    # - The user belongs to a Google Cloud organization
    #   that has session control policies in effect.
    refresh_token = db.Column(db.Text())

    # An access token for this user.
    access_token = db.Column(db.Text())

לאחר מכן, מעדכנים כל קוד שיוצר או מעדכן רשומת User כדי לאחסן גם את אסימון הגישה:

Python

בדוגמה שסופקה שלנו, זהו הקובץ webapp/credential_handler.py.

def save_credentials_to_storage(self, credentials):
    # Issue a request for the user's profile details.
    user_info_service = googleapiclient.discovery.build(
        serviceName="oauth2", version="v2", credentials=credentials)
    user_info = user_info_service.userinfo().get().execute()
    flask.session["username"] = user_info.get("name")
    flask.session["login_hint"] = user_info.get("id")

    # See if we have any stored credentials for this user. If they have used
    # the add-on before, we should have received login_hint in the query
    # parameters.
    existing_user = self.get_credentials_from_storage(user_info.get("id"))

    # If we do have stored credentials, update the database.
    if existing_user:
        if user_info:
            existing_user.id = user_info.get("id")
            existing_user.display_name = user_info.get("name")
            existing_user.email = user_info.get("email")
            existing_user.portrait_url = user_info.get("picture")

        if credentials and credentials.refresh_token is not None:
            existing_user.refresh_token = credentials.refresh_token
            # Update the access token.
            existing_user.access_token = credentials.token

    # If not, this must be a new user, so add a new entry to the database.
    else:
        new_user = User(
            id=user_info.get("id"),
            display_name=user_info.get("name"),
            email=user_info.get("email"),
            portrait_url=user_info.get("picture"),
            refresh_token=credentials.refresh_token,
            # Store the access token as well.
            access_token=credentials.token)

        db.session.add(new_user)

    db.session.commit()

שנה רשומות מסד נתונים של קבצים מצורפים כדי לאחסן מזהה מורה

כדי להגדיר ציון לפעילות, יש לבצע שיחה ולהגדיר את pointsEarned כמורה בקורס. יש כמה דרכים לעשות זאת:

  • אחסון מיפוי מקומי של פרטי הכניסה של מורים למזהי קורס. עם זאת, שימו לב שלא תמיד אותו מורה ישויך לקורס מסוים.
  • שולחים בקשות GET ל-נקודת הקצה courses של Classroom API כדי לקבל את המורים הנוכחיים. לאחר מכן, שולחים שאילתה לרשומות משתמשים מקומיות כדי לאתר פרטי כניסה תואמים של מורה.
  • כשיוצרים קובץ מצורף של תוסף, צריך לאחסן את מזהה המורה במסד הנתונים המקומי של הקבצים המצורפים. לאחר מכן, מאחזרים את פרטי הכניסה של המורה מה-attachmentId שהועבר ל-iframe של תצוגת תלמידים.

הדוגמה הזו ממחישה את האפשרות האחרונה, כי אתם מגדירים ציונים כשהתלמידים משלימים קובץ מצורף של פעילות.

מוסיפים את השדה 'מזהה מורה' לטבלה Attachment של מסד הנתונים:

Python

בדוגמה שסופקה שלנו, זהו הקובץ webapp/models.py.

# Database model to represent an attachment.
class Attachment(db.Model):
    # The attachmentId is the unique identifier for the attachment.
    attachment_id = db.Column(db.String(120), primary_key=True)

    # The image filename to store.
    image_filename = db.Column(db.String(120))

    # The image caption to store.
    image_caption = db.Column(db.String(120))

    # The maximum number of points for this activity.
    max_points = db.Column(db.Integer)

    # The ID of the teacher that created the attachment.
    teacher_id = db.Column(db.String(120))

לאחר מכן, מעדכנים כל קוד שיוצר או מעדכן רשומת Attachment כדי לאחסן גם את המזהה של היוצר:

Python

בדוגמה שנתתם, מדובר ב-method create_attachments בקובץ webapp/attachment_routes.py.

# Store the attachment by id.
new_attachment = Attachment(
    # The new attachment's unique ID, returned in the CREATE response.
    attachment_id=resp.get("id"),
    image_filename=key,
    image_caption=value,
    max_points=int(resp.get("maxPoints")),
    teacher_id=flask.session["login_hint"])
db.session.add(new_attachment)
db.session.commit()

אחזור פרטי הכניסה של המורה

מוצאים את המסלול שמשמש ל-iframe של תצוגת תלמידים. מיד אחרי ששומרים את התשובה של התלמיד במסד הנתונים המקומי, מאחזרים את פרטי הכניסה של המורה באחסון המקומי. זה צריך להיות פשוט, בהתחשב בשני השלבים הקודמים. אפשר להשתמש בהם גם כדי ליצור מופע חדש של שירות Classroom עבור המשתמש המורה:

Python

בדוגמה שנתתם, מדובר בשיטה load_activity_attachment בקובץ webapp/attachment_routes.py.

# Create an instance of the Classroom service using the tokens for the
# teacher that created the attachment.

# We're assuming that there are already credentials in the session, which
# should be true given that we are adding this within the Student View
# route; we must have had valid credentials for the student to reach this
# point. The student credentials will be valid to construct a Classroom
# service for another user except for the tokens.
if not flask.session.get("credentials"):
    raise ValueError(
        "No credentials found in session for the requested user.")

# Make a copy of the student credentials so we don't modify the original.
teacher_credentials_dict = deepcopy(flask.session.get("credentials"))

# Retrieve the requested user's stored record.
teacher_record = User.query.get(attachment.teacher_id)

# Apply the user's tokens to the copied credentials.
teacher_credentials_dict["refresh_token"] = teacher_record.refresh_token
teacher_credentials_dict["token"] = teacher_record.access_token

# Construct a temporary credentials object.
teacher_credentials = google.oauth2.credentials.Credentials(
    **teacher_credentials_dict)

# Refresh the credentials if necessary; we don't know when this teacher last
# made a call.
if teacher_credentials.expired:
    teacher_credentials.refresh(Request())

# Request the Classroom service for the specified user.
teacher_classroom_service = googleapiclient.discovery.build(
    serviceName=CLASSROOM_API_SERVICE_NAME,
    version=CLASSROOM_API_VERSION,
    discoveryServiceUrl=f"https://classroom.googleapis.com/$discovery/rest?labels=ADD_ONS_ALPHA&key={GOOGLE_API_KEY}",
    credentials=teacher_credentials)

הגדרת ציון של הגשה

התהליך שכאן זהה לתהליך של שימוש בפרטי הכניסה של המורה המחובר/ת. עם זאת, שימו לב שצריך לבצע את השיחה באמצעות פרטי הכניסה למורה שאוחזרו בשלב הקודם:

Python

# Issue a PATCH request as the teacher to set the grade numerator for this
# attachment.
patch_grade_response = teacher_classroom_service.courses().courseWork(
).addOnAttachments().studentSubmissions().patch(
    courseId=flask.session["courseId"],
    itemId=flask.session["itemId"],
    attachmentId=flask.session["attachmentId"],
    submissionId=flask.session["submissionId"],
    # updateMask is a list of fields being modified.
    updateMask="pointsEarned",
    body=add_on_attachment_student_submission).execute()

בדיקת התוסף

כמו בהדרכה המפורטת הקודמת, כדאי ליצור מטלה עם קובץ מצורף של סוג הפעילות כמורים, לשלוח תשובה כתלמיד/ה ולפתוח את המטלה ב-iframe של הביקורת על עבודות של תלמידים. הציון אמור להופיע בזמנים שונים, בהתאם לגישת ההטמעה שלכם:

  • אם בחרתם להחזיר ציון כשהתלמידים השלימו את הפעילות, טיוטת הציון שלהם כבר אמורה להופיע בממשק המשתמש לפני שתפתחו את ה-iframe של בדיקת העבודה. אפשר לראות אותו גם ברשימת התלמידים כשפותחים את המטלה ובתיבה 'ציון' ליד ה-iframe של 'סקירת עבודות של תלמידים'.
  • אם בחרתם להעביר ציון כשהמורה פותח את ה-iframe של בדיקת העבודות של התלמידים, הציון אמור להופיע בתיבה 'ציון' זמן קצר אחרי טעינת ה-iframe. כפי שציינו למעלה, התהליך עשוי להימשך עד 30 שניות. לאחר מכן, הציון של התלמיד הספציפי אמור להופיע גם בתצוגות האחרות של גיליון הציונים ב-Classroom.

מוודאים שהציון הנכון מוצג לתלמיד.

כל הכבוד! אתם מוכנים להמשיך לשלב הבא: יצירת קבצים מצורפים מחוץ ל-Google Classroom.