A source plugin for Gatsby that allows reading data from Google Sheets.
Forked from brandonmp/gatsby-source-google-sheets to allow pulling the entire sheet as an objects and using public sheets
Why go through the hassle of setting up a complicated headless CMS when Google Sheets already has user permissions, revision history, and a powerful UI?
This source plugin for Gatsby JS will turn any Google Sheets worksheet into a GraphQL type for build-time consumption.
✨ Demo
yarn add gatsby-source-google-spreadsheets
- Go to the Google Developers Console
- Select your project or create a new one (and then select it)
- Enable the Sheets API for your project
- In the sidebar on the left, select APIs & Services > Library
- Search for "sheets"
- Click on "Google Sheets API"
- click the blue "Enable" button
Next you need to decide if you wish to authenticate with a service account or an API key.
- Create a service account for your project
- In the sidebar on the left, select APIs & Services > Credentials
- Click blue "+ CREATE CREDENITALS" and select "Service account" option
- Enter name, description, click "CREATE"
- You can skip permissions, click "CONTINUE"
- Click "+ CREATE KEY" button
- Select the "JSON" key type option
- Click "Create" button
- your JSON key file is generated and downloaded to your machine (it is the only copy!)
- click "DONE"
- note your service account's email address (also available in the JSON key file)
- Open your google sheet, click "File > Share..." and enter your service account's e-mail address (you can find it in the credentials file).
Or if you wish to use an API Key not only must the Spreadsheet in question be visible to the web, but it must also have been explicitly published.
- Create an API key for your project
- In the sidebar on the left, select Credentials
- Click blue "+ CREATE CREDENITALS" and select "API key" option
- Copy the API key
- OPTIONAL - click "Restrict key" on popup to set up restrictions
- Click "API restrictions" > Restrict Key"
- Check the "Google Sheets API" checkbox
- Click "Save"
- Open your google sheet, Click "File > Publish to the web" and Share entire sheet or specific worksheets.
- Click "File > Share" and click "Get Shareable Link", the link should look
like
https://docs.google.com/spreadsheets/d/$SPREADSHEET_ID/edit?usp=sharing
Standard source plugin installation.
// gatsby-config.js
// ...
{
resolve: 'gatsby-source-google-spreadsheets',
options: {
spreadsheetId: 'get this from the sheet url',
apiKey: 'GOOGLE-API-KEY'
// Or
credentials: require('./path-to-credentials-file.json')
}
},
// OR using environment variables
{
resolve: 'gatsby-source-google-spreadsheets',
options: {
spreadsheetId: process.env.SPREADSHEET_ID,
apiKey: process.env.GOOGLE_API_KEY,
// OR
credentials: {
type: 'service_account',
project_id: process.env.PROJECT_ID,
private_key_id: process.env.PRIVATE_KEY_ID,
private_key: process.env.PRIVATE_KEY.replace(/(\\r)|(\\n)/g, '\n'),
client_email: process.env.CLIENT_EMAIL,
client_id: '',
auth_uri: 'https://accounts.google.com/o/oauth2/auth',
token_uri: 'https://oauth2.googleapis.com/token',
auth_provider_x509_cert_url: 'https://www.googleapis.com/oauth2/v1/certs',
client_x509_cert_url: `https://www.googleapis.com/robot/v1/metadata/x509/${process.env.PROJECT_ID}%40appspot.gserviceaccount.com`,
},
}
},
// ...
The plugin makes the following conversions before feeding Gatsby nodes:
- Numbers are converted to numbers. Sheets formats numbers as comma-delineated strings, so to determine if something is a number, the plugin tests to see if the string (a) is non-empty and (b) is composed only of commas, decimals, and digits:
if (
"value".replace(/[,\.\d]/g, "").length === 0
&& "value" !== ""
) {
...assume value is a number and handle accordingly
}
- "TRUE"/"FALSE" converted to boolean true/false
- empty cells ("" in sheets payload) converted to null
- Column names are converted to camelcase
A few notes:
- Not tested with cells of data type dates.
- Google sheets mangles column names and converts them all to lower case. This plugin will convert them to camelcase, so the best convention here is to name your columns all lowercase with dashes. e.g. instead of "Column Name 1" or "columnName1", prefer "column-name-1"--this last one will be turned into "columnName1" in your GatsbyQL graph.
- If you get the error "No key or keyFile set", make sure you are using a Service Account API key and not a simple API key.
- If you get the error "Cannot read property 'worksheets' of undefined", make sure you have shared your spreadsheet with your service account user.
👤 Cian Butler butlerx@notthe.cloud
- Website: https://cianbutler.ie
- Twitter: @cianbutlerx
- Github: @butlerx
Contributions, issues and feature requests are welcome!
Feel free to check issues page.
Give a ⭐️ if this project helped you!
Copyright © 2020 Cian Butler butlerx@notthe.cloud.
This project is MIT licensed.