”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 通过 gcloud CLI 身份验证从本地脚本写入 Google 表格

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

发布于2024-11-03
浏览:750

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

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

我编写了一个 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 作业。如果您想阅读相关内容,请告诉我。

封面照片由 Glib Albovsky 在 Unsplash 上拍摄

版本声明 本文转载于:https://dev.to/googlecloud/write-to-google-sheets-from-a-local-script-via-gcloud-cli-authentication-3p1f?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 寻找经济实惠的同日格兰尼公寓(带 Pillar Build Granny Flats)
    寻找经济实惠的同日格兰尼公寓(带 Pillar Build Granny Flats)
    在 Pillar Build Granny Flats,我们为您提供祖母屋解决方案的精英服务,满足您的独特需求。无论是房主、承包商还是投资者,我们都可以帮助您在当天购买后院公寓,效果非常好,为您节省宝贵的时间,而且不用说,预算也很实惠。我们的祖母房建造者将在每一步工作,以确保您的项目以最精确和细心的...
    编程 发布于2024-11-05
  • 如何使用 botoith Google Colab 和 AWS 集成
    如何使用 botoith Google Colab 和 AWS 集成
    您有没有想过,在实施AWS Lambda时,想要一一确认代码的运行情况? 您可能认为在 AWS 控制台上实施很痛苦,因为您必须运行 Lambda 函数并且每次都会产生成本。 因此,我将向您展示您的担忧的解决方案。 它是通过 Google Colab 和 AWS 集成实现的。 步骤如下: ...
    编程 发布于2024-11-05
  • (高性能 Web 应用程序的要求
    (高性能 Web 应用程序的要求
    “高性能网络应用程序”或“前端”到底是什么? 自从 Internet Explorer 时代衰落以来,JavaScript 生态系统变得越来越强大,“前端”一词已成为高性能、现代 Web 客户端的代名词。这个“前端”世界的核心是 React。事实上,在前端开发中不使用 React 常常会让一个人看...
    编程 发布于2024-11-05
  • 如何将单个输入字段设置为分区输入?
    如何将单个输入字段设置为分区输入?
    将输入字段设置为分区输入有多种方法可用于创建一系列分区输入字段。一种方法利用“字母间距”来分隔单个输入字段内的字符。此外,“background-image”和“border-bottom”样式可以进一步增强多个输入字段的错觉。CSS Snippet以下 CSS 代码演示了如何创建所需的效果:#pa...
    编程 发布于2024-11-05
  • 用 Go 构建一个简单的负载均衡器
    用 Go 构建一个简单的负载均衡器
    负载均衡器在现代软件开发中至关重要。如果您曾经想知道如何在多个服务器之间分配请求,或者为什么某些网站即使在流量大的情况下也感觉更快,答案通常在于高效的负载平衡。 在这篇文章中,我们将使用 Go 中的循环算法构建一个简单的应用程序负载均衡器。这篇文章的目的是逐步了解负载均衡器的工作原理。 ...
    编程 发布于2024-11-05
  • 如何以超链接方式打开本地目录?
    如何以超链接方式打开本地目录?
    通过超链接导航本地目录尝试在链接交互时启动本地目录视图时,您可能会遇到限制。然而,有一个解决方案可以解决这个问题,并且可以在各种浏览器之间无缝工作。实现方法因为从 HTML 页面直接打开路径或启动浏览器是由于安全原因受到限制,更可行的方法是提供可下载的链接(.URL 或 .LNK)。推荐路径:.UR...
    编程 发布于2024-11-05
  • 为什么 Makefile 会抛出 Go 命令的权限被拒绝错误?
    为什么 Makefile 会抛出 Go 命令的权限被拒绝错误?
    运行 Go 时 Makefile 中出现权限被拒绝错误通过 Makefile 运行 Go 命令时可能会遇到“权限被拒绝”错误,即使你可以直接执行它们。这种差异是由于 GNU make 中的问题引起的。原因:当您的 PATH 上有一个目录包含名为“go.gnu”的子目录时,就会出现此错误。 ”例如,如...
    编程 发布于2024-11-05
  • parseInt 函数中 Radix 参数的意义是什么?
    parseInt 函数中 Radix 参数的意义是什么?
    parseInt 函数中 Radix 的作用parseInt 函数将字符串转换为整数。然而,它并不总是采用以 10 为基数的数字系统。要指定所需的基数,请使用基数参数。理解基数基数是指单个数字表示的值的数量。例如,十六进制的基数为 16,八进制的基数为 8,二进制的基数为 2。为什么使用基数?需要当...
    编程 发布于2024-11-05
  • 在空数据集上使用 MySQL 的 SUM 函数时如何返回“0”而不是 NULL?
    在空数据集上使用 MySQL 的 SUM 函数时如何返回“0”而不是 NULL?
    当不存在任何值时如何从 MySQL 的 SUM 函数中检索“0”MySQL 中的 SUM 函数提供了一种方便的方法来聚合数值价值观。但是,当查询期间没有找到匹配的行时,SUM 函数通常返回 NULL 值。对于某些用例,可能更需要返回“0”而不是 NULL。利用 COALESCE 解决问题此问题的解决...
    编程 发布于2024-11-05
  • 如何使用 JavaScript 将链接保留在同一选项卡中?
    如何使用 JavaScript 将链接保留在同一选项卡中?
    在同一选项卡和窗口中导航链接您可能会遇到想要在同一窗口和选项卡中打开链接的情况作为当前页面。但是,使用 window.open 函数通常会导致在新选项卡中打开链接。为了解决这个问题,您可以使用 name 属性,如下所示:window.open("https://www.youraddres...
    编程 发布于2024-11-05
  • 如何解决Python中的循环依赖?
    如何解决Python中的循环依赖?
    Python 中的循环依赖使用 Python 模块时遇到循环依赖可能是一个令人沮丧的问题。在这个特定场景中,我们有两个文件,node.py 和 path.py,分别包含 Node 和 Path 类。最初,path.py 使用 from node.py import * 导入 node.py。但是,在...
    编程 发布于2024-11-05
  • MariaDB 与 MySQL:开发人员需要了解什么
    MariaDB 与 MySQL:开发人员需要了解什么
    MariaDB 和 MySQL 是著名的开源 RDBMS,但尽管它们有着共同的历史,但它们在功能和性能方面却有所不同。本文快速强调了主要差异,帮助开发人员决定哪个数据库最适合他们的需求。 差异和示例 存储引擎,MariaDB 对 Aria 和 MyRocks 等引擎的扩展支持提供了比...
    编程 发布于2024-11-05
  • 为什么我的 Goroutine 递增变量会产生意外的结果?
    为什么我的 Goroutine 递增变量会产生意外的结果?
    这是编译器优化的结果吗?在此代码片段中,启动了一个 goroutine 并重复递增变量 i:package main import "time" func main() { i := 1 go func() { for { ...
    编程 发布于2024-11-05
  • 利用 AI 快速学习 Node.js - 第 4 天
    利用 AI 快速学习 Node.js - 第 4 天
    今天,借助ChatGPT继续学习Node.js,重点是异步编程。这是 Node.js 中最重要的概念之一,我很高兴能够开始掌握它。 理论 在 Node.js 中,异步编程因其非阻塞、事件驱动的架构而至关重要。这意味着文件读取、数据库查询或网络请求等操作在等待结果时不会阻塞其他代码的执行。 我们探索了...
    编程 发布于2024-11-05
  • Java 可以定义带有嵌入引号的字符串而不转义吗?
    Java 可以定义带有嵌入引号的字符串而不转义吗?
    揭开 Java 使用嵌入式引号定义字符串的替代方法在 Java 中处理字符串时,您常常会在文字中遇到大量引号,导致繁琐的转义和可读性挑战。虽然其他语言提供了处理这种情况的语法,但 Java 缺乏类似的选项。问题: Java 是否提供了另一种方法来定义带有嵌入引号的字符串而不诉诸转义?答案: 虽然 J...
    编程 发布于2024-11-05

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3