SheetSQL - Google Spreadsheet as a Database 使用 Nodejs 实现
SheetSQL - Google Spreadsheet as a Database 使用 Nodejs 实现
之前经常需要和运营同事打交道,将她们 Google Spreadsheet 上维护的内容映射到数据库里,如果数据变动比较频繁,这种需求又要单独做成一个运营后台,非常麻烦。与此同时,她们也会需要看到一些 sheets 上数据在生产上的反馈,比如每条内容的点击量。
但如果 Spreadsheet 自身就是一个可以增删改查的数据库,运营可以编辑她自己的内容,程序也可以反过来写入一些反馈数据到 sheets 中的其他列中去。这样完全不需要什么运营后台,对开发和运营都是个好事。所以写了这个 SheetSQL 的库,在很多数据量不大,实时性要求不那么高的场景非常适合。
Example
const db = new Database({
db: '1ya2Tl2ev9M80xYwspv7FJaoWq0oVOMBk3VF0f0MXv2s',
table: 'Sheet1', // optional, default = Sheet1
keyFile: './google-serviceaccount.json',
cacheTimeoutMs: 5000, // optional, default = 5000
})
// load schema and data from google spreadsheet
await db.load()
// insert multiple documents
let docs = await db.insert([
{
name: ‘joway’,
age: 18,
},
])
// find documents and update them
docs = await db.update(
{
name: ‘joway’,
},
{
age: 100,
},
)
// find documents
docs = await db.find({
name: ‘joway’,
})
// find all documents
docs = await db.find({})
// find documents and remove them
docs = await db.remove({
name: ‘joway’,
})
ShitSQL?
当然,下面是一个简单的示例,展示如何使用 Node.js 和 Google Sheets API 将 Google Spreadsheet 用作数据库。这个示例假定你已经安装了 googleapis
包,并且已经设置了 Google Cloud 项目和 OAuth 2.0 凭证。
首先,安装 googleapis
包:
npm install googleapis
然后,你可以使用以下代码来读取和写入 Google Sheets:
const { google } = require('googleapis');
const sheets = google.sheets('v4');
// 认证部分,使用 OAuth2 客户端
const auth = new google.auth.OAuth2(
YOUR_CLIENT_ID,
YOUR_CLIENT_SECRET,
YOUR_REDIRECT_URI
);
auth.setCredentials({
access_token: YOUR_ACCESS_TOKEN,
refresh_token: YOUR_REFRESH_TOKEN,
scope: 'https://www.googleapis.com/auth/spreadsheets',
token_type: 'Bearer',
expiry_date: YOUR_EXPIRY_DATE,
});
// 读取数据
sheets.spreadsheets.values.get({
spreadsheetId: 'YOUR_SPREADSHEET_ID',
range: 'Sheet1!A1:Z',
auth: auth,
}, (err, res) => {
if (err) throw err;
console.log(res.data.values);
});
// 写入数据
const resource = {
values: [['New', 'Data', 'Here']],
};
sheets.spreadsheets.values.update({
spreadsheetId: 'YOUR_SPREADSHEET_ID',
range: 'Sheet1!A1:C1',
valueInputOption: 'RAW',
resource: resource,
auth: auth,
}, (err, res) => {
if (err) throw err;
console.log('Data written');
});
请确保替换 YOUR_CLIENT_ID
、YOUR_CLIENT_SECRET
、YOUR_REDIRECT_URI
、YOUR_ACCESS_TOKEN
、YOUR_REFRESH_TOKEN
、YOUR_EXPIRY_DATE
和 YOUR_SPREADSHEET_ID
为实际的值。