Back to blog
· 5 min read·csv-importgoogle-classroomteacher-workflow

Why Google Classroom's CSV gradebook import keeps failing

Strict column names, narrow value ranges, silent row skipping — the five ways Classroom's built-in CSV import rejects the gradebook you actually have.

If you've ever tried to bring grades into Google Classroom from a Google Sheet, you've probably hit the same dead end. The "Import grades" button exists, only appears on certain assignment types, and even then rejects more sheets than it accepts. This post walks through the five distinct ways it fails, in the order teachers hit them during a grading session.

1. The import option only exists on specific assignment types

Google Classroom's built-in "Import grades" menu is only available on assignments originally created as Google Forms quizzes. If you created the assignment as a plain coursework item, a document, or anything other than a Form quiz, the menu option is simply missing — there is no UI path at all.

This is the first failure mode. Teachers start with a gradebook in Sheets, create an assignment in Classroom, open the gradebook tab, look for import, and find nothing. At this point most people give up and start manually typing grades. The rest go search for a solution and land on a 2019 Apps Script tutorial, which leads to the next problem.

2. Column names have to match exactly

Even when the import option is available (you created the assignment through a Form quiz), the CSV parser expects the sheet to have specific column headers. The student identifier column must be labeled Email Address — not Email, not Student Email, not E-mail. The grade column must match a very specific pattern tied to the original quiz question's point value.

Teachers who edit their gradebook header row to add a comment, clarify section, or just to their own preferred naming convention find the import fails quietly with no indication of which column was the problem. Fix the header name exactly, try again, see if it works — a loop nobody asked for.

3. Grade values have to be numeric in a narrow range

The CSV import accepts integers in the range 0to the assignment's max points. Decimals are usually tolerated. Anything else silently fails for that row. Specifically:

  • 85/100 — fraction notation teachers use to be explicit about what the grade is out of. Rejected; that row skipped.
  • 85% — percent notation. Rejected.
  • 85 pts or 85 marks — common unit suffix. Rejected.
  • A, B+, A- — letter grades commonly used at primary and university levels. Rejected.
  • Pass, Fail, P, F — pass/fail notations used in some courses. Rejected.
  • Any grade above max points — used for extra credit. Rejected.

4. Silent row skipping

The worst failure mode. When a row has an unrecognized value, the CSV import doesn't stop with an error message. It doesn't list which rows were skipped. It just imports what it can and leaves the rest untouched. So if twelve of your forty students have fractional grades in the sheet, you get twenty-eight correctly imported grades and no indication that twelve are missing.

This is how teachers discover, two weeks later when a student asks why their midterm grade is missing, that the import partially failed. By then the sheet may have been edited, the assignment may be closed, and reconstructing which rows were skipped is its own small project.

5. Personal-Gmail students are unmatchable by email alone

Even when every other thing goes right — correct assignment type, right column names, clean integer values — one category of student is fundamentally invisible to the CSV importer: anyone signed into Classroom with a personal @gmail.com account. Google hides their email address from the Classroom API by default as a privacy feature. So the importer, which matches rows by email, has nothing to match against for those students.

At schools where a portion of students use personal accounts (common for open-enrollment courses, bootcamps, or schools that haven't standardized on Google Workspace), this isn't an edge case — it can be 30% or more of the class, none of whom get their grades imported.

What Sheet2Classroom does differently

Every one of those failure modes has a specific counter-measure in Sheet2Classroom:

  1. Works on anyClassroom assignment type, including ones you just created. We write through the Classroom API's studentSubmissions.patch, not the gradebook CSV import.
  2. Column names are auto-guessed from your header row. Call your columns whatever you want — we detect them by pattern. You can also override with one click.
  3. Grade parser accepts 85, 85.5, 85/100, 85%, 85 pts, and letter-to-number mappings. We scale correctly relative to the assignment's max points. Unparseable cells are flagged in the preview, not silently dropped.
  4. Nothing is silent. Before anything writes, the preview shows you exactly which rows will push, which are unmatched, which have invalid grades, and which roster students have no corresponding sheet row. You see counts and a per-student diff.
  5. Personal-Gmail students get matched by name against the class roster — the Classroom API does expose student names, even when emails are hidden. We use the rosters.readonly scope for exactly this case.

Try it

Sheet2Classroom is free. It talks to the same Classroom API as every other tool but wraps it in a flow designed for teachers, not developers. Pastes a sheet URL, maps columns, previews every match, pushes as drafts. The whole thing takes less than a minute per class.

Read next