A simple way to use Google Sheet as your Data Base with own authentication system.
No google workspace project is needed.
pip install 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
from gsheetdb import Sheet
const sheet = Sheet({ 'deploymentId': '123456789abcdef' })sheet.get()Return all items
const data = sheet.get('Sheet1')Ids are generated automaticaly
sheet.set('Sheet1', [
{'col1': 'val1', 'col2': 2, 'col3': datetime.datetime()},
{'col1': 'val2', 'col2': 3, 'col3': datetime.datetime()},
])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.
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.