使用谷歌表格API建立一个CRUD API

2,349 阅读9分钟

顾名思义,谷歌表格API让你连接现有的电子表格,解析其可用数据,并将其传递给你的网络应用。最新的是4.0版本,它为用户提供了对许多其他属性的控制--比如对单元格格式的完全访问,包括设置颜色、文本样式等等。想象一下,拥有一个完全免费的数据库,其直观的用户界面可以帮助你查看你的数据,并根据你的需要组织数据,同时作为一个CMS。这有多酷啊?

不多说了,让我们直接进入使用Google Sheets API创建你自己的CRUD API。

以下是我们在这篇文章中要介绍的内容。

  1. 在Google Cloud Console中建立一个新项目
  2. 链接谷歌工作表
  3. 设置CRUD API
  4. 提出你的第一个请求
  5. 实现CRUD操作

在Google Cloud Console中设置一个新的项目

与访问任何API服务一样,我们必须首先设置认证和授权。如果你还没有建立账户,请前往谷歌云并注册。然后,按照下面的步骤制作一个新项目。

Setting up a new project in Google Cloud Console

点击新建项目,给它一个合适的名字,然后点击创建

接下来,点击导航菜单,转到API 服务

APIs and Services panel in Google Cloud Console

然后,你将被重定向到API库。搜索Google Sheets API并启用它。

Enable the Google Sheets API

回到API和服务仪表板。转到凭证并创建一个新的凭证。

Credentials panel in APIs and Services tab

点击服务账户。给它起个名字,其余部分按原样设置,然后点击完成

现在你已经为电子表格创建了一个机器人账户,该账户具有对表格进行读写操作的权限。

复制我们创建的服务邮箱。这将在我们将电子表格连接到谷歌云项目时派上用场。

点击服务帐户的电子邮件,然后继续前进到键

Create a new key in Google Cloud Console

继续并创建一个新的键,将文件类型设置为JSON。很快就会下载一个文件,如果可能的话,你应该把它移到你期望设置起始文件的文件夹中。

链接谷歌工作表

现在我们要把我们的电子表格连接到谷歌云项目上。前往Google Docs,制作一个新的电子表格。为电子表格命名。

输入一些假数据,这样我们在测试API的时候就有东西可以取了。

现在,让我们添加服务账户,并给它分配编辑的角色,这使它具有读取、写入、更新和删除数据的权限。

Giving the service email editor privileges in the Google Sheet

点击分享,添加我们最近复制的服务电子邮件,确保你给它编辑权限,并取消勾选通知人们。

这就是你所要做的一切现在让我们到代码编辑器去,为API设置起始文件。

设置CRUD API

我们将在API中使用几个包。Express,dotEnv, 和googleapis。在我们下载这些包之前,让我们用下面的命令初始化npm。

npm init -y

现在安装这些包。

npm install express dotenv googleapis

添加nodemon作为开发依赖(这将确保每当我们做任何代码修改时,开发服务器都会重新启动)。

npm install nodemon --save-dev

所有这些完成后,创建一个新的文件,名为index.js

首先要求dotenv ,然后初始化express

require('dotenv').config();
const express = require('express');
const app = express();

app.listen(3000 || process.env.PORT, () => {
  console.log('Up and running!!');
});

package.json 文件中创建一个新的脚本。

"dev": "nodemon index.js"

如果一切正常,nodemon将在我们每次保存文件时重新启动服务器。

npm run dev

提出你的第一个请求

完成这一切后,让我们看看我们的电子表格是否真的与谷歌云项目相联系。

从googleapis包中导入以下内容。

const { google } = require('googleapis');

创建一个GET路由。

app.get('/', async (req, res) => {
  res.send("Hello Google!");
});

接下来创建一个auth 代币,由指向我们下载的credentials.json 文件的keyFile 和提供完整访问的scopes 组成,以执行读写操作。

const auth = new google.auth.GoogleAuth({
  keyFile: 'credentials.json',
  scopes: 'https://www.googleapis.com/auth/spreadsheets'
});

Auth tokens in Google Sheets

源于此。Google Sheets for Developers

你可以随时参考谷歌官方的开发者文档,以获得更多的帮助。

接下来,定义client ,最新版本的API,以及spreadsheetId

const client = await auth.getClient();
const googleSheet = google.sheets({ version: 'v4', auth: client });
const spreadsheetId = your_spreadsheetid

从谷歌电子表格的URL中获取电子表格的ID,像这样。

https://docs.google.com/spreadsheets/d/{_your_database_id_}/edit#gid=0

在上面的例子中,gid 是工作表的ID。

你可能应该把这些敏感信息存储在一个环境文件中。创建一个.env 文件,如图所示存储电子表格ID。

SPREADSHEET_ID=your_spreadsheet_id

最后,把它指向环境变量。

const spreadsheetId = process.env.SPREADSHEET_ID

做完这一切,现在我们终于可以提出请求了!

const getMetaData = await googleSheet.spreadsheets.get({
  auth,
  spreadsheetId,
  range: 'Sheet1!A:B'
});

res.send(getMetaData);

确保你像上面那样给变量命名,因为这也是编写auth: auth 的速记方式。

每个API调用都需要两个参数,即authspreadsheetIdrange 定义了要编辑的单元格的范围。如果你不确定这些值,你可以随时利用电子表格的界面。在下一节谈到读取单元格值时,我们将使用。

现在,请继续向localhost:3000 上的根 URL 发出 GET 请求。如果你已经完成了所有的步骤,你会从API那里得到一个很长的响应。

