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

זהו המדריך השישי בסדרת המדריכים בנושא תוספים ל-Classroom.

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

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

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

במהלך ההסבר המפורט הזה תבצעו את הפעולות הבאות:

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

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

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

הסבר על תכונת הציון ב-Classroom Add-ons API

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

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

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

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

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

אם יש כמה קבצים מצורפים שהוגדר להם 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 בהמשך, כשבודקים את העבודות של התלמידים. עם זאת, חשוב לזכור שאולי המורים ישנו את הגדרות הציון של המטלה בלי קשר לתוסף שלכם. כדי לראות את הערך maxPoints ברמת ההקצאה, שולחים בקשת GET לנקודת הקצה courses.courseWork. כשעושים את זה, מעבירים את 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 דורשת את היקף ההרשאות 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 בקשות ל-Classroom API courses endpoint כדי לקבל את המורים הנוכחיים. לאחר מכן, שולחים שאילתה לרשומות של משתמשים מקומיים כדי לאתר פרטי כניסה תואמים של מורים.
  • כשיוצרים קובץ מצורף לתוסף, מאחסנים מזהה מורה במסד הנתונים המקומי של הקבצים המצורפים. לאחר מכן, מאחזרים את פרטי הכניסה של המורה מתוך ה-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

בדוגמה שסיפקנו, זה נמצא בשיטה 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,
    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.