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

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

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

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

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

במהלך ההדרכה המפורטת הזו, תצטרכו:

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

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

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

הסבר על התכונה למתן ציונים ל-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

מוסיפים את השדה maxPoints כשיוצרים את האובייקט attachment, לפני ששולחים בקשת 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)

חזרה לבקשת courses.courseWork.addOnAttachments של CREATE. שמירת הערך של 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 נדרש היקף הרשאות OAuth teacher. אסור להעניק היקף הרשאות של teacher למשתמשים של תלמידים. כתוצאה מכך, עלולה להיות התנהגות בלתי צפויה כשתלמידים מקיימים אינטראקציה עם התוסף. למשל, טעינת ה-iframe של תצוגת המורה במקום ה-iframe של תצוגת התלמידים. לכן, יש שתי אפשרויות להגדרת pointsEarned:

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

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

Python

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

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

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

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

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

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

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

אחרי שאחזרים את העבודות שהוגשו ואת הרשומות של הקבצים המצורפים, צריך לבדוק את ההגשה של התלמיד/ה ולשמור את הציון הסופי. מגדירים את הציון בשדה pointsEarned של אובייקט AddOnAttachmentStudentSubmission. לבסוף, יוצרים בקשת PATCH לנקודת הקצה (endpoint) של 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 בקשות לנקודת הקצה(endpoint) של 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

בדוגמה שלמעלה, הכתובת היא ב-method 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.