GET request response

实现CRUD操作

1.读取单元格值

现在,注释掉前面的请求,让我们实际读取我们输入的单元格值。
为了读取单元格值,我们将使用spreadsheets.values.get 方法。

const getSheetData = await googleSheet.spreadsheets.values.get({
  auth,
  spreadsheetId,
  range: 'Sheet1!A:B'
});

res.send(getSheetData);

正如我之前所说,该方法总是接收authspreadsheetIdrange 参数定义了要读取和写入的单元格区域。在这种情况下,我们将只对前两列A和B进行修改。

继续做一个GET请求。

Make a GET request without restricting cell values

响应包含一堆信息,包括单元格值、单元格的颜色、地理位置和时区。让我们把目标放在单元格值上。

res.send(getSheetData.data.values);

响应现在看起来简洁多了。

GET request response with concise cell values

请注意,我们在这些结果中也得到了实际的列标题。你可能想省略这些,只发回第一行下面的单元格值。

下面是我们如何改变range 。选择你想包括在你的回复中的区域。选择的区域用一个范围表示。在我们的例子中,它是从A列到B列。

Select the range in your Google Sheet

由于我们需要包括第一行中列标题下的单元格值,我们可以从第二行开始选择。因此,新的范围现在是Sheet1!A2:B

现在的反应看起来好多了!

The final GET request, with all changes made

2.创建和发布数据

完成这些后,让我们继续将数据发布到电子表格中。

设置一个POST路径。

app.post('/post', async (req, res) => {
  res.send("Data submitted!");
});

按照上述同样的程序,设置auth token并定义电子表格的ID。

为了发布数据,我们将使用spreadsheets.values.append 方法。Google API会根据请求中传递的数值的数量,将数值追加到电子表格中。

该方法保持不变。我们将传入authspreadsheetId ,和一个range 。与此同时,我们现在再传入两个属性:valueInputOptionresource

const response = await googleSheet.spreadsheets.values.append({
  auth,
  spreadsheetId,
  range: 'Sheet1!A2:B',
  valueInputOption: 'USER_ENTERED',
  resource: {
    values: [['NextJS', 'The framework for Production']]
  }
});

res.send(response)

valueInputOption 可以选择两个选项,"RAW""USER_ENTERED" 。如果是"RAW" ,那么无论用户输入了什么,都会原封不动地保存起来。如果你使用"USER_ENTERED" ,那么用户输入的内容在传递时将始终被解析 - 如果用户输入一个数字,它将被解析为一个数字。

这在某些用例中真的很有帮助--例如,假设你正在构建一个React表单,将提交的数据发送到一个电子表格中。我将使用一个简单的电子表格的例子,其中有一个与每个科目对应的分数。

Example for creating and posting data

如果将valueInputOption 设置为"USER_ENTERED" ,数据就会被发布,并被识别为一个数字。但如果我将参数设置为"RAW" ,并将分数作为字符串传递,数据就会被发布,但Google Sheets似乎并不将分数视为数字。

Parsing strings and numbers in post data

resource 收录要添加到电子表格中的单元格值。你也可以通过添加另一组数组来输入多个条目。

resource: {
  values: [
        ['NextJS', 'The framework for Production'], 
        ['Jest', 'The testing framework for React']
  ]
}

继续,做一个POST请求。你可以利用任何API测试器,如Postman,以获得这方面的帮助。

3.更新单元格值

为了更新单元格值,我们将使用spreadsheets.values.update 方法。

继续,做一个PUT路由。

app.put('/update', async (req, res) => {
  res.send("Updated cell!");
});

该方法像往常一样接收authspreadsheetId 。请确保range 只指向一条记录,除非你要更新多条记录。

在这里,我将指定range: "Sheet1!A2:B2" ,这只是第二行。其余的都保持不变。你可以将valueInputOption 设置为"RAW""USER_ENTERED" 。最后,通过resource ,输入你想替换的单元格值。

const response = await googleSheet.spreadsheets.values.update({
  auth,
  spreadsheetId,
  range: 'Sheet1!A2:B2',
  valueInputOption: 'USER_ENTERED',
  resource: {
    values: [['Jamstack', 'Future of the Web']]
  }
});

res.send(response)

继续,在API测试器上做一个PUT请求。现在单元格值应该被更新了。

4.删除单元格值

Sheets API建议使用POST请求,以便使用spreadsheets.values.clear 方法。

Deleting cell values

来源。谷歌表单API文档

所以,我们要做一个新的POST路由。

app.post('/delete', async (req, res) => {
  res.send("Deleted Cell successfully!");
});

这个方法很简单。你所需要做的就是通过range 属性指定电子表格的行和列。

const response = await googleSheet.spreadsheets.values.clear({
  auth,
  spreadsheetId,
  range: "Sheet1!A5:B5"
});

/delete 路由发出一个新的请求,以查看变化。

好了,恭喜你!这是新的东西!我们已经使用谷歌表格实现了CRUD操作。如果你遇到困难,可以看看我GitHub上的这个repo

结论

看起来我们发现了一个全新的数据库,它是免费的,并且有一个干净的界面来管理数据。你可以用一系列的语言来使用它,包括Python、Go、Ruby等等。

虽然你的请求数量有限制--每100秒100个请求--但如果你从好的方面看,Google Sheets API为你提供了一个开始学习API的好方法,可以用来整合小规模的项目。

The postBuild a CRUD API using the Google Sheets APIappeared first onLogRocket Blog.