顾名思义,谷歌表格API让你连接现有的电子表格,解析其可用数据,并将其传递给你的网络应用。最新的是4.0版本,它为用户提供了对许多其他属性的控制--比如对单元格格式的完全访问,包括设置颜色、文本样式等等。想象一下,拥有一个完全免费的数据库,其直观的用户界面可以帮助你查看你的数据,并根据你的需要组织数据,同时作为一个CMS。这有多酷啊?
不多说了,让我们直接进入使用Google Sheets API创建你自己的CRUD API。
以下是我们在这篇文章中要介绍的内容。
在Google Cloud Console中设置一个新的项目
与访问任何API服务一样,我们必须首先设置认证和授权。如果你还没有建立账户,请前往谷歌云并注册。然后,按照下面的步骤制作一个新项目。
点击新建项目,给它一个合适的名字,然后点击创建。
接下来,点击导航菜单,转到API 和 服务。

然后,你将被重定向到API库。搜索Google Sheets API并启用它。
回到API和服务仪表板。转到凭证并创建一个新的凭证。
点击服务账户。给它起个名字,其余部分按原样设置,然后点击完成。
现在你已经为电子表格创建了一个机器人账户,该账户具有对表格进行读写操作的权限。
复制我们创建的服务邮箱。这将在我们将电子表格连接到谷歌云项目时派上用场。
点击服务帐户的电子邮件,然后继续前进到键。
继续并创建一个新的键,将文件类型设置为JSON。很快就会下载一个文件,如果可能的话,你应该把它移到你期望设置起始文件的文件夹中。
链接谷歌工作表
现在我们要把我们的电子表格连接到谷歌云项目上。前往Google Docs,制作一个新的电子表格。为电子表格命名。
输入一些假数据,这样我们在测试API的时候就有东西可以取了。
现在,让我们添加服务账户,并给它分配编辑的角色,这使它具有读取、写入、更新和删除数据的权限。
点击分享,添加我们最近复制的服务电子邮件,确保你给它编辑权限,并取消勾选通知人们。
这就是你所要做的一切现在让我们到代码编辑器去,为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'
});

源于此。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调用都需要两个参数,即auth 和spreadsheetId 。range 定义了要编辑的单元格的范围。如果你不确定这些值,你可以随时利用电子表格的界面。在下一节谈到读取单元格值时,我们将使用。
现在,请继续向localhost:3000 上的根 URL 发出 GET 请求。如果你已经完成了所有的步骤,你会从API那里得到一个很长的响应。
实现CRUD操作
1.读取单元格值
现在,注释掉前面的请求,让我们实际读取我们输入的单元格值。
为了读取单元格值,我们将使用spreadsheets.values.get 方法。
const getSheetData = await googleSheet.spreadsheets.values.get({
auth,
spreadsheetId,
range: 'Sheet1!A:B'
});
res.send(getSheetData);
正如我之前所说,该方法总是接收auth 和spreadsheetId 。range 参数定义了要读取和写入的单元格区域。在这种情况下,我们将只对前两列A和B进行修改。
继续做一个GET请求。
响应包含一堆信息,包括单元格值、单元格的颜色、地理位置和时区。让我们把目标放在单元格值上。
res.send(getSheetData.data.values);
响应现在看起来简洁多了。
请注意,我们在这些结果中也得到了实际的列标题。你可能想省略这些,只发回第一行下面的单元格值。
下面是我们如何改变range 。选择你想包括在你的回复中的区域。选择的区域用一个范围表示。在我们的例子中,它是从A列到B列。
由于我们需要包括第一行中列标题下的单元格值,我们可以从第二行开始选择。因此,新的范围现在是Sheet1!A2:B 。
现在的反应看起来好多了!
2.创建和发布数据
完成这些后,让我们继续将数据发布到电子表格中。
设置一个POST路径。
app.post('/post', async (req, res) => {
res.send("Data submitted!");
});
按照上述同样的程序,设置auth token并定义电子表格的ID。
为了发布数据,我们将使用spreadsheets.values.append 方法。Google API会根据请求中传递的数值的数量,将数值追加到电子表格中。
该方法保持不变。我们将传入auth ,spreadsheetId ,和一个range 。与此同时,我们现在再传入两个属性:valueInputOption 和resource 。
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表单,将提交的数据发送到一个电子表格中。我将使用一个简单的电子表格的例子,其中有一个与每个科目对应的分数。
如果将valueInputOption 设置为"USER_ENTERED" ,数据就会被发布,并被识别为一个数字。但如果我将参数设置为"RAW" ,并将分数作为字符串传递,数据就会被发布,但Google Sheets似乎并不将分数视为数字。
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!");
});
该方法像往常一样接收auth 和spreadsheetId 。请确保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 方法。
来源。谷歌表单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.