-
Notifications
You must be signed in to change notification settings - Fork 1
GETTING STARTED
The steps to implementing the extensions tool for your course largely consists of three parts:
- Configuring Slack - Creating a Slack webhook and receiving any notifications regarding new extensions
- Configuring Google Forms/Sheets - Creating copies of the provided Google Form and Sheets templates, and configuring them to receive and process any incoming extensions
- Configuring Gradescope or Pensieve (Optional) - Additional configuration to the Google Sheets allowing extensions to be reflected on the corresponding Gradescope and/or Pensieve assignments
Tip
If you have questions, check out the FAQ or ask in either in the #software-extensions or #software-support slack channel on EECS Crossroads.
It takes ~30 minutes to onboard your class onto this tool, and that time pays off as soon as your first extension requests start rolling in :)
Feel free to follow along the video walkthrough made by Edwin, or the instructions down below!
Estimated Time: 10 minutes
Creating a Slack channel and webhook
You'll need to be a Slack admin in your workspace to follow these steps.
- Create a Slack channel (ours is named
extension-bot). Potentially sensitive student information may be accessible in this channel, so we recommend making the channel private and adding those who are approved to manage/view accommodations and DSP information to the channel. -
Create a Slack webhook, and point it towards your newly created channel. Feel free to skip past all of the reading and follow these steps:
- Click "Create your Slack App".
- Select "From scratch" and enter a name. We named ours "ExtensionBot". Select your workspace.
- Click "Incoming Webhooks" in the sidebar, activate incoming webhooks, scroll down, and create a new web hook.
- Note the URL. We'll need it later.
Estimated Time: 20 minutes
Cloning the Form and Sheet
- Make a copy of this spreadsheet. Make sure to rename appropriately e.g. "DATA 8 FA24 Extensions Backend"
- Delete the “Form Responses” sheet within the spreadsheet.
- If you are unable to delete the "Form Responses", make sure to unlink the Google Form (Tools > Manage Form > Unlink form)
- Share the spreadsheet with [email protected]. This allows our hosted cloud function to read/write to your sheet. (If you're self-hosting, this should be your service account email.)
- Make a copy of this form. Make sure to rename it. Close the form template, so you don't accidentally edit it.
- On the form, in the "Responses" tab, configure the form responses to be written to the Extensions Backend spreadsheet.
- This should create a new tab within the Extensions Backend sheet.
- Rename the tab to “Form Responses”.
-
Set the header of the next empty column of the Form Responses sheet to "Rerun". (This will be column N if you do not add or delete questions from the form.) Then, select all of the rows of that column, and insert a checkbox using "Insert" => "Checkbox".
- Simply clicking on the column to select all rows will not work, be sure to manually select all rows in order to be able to insert the checkboxes.
Configuring Apps Script
On the Spreadsheet, open the Extensions => Apps Script menu option.
-
Rename the script to "DATA 000 FA00 Extension Requests Script".
-
Click on "Triggers" in the sidebar (the little clock icon).
-
Add a onFormSubmit trigger that looks like this:

Configuring Roster
The Spreadsheet/Roster tab can hold your entire roster or be configured "on-demand" (when a student submits an extension request). If a student submits several requests, their roster record will be updated in-place; no new roster record will be created.
If you'd like to add student emails (and optionally DSP status), feel free to. The notes column on this sheet is for your own use.
Configuring Assignments
-
On the Spreadsheet/Assignments tab set up a row for each assignment:
- Enter the assignment name
- Choose a unique assignment ID
- Set a due date in YYYY-MM-DD format
- Set the partner status (either "Yes" or "No")
- (See Part 3 for more information) Add a link to the Gradescope assignment if it has been created and you would like to use Flextensions to automatically input extensions to Gradescope.
-
Ensure the following on the Spreadsheet/Roster tab:
- Each assignment has a single column
- The column headers match the unique assignment ID's in the Spreadsheet/Assignments tab
-
On the Google Form, update the assignment options to match the assignment names in the Spreadsheet/Assignments tab.
Configuring Form Questions
If you'd like to edit any of the Google form question descriptions, feel free to do so. Once you've finalized the Google form, check the Spreadsheet/Form Questions tab to ensure that the question/key pairings are valid. You will likely need to paste this formula =TRANSPOSE('Form Responses'!A1:X1) into cell A2 if you don't see a valid mapping between the questions asked on the Google form and the variable names or see an error message like #REF!. If you need to make edits to this tab, you may rearrange the keys column, but you should ensure all variables are present.
Configuring Environment Variables
Finally, configure Spreadsheet/Environment Variables as desired.
- Set the Course Name in row 2. Please format like "Data 000".
- Rows 3 through 7 pertain to emails. The
EMAIL_FROMfield can be any email, but it should be formatted as "Sender Name [email protected]". - Row 8 is where you should paste your
SLACK_ENDPOINT. - The
SLACK_ENDPOINTwebhook (row 8) pipes all debug logs to your #extension-bot Slack channel. - Rows 9 through 12 should be adjusted according to your preferences for auto approval.
- If you want anyone tagged on Slack when extension requests come in, add their Slack ID(s) to row 13.
- Update row 14 with a link for the spreadsheet you're currently editing.
- The remaining rows are if you'd like to integrate with Gradescope or Pensieve (see the next part).
Protecting Your Sheet from Accidental Edits
Edit-protect everything that's not supposed to change to avoid mysterious errors later in the semester:
-
Data --> Protect sheets and ranges
- Use Add a sheet or range repeatedly
- For each protected thing, click Set Permissions --> Show a warning when editing this range --> Done
- Protect the range Roster!A1:U1
- Protect the sheet Form Questions
- Protect the sheet Assignments
- Protect the sheet Environment Variables
Estimated Time: 5 minutes
If you'd like your approved extensions to be reflected in Gradescope (using the assignment "extensions" feature), you'll need to configure a staff account. We recommend using a SPA so no individual's Gradescope credentials are exposed.
Gradescope Set Up
- Add an alias of your SPA email address as an instructor to the current semester's Gradescope course.
- You will likely need to reset your Gradescope password for that account. Note this down
- Paste the email/password combination in the
GRADESCOPE_EMAILandGRADESCOPE_PASSWORDenvironment variables. Also set cell B15 on Spreadsheet/Environment Variables to "Yes". - Add Gradescope assignment URL's to each assignment under the
gradescopecolumn of the "Assignments" sheet. The link format should be like: https://www.gradescope.com/courses/COURSE_ID/assignments/ASSIGNMENT_ID/extensions. You can find the unique link for each assignment by clicking the "Extensions" tab on the left sidebar when you're viewing an assignment on Gradescope.
Pensieve Set Up
- Get access to the Pensieve API by contacting Pensieve. You should get a support contact when your class is onboarded. API access is tied to courses and you will need to have already logged into Pensieve at least once in order for them to add you to the API allowed list.
- Once you have API access, you can generate an API key. Log in to Pensieve, click your name in the left navigation bar. From there you should click "Generate API Key". Note down the key.
- Enable Pensieve extensions by setting cell B18 on Spreadsheet/Environment Variables to "Yes". Set
PENSIEVE_EMAILandPENSIEVE_API_KEYenvironment variables with the email used to generate the API key obtained in step 2 and the API key itself. - Add Pensieve assignment URL's to each assignment under the
pensievecolumn of the "Assignments" sheet. Both student and teacher links to an assignment URL which contains class_id and assignment_id are good for this.