A simple way to use Google Sheet as your Data Base with own authentication system.
No google workspace project is needed.
npm install @lprett/gsheetdb- Create a google sheet
- Add as many sheets (tables) as you want
- First line is table header, first column must be
id - Table relationship: set a column header with the name of a table, its content is the id (or ids) of the other table
- Go to "Extensions > App Script"
- Copy the content of the file
gsheet.jsto the current file. - Create a new deploy: "Deploy > New deployment"
- Select type: "Web app"
- Description: Anything you wanted
- Execute as: "Me (your_email@gmail.com)"
- Who has access: "Anyone"
- Copy Deployment ID
import Sheet from '@lprett/gsheetdb';
const sheet = new Sheet({ deploymentId: '123456789abcdef' })await sheet.get();Return all items
const data = await sheet.get('Sheet1')Ids are generated automaticaly
await sheet.set('Sheet1', [
{col1: 'val1', col2: 2, col3: new Date()},
{col1: 'val2', col2: 3, col3: new Date()},
])Same API as set but with id. If id doesn't exist, it fails.
sheet.set('Sheet1', [
{id: 1234, col1: 'val2'}
])Remove by item ids
sheet.rm('Sheet1', [1234])sheet.new('MyNewSheetName', ['field1', 'field2', 'field3'])Add the query to get function.
Query can be object or array.
General rules:
=:field: value!=:field: {ne: value}.nestands for "not equal">:field: {gt: value}.gtstands for "greater than"<:field: {lt: value}.ltstands for "lower than">=:field: {ge: value}.gestands for "greater or equals to"<=:field: {le: value}.lestands for "greater or equals to"- AND: curly brace
{A, B, C}read as "A and B and C" - OR: square brace
[A, B, C]read as "A or B or C"
Examples:
sheet.get('Sheet1', {col1: 123})sheet.get('Sheet1', {col1: 123, col2: 456})sheet.get('Sheet1', [{col1: [123, 456]}])
// OR
sheet.get('Sheet1', [{col1: 123}, {col1: 456}])sheet.get('Sheet1', {col1: {gt: 123}})sheet.get('Sheet1', {col1: {lt: 123}})sheet.get('Sheet1', {col1: {ge: 123}})sheet.get('Sheet1', {col1: {ge: 123}})sheet.get('Sheet1', {col1: {gt: 123, le: 456}})sheet.get('Sheet1', {col1: [{gt: 1, le: 3}, {ge: 14, lt: 16}]})sheet.get('Sheet1', {col1: [30, {gt: 1, le: 3}, {ge: 14, lt: 16}]})Create a table _user with the following columns:
-
id to identify each user.
-
token or username and password depending on how you want to do the login.
-
permission should contain either
admin,userorblocked(default).admincan read (r), write (w) and delete (x) access to all tables.usercan only read recursively tables that reference its user'sid.blockedcan not do rwx.
-
read allow or disable read to tables, give their names splited by ",".
-
write allow or disable write to tables, give their names splited by ",".
-
delete allow or disable delete to tables, give their names splited by ",".
You can change the name of Auth table here.
await sheet.me()Example
Table: _user
| id | token | permission | read | write | delete |
|---|---|---|---|---|---|
| 1 | user01 | admin | Table3 | ||
| 2 | user02 | user | |||
| 3 | user03 | block | Table3 |
Table: Table1
| id | _user | col1 | Table2 |
|---|---|---|---|
| 10 | 2 | 123 | 456 |
| 11 | 4 | 321 | 789 |
Table: Table2
| id | my_data |
|---|---|
| 456 | 123 |
Table: Table3
| id | temperature |
|---|---|
| 14 | 43.4 |
user01 can read, write and delete items from all tables except delete Table3.
user02 can not get Table2 directly, instead he can ask Table1, because it has a reference to him (by its user's id). By asking Table1 he will only get the entries where column _user contains its user's id. In this example he will get the entry id == 10. This entry has the column Table2 which references to a valid entry on Table2, so he will get this entry as well. Note that he has no access to Table3.
user03 is blocked by default he can only read Table3.