最近,我需要从 GitHub API 提取数据并发布到 Google 表格,以便我可以分享一些有关代码审查工作量的图表。这篇文章是关于我如何进行身份验证的。
我编写了一个 Node.js 脚本,因为我的用例对于 BASH 来说太复杂,而对于 Go 来说似乎太临时了。最初,该脚本生成了临时 CSV 数据,我可以使用“粘贴为 CSV”功能将其手动复制到 Google 表格中。经过几轮手动复制后,我想明智地利用我的时间:我估计我可以在几个小时内完成工作表集成,如果是的话,那就
可能会在几个月内得到回报。
旁白:表格不是我的数据库。这是我的数据报告用户界面。 不要使用表格作为数据库。
我花了将近 4 个小时才完成这项工作,因为身份验证很困难。这篇文章展示了更直接的可行解决方案。
创建 oAuth 应用程序的复杂性很容易分散注意力,虽然我特别喜欢使用云服务中的服务帐户,但
本地运行时不太方便。
我学到的技巧是,gcloud CLI 的应用程序默认凭据设置可以作为 Google Workspace 代码的 OAuth 代理运行,方法是扩展它向 Google 验证帐户的方式以包含更多权限(OAuth 范围)。
要向 Google Sheets 发出 API 请求,请在您的云项目中启用 Sheets API:
$> gcloud services enable sheets.googleapis.com Operation "operations/acat.p2-480745230567-02564c8d-c6ba-4f60-90bd-13f33e41f0fe" finished successfully.
设置您的应用程序默认凭据,还声明一些非默认 OAuth 范围,以便凭据可以与工作表一起使用:
$> gcloud auth application-default login --scopes \ 'https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/drive,https://www.googleapis.com/auth/spreadsheets'
这将触发 OAuth 流程,涉及访问浏览器中的网页。根据终端配置,这可能会显示 URL 甚至打开页面。
当 gcloud 被授予此范围时,可以访问您的本地凭据的代码将对您的所有 Google 表格数据具有读/写访问权限。您可以在没有自定义范围的情况下重新运行此命令,以根据需要打开和关闭该访问。
import {google} from 'googleapis'; function sheetsClient() { const authConfig = new google.auth.GoogleAuth({ scopes: [ // Only 'spreadsheets' scope is needed in the code. // gcloud CLI also needs 'cloud-platform' and 'drive'. 'https://www.googleapis.com/auth/spreadsheets' ], }); const auth = await authConfig.getClient(); return google.sheets({version: 'v4', auth}); }
文档中有关如何将数据附加到工作表的示例
(单击 Node.js 选项卡)效果很好。但是,我无法理解如何从那里进行身份验证。一旦我理解了上面的技巧,将缺少的 OAuth 范围添加到我的开发环境凭据中,该示例就可以工作。
我做了一些更改,以便更轻松地重用客户端,以不同的方式参数化请求,并强调我希望表格处理数据的方式。
利用上面的客户端初始化代码将数据附加到工作表的代码:
let client; async function appendDataToSheet(spreadsheetId, tab, values) { if (!client) { client = sheetsClient(); } try { const result = await client.spreadsheets.values.append({ spreadsheetId, range: `${tab}!A2:AG`, // Use my data as provided. valueInputOption: 'RAW', // Inserts rows as part of appending to reduce overwrites. insertDataOption: 'INSERT_ROWS', requestBody: { values }, }); console.log(`${result.data.updates.updatedCells} cells appended.`); } catch(e) { // Show the error, do not stop. Cross-reference the error with terminal output // and decide case-by-case to re-run the script or manually copy data. console.error(e); } }
我使用“append”是因为我的脚本收集每月指标,并且append允许我添加新行而无需删除较早的行。
以下是如何调用appendDataToSheet()函数的示例:
const values = [ // Each nested array is a spreadsheet row. [1, 2, 3, 4, 'luggage'], [4, 5, 6, 'N/A', 'sticks'], ]; appendDataToSheet( 'HPDkfqdu6rfIq5-4uTGDqz2tvmPxDZMul27JFexample', 'Exported Data Tab', values );
文档中提供了一些有关使用 Sheets API 的好提示,例如建议每张工作表每秒不要发送多个 API 请求。我找到了困难的方法:用第二个请求的数据覆盖第一个请求的数据。
如果我继续将其生产化,我可能会改用
Cloud Scheduler 和 Cloud Run 作业。如果您想阅读相关内容,请告诉我。
Unsplash 上的封面照片由 Glib Albovsky 拍摄
以上是通过 gcloud CLI 身份验证从本地脚本写入 Google 表格的详细内容。更多信息请关注PHP中文网其他相关文章!