TypeScript icon, indicating that this package has built-in type declarations

1.0.16 • Public • Published

Sheets ENV

Sheets ENV is a tool to download ENV files from google sheets.

Devs will authenticate in a web browser using oauth2 CI will authenticate with service accounts stored as CI secrets CI can also utilise the .env files created at build time

Usage instructions:

  • Create credentials here so google can show the user your company name on the oauth consent screen Press create credentials -> Create OAuth client ID -> Application type iOS -> Choose a random bundleID You should get a Client ID like this -****************

  • From the same credentials page also create a service account. Choose a name and click done. This will allow headless environments such as heroku/github actions to fetch the env without launching a browser and doing oauth. To get the serviceAccountJson click the newly created service account and choose keys tab click add new key JSON.

  • Create a spreadsheet and share with people (keep the spreadsheetid from the url)

  • Share the sheet with the service account's email address ****

  • Enable google sheets api so google can bill you if you use the api too much

  • Have an async function that runs before anything else in your program to ensure that .env is present

if (!fs.existsSync('.env')) {
    const clientId = '********-*****'
    const range = 'Sheet1!A1:B'
    const spreadsheetId = '****************'
    const serviceAccount = process.env.GOOGLE_SERVICE_ACCOUNT // for headless environments

    const envObj = await fetchSheetsEnv(range, spreadsheetId, serviceAccount, clientId)
    const envString = jsonToEnv(envObj)
    fs.writeFileSync('.env', envString)


export const jsonToEnv = (envObj) => Object.keys(envObj).map(key => `${key}=${envObj[key]}`).join('\n')
export const tryParse = (json) => {
  try {
    return JSON.parse(json)
  } catch (e) {
    return null
  • JSON.stringify the service account json and put it in heroku env
  • heroku escapes the string so you may want to put the key in heroku as a b64. take the json object with '' around it and b64 it.
export const b64ToAscii = (b64) => {
  // First b64 it with -> const b64 = Buffer.from(str).toString('base64')
  try {
    const ascii = JSON.parse(Buffer.from(b64, 'base64').toString('ascii'))
    return ascii
  } catch (error) {
    return undefined


DownloadsWeekly Downloads






Unpacked Size

12.5 kB

Total Files


Last publish


  • mendeljacks