首页  >  文章  >  web前端  >  通过 gcloud CLI 身份验证从本地脚本写入 Google 表格

通过 gcloud CLI 身份验证从本地脚本写入 Google 表格

Susan Sarandon
Susan Sarandon原创
2024-09-26 08:38:221104浏览

Write to Google Sheets from a local script via gcloud CLI authentication

最近,我需要从 GitHub API 提取数据并发布到 Google 表格,以便我可以分享一些有关代码审查工作量的图表。这篇文章是关于我如何进行身份验证的。

我编写了一个 Node.js 脚本,因为我的用例对于 BASH 来说太复杂,而对于 Go 来说似乎太临时了。最初,该脚本生成了临时 CSV 数据,我可以使用“粘贴为 CSV”功能将其手动复制到 Google 表格中。经过几轮手动复制后,我想明智地利用我的时间:我估计我可以在几个小时内完成工作表集成,如果是的话,那就
可能会在几个月内得到回报。

旁白:表格不是我的数据库。这是我的数据报告用户界面。 不要使用表格作为数据库。

我花了将近 4 个小时才完成这项工作,因为身份验证很困难。这篇文章展示了更直接的可行解决方案。

创建 oAuth 应用程序的复杂性很容易分散注意力,虽然我特别喜欢使用云服务中的服务帐户,但
本地运行时不太方便。

我学到的技巧是,gcloud CLI 的应用程序默认凭据设置可以作为 Google Workspace 代码的 OAuth 代理运行,方法是扩展它向 Google 验证帐户的方式以包含更多权限(OAuth 范围)。

?使用 gcloud CLI 进行本地身份验证

要向 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 表格数据具有读/写访问权限。您可以在没有自定义范围的情况下重新运行此命令,以根据需要打开和关闭该访问。

?️ 为 Google Sheets 初始化 Node 客户端

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn