Showing results for 
Search instead for 
Did you mean: 
Community Member

Up for a challenge? Grade Distribution Spreadsheet

A feature request was just posted about Course Analytics and adding ​. While the data is right there, in Canvas, there is not a way for the teacher to simply and quickly see things like "this number of students" or "this percentage of students" received an A, B, C, etc.

So I was thinking back to InstructureCon 2015​ and a presentation from  @jblumberg ​ where he showcased and shared his ​. This made me wonder how difficult it would be to create a similar spreadsheet that teachers could easily copy and run to find different variations of grade distribution, and possibly other course analytics that are not offered natively in Canvas.

As a worse case scenario, it would be great to have a simple spreadsheet where a teacher could copy/paste the percentages for all of their students, from the UI and paste into a spreadsheet, and then have the grade distributions auto calculated and conveniently displayed in one of the sheets.

Any takers?

FYI  @nicole_stahl ​ and  @kmeeusen ​

10 Replies

Deactivated user, here is a paraphrased version what I told  @kona ​ when she asked me about this (I saw  @jblumberg ​ presentation, one of the best I encountered at InstructureCon, amazing what he accomplished with a Google Spreadsheet):

Stop focusing so much on grades, it gets in the way of learning.


If someone wants to take on the challenge, I'll share what I've discovered and maybe it can help someone put it together.. I've started doing this, but then got lost in trying to find an API call that returned the grade and wasted a couple of hours looking, just to discover it's the list enrollments one.

  1. Provide the setup. All that's needed should be the institution's base URL and an access token. I thought it best to just generate the distribution for all of the courses (possibly even by section?) rather than making them specify what they wanted.
  2. Fetch a list of courses and filter out any that aren't current
  3. Get the enrollments for those courses - this contains current_score and current_grade (if there's a grading scheme)
  4. Do the counting and display it, maybe even with a percent for those.

I spent most of the night teaching myself javascript and GoogleScripts. Josh's code was awesome, but way too complicated, so I started over and wrote variable substitution and pagination into a single api call to make life easier. I've got step 1 hardcoded for the time being and step 2 is done (and the api call with pagination). Now that I know what to do for step 3, it shouldn't be that hard or take very long. I've written VBA code for Excel to create tables, so it shouldn't be that hard to transfer to Google Spreadsheets. But I need to get up for the morning in less than 2 hours, so I need to quit for tonight.

It does appear that Google Sheets will ask you to authorize accessing external data and possibly another one. Maybe I was putting the code in the wrong spot. That appeared to be a one time thing, though, and probably not too obtrusive for the instructor. I just don't remember Josh mentioning it.

Although, I still stick by my previous comment: grades are overrated and focusing on them gets in the way of learning.

Community Coach
Community Coach

 @James ​

I agree that obsessing on grades is not a good thing for either teachers or students, but grades are a tool and a valuable tool. When your grading system is properly structured to measure student achievement of the stated learning objectives, then grades become a tool for both measuring how well a student is doing and how well a teacher is doing. I don't mean this is the sense of a performance evaluation for faculty - there are just too many variables for this to be a reliable tool for that use despite what many federal, state and local governments like to think. But those grades can be used as a component of a teachers own quality improvement activities. Grades can be indicators of:

  • The validity and reliability of the grading scheme,
  • The accuracy, validity and reliability of the assessment strategies,
  • The appropriateness of the learning objectives or outcomes,
  • The effectiveness of the learning activities and materials, and
  • Much more!

Don't throw out the baby with the bath water! Make better use of the grades to make grading more representative of student achievement of the course objectives, and make your instructional materials and activities more effective.

Adventurer III

I just whipped up your worst case scenario real quick if someone needs this badly. You can export your gradebook from the Grades screen and copy and paste the informational columns and the Final Score column.

Excel File: Grade Distribution.xlsx

Google Sheets: Grade Distribution - Google Sheets

Video on how to use the sheet: Grade Distribution Sheet For Canvas - YouTube

Community Member

I'm trying to take on the challenge Smiley Happy

I used a script that Brian Whitmer created to pull data from Canvas into a Google Sheet using API calls: whitmer/gsheet_canvas_api · GitHub

Once I pull the data in, I can then use formulas to manipulate the data.

The problem that I'm having is pulling in all the grades. I can pull the enrollments (grades) for an individual user (GET /api/v1/users/:user_id/enrollments); but according to the Implementation team at Instructure, there is no GET command to pull the enrollments from all users. I can do it as a report that generates the grade_export_CSV file, and then the script pulls it into the sheet, but that’s a manual multi-step process.

I'd like to find a better way to pull in all the enrollments automatically.

 @trlaputka ​,

Use the List Course Enrollments API​ endpoint.

     GET /api/v1/courses/:course_id/enrollments

You can also use sections or users, but the user one is the most specific and gives just one user.

Inside the object returned from the call is a grades object that contains the information needed.

grades: {

html_url: "https://<canvas_instance>"

current_score: 59.16

final_score: 59.16

current_grade: "F+"

final_grade: "F+"


The 123 in the example is the :course_id specified in the API call. The 456 is the Canvas user_id. I've obscured both for privacy.

The List Course Enrollments lists every student in the course, so I'm not sure what information you're getting from the Implementation Team unless it's a permissions issue (my token gives me admin access).


One of the issues people are running in to here with this challenge is the lack of the ability to get the grading scheme (grading standard). The existing API calls allow you to get grades for students if the instructor has enabled, but then you only get those grades that are actually being used. So, if there are A, A-, B+, C+, and D in a class, you don't get any grades returned for C and the programmer would have to infer from the presence of any +/- whether or not the plus-minus system is used.

That doesn't sound so bad, but let's say you think grades are bad and so you've decided to label your grade M, N, P, Q, R, S, and T to get students to top focusing on the A, B, C, thing. Or perhaps, a more reasonable expectation, is that you're from a school that uses A, B, C, D, E instead of A, B, C, D, F. Shy of having the instructor manually put these into the spreadsheet, there is no way that I can find to get this information out of Canvas.


I was looking at this problem again today and noticed that in the Grading Standards controller  canvas-lms/grading_standards_api_controller.rb​, there is a List grading standards API call. That's not available in the Grading Standards API documentation, though. Looking at the source code, there was a little note that said it was added one day ago with a link to a diff that shows it was created 8 days ago.

So, it is coming, hopefully soon.

One thing I'm not sure about it and can't test since it's not actually in use is there is no indication whether the grading scheme in use a grading scheme for the course or a grading scheme for an account. Hopefully it will return the grading scheme in use no matter what. It would just add another set of complexity to call the API for the course and not get the grading scheme you want and then have to turn around and call it for the account. Maybe I just overthink things.

In the meantime, you may be able to only list those grades that actually have students achieving them. That might be okay, since the others aren't used, but if you have 4 A's, 8 B's and 3 D's, it might be nice to see that there are 0 C's.

Just wanted to pass along that there appears to be a new API call on the horizon that will help with this challenge.

Community Member

Hey Matt! This "worst case" looks great!

I thought it might be nice if you included a quick video screencast of you following the process to use those resources you provided? To help our less tech savvy customers see, step-by-step what to do!

You might also want to chime in on this feature idea " modifiedtitle="true" title="Grade Distribution​ to share these cool tools!

 @James  - you have reasonably presented a level of complexity that I had not considered. I'll be excited to see where you end up, with the new API call 😉

I updated my post with a video. Smiley Happy