Back to blog
· 5 min read·tutorialgoogle-classroomgradebook

How to bulk import grades from Google Sheets to Google Classroom

Google Classroom doesn't natively support bulk grade imports from Sheets. Here's the workflow that does — in under sixty seconds per class.

Short answer: Google Classroom has no native bulk-import for grades. You either enter them one at a time in the gradebook UI, or you use a third-party tool that talks to the Classroom API on your behalf. This post shows how to do the second option in under sixty seconds per class, using Sheet2Classroom.

Why Classroom doesn't have a bulk import button

Google Classroom does offer a CSV export of the gradebook, which feels like a hint that CSV import must exist too. It doesn't. The closest thing is the "Import grades" flow inside a quiz-style assignment, which only works when the assignment was originally built as a Google Form and the sheet has the exact column shape the form produced. For a normal gradebook-in-Sheets workflow, that path is useless.

The actual interface Google provides for bulk writes is the Classroom API's studentSubmissions.patch endpoint — one HTTP call per grade, per student. Writing 40 grades for a class means 40 authenticated requests, each one matching a student ID to a grade value. No teacher should be writing that code by hand. And no teacher should have to.

The 4-step workflow

Sheet2Classroom wraps those API calls behind a short wizard. Every step is a single screen.

Step 1: Sign in and pick a course

Sign in with the Google account you teach from. The app reads the list of courses where you're listed as a teacher — active, provisioned, or archived — and shows them in one grid. Click the one you want. Under the hood, this uses the classroom.courses.readonly scope; no write permissions at this step.

Step 2: Paste the Google Sheet URL

Open the sheet with your grades in any browser tab. Copy the URL from the address bar (the full one, with /d/<sheet-id>/edit). Paste it into the field. No export, no download, no CSV conversion. Sheet2Classroom reads the sheet directly via the Sheets API, with the read-only scope spreadsheets.readonly.

If you have multiple tabs in the sheet, the next screen lets you pick which one. Most teachers have one tab per assignment or one tab per semester — both work.

Step 3: Map your columns

The mapper shows the header row of the sheet and asks: which column holds the grade, and which one identifies the student? Pick a grade column (required) and at least one identifier column (email, roll number, or student name). Most teachers pick email + grade, which is enough. Column names are auto-guessed — if your sheet has a column called Email or Roll No, we select it for you. You can override with one click.

The mapper also picks a starting row. Row 1 is usually the header; row 2 is where data begins. If you have merged cells, hidden rows, or a data block that starts lower down, change it here.

Step 4: Preview and push

This is where the safety lives. Before any API call writes to Classroom, Sheet2Classroom reads the sheet + the class roster in parallel and computes a per-row match table: which row in the sheet maps to which student, matched by what identifier, with what grade. You see four counters at the top — will push, unmatched, invalid grade, and absent students — plus a grade distribution histogram that makes decimal-point slips (a sheet value of 1000 instead of 100) jump out visually.

Name the assignment, set the max points, decide whether to publish to students now or push as drafts (default: drafts), and click Push N grades to Classroom. The tool creates a new coursework entry and writes every grade in parallel, eight at a time. For a 50-student class, the whole push completes in about nine seconds.

Gotchas worth calling out

  1. Personal @gmail.com students — Google hides their email from the Classroom API. If you match by email alone, those rows look unmatched. Map a name column as fallback, or use a roll number that matches the email prefix.
  2. Duplicate names — two students with the same name land in an ambiguous-name bucket. The preview shows a dropdown so you pick which one.
  3. Grades above max — Sheet2Classroom flags them but pushes them anyway. This is intentional: extra credit is a thing.
  4. Pushing to an assignment that already exists — if the title matches an existing coursework, we detect it and offer two options: create a new assignment with a different name, or update the existing one (which takes a full backup first, restorable for 30 days).

Three workflows this covers

Midterm or final. One assignment, one push. Takes about a minute including the safety review.

Weekly quizzes. Same sheet, same mapping, every Monday. We remember your column mapping per sheet + tab, so re-opening the wizard next week pre-fills everything. The new feature update-existing-assignmentlets you push updated grades into last week's quiz assignment too, if you're using rolling rubric work.

End-of-semester grade consolidation. Point the wizard at your master gradebook, map the final grade column, push. If the class trusts the sheet, this is the fastest way to close out grades without touching the Classroom UI.

Pricing and privacy

Free. No feature gates. No credit card. The only account we need from you is Google (for OAuth). We don't store grades or spreadsheet contents — only an encrypted session cookie with your OAuth token, last-100 push summaries, and 30-day grade backups for restore. Full details in the Privacy Policy.

Try it

Sheet2Classroom is free and live. We're in Google OAuth verification window right now, which caps us at 100 testers — drop your email on the home page and we'll add you within 24 hours.

Read next