」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 透過 gcloud CLI 驗證從本機腳本寫入 Google 表格

透過 gcloud CLI 驗證從本機腳本寫入 Google 表格

發佈於2024-11-03
瀏覽:348

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如有侵犯,請聯絡study_golang@163 .com刪除
最新教學 更多>
  • 如何使用 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)。 建議路徑:.U...
    程式設計 發佈於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
  • 如何使用 JavaScript 將連結保留在同一選項卡中?
    如何使用 JavaScript 將連結保留在同一選項卡中?
    在同一分頁和視窗中導覽連結您可能會遇到想要在同一視窗和分頁中開啟連結的情況作為當前頁面。但是,使用 window.open 函數通常會導致在新分頁中開啟連結。為了解決這個問題,您可以使用name 屬性,如下所示:window.open("https://www.youraddress.co...
    程式設計 發佈於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 是否提供了另一種方法來定義帶有嵌入引號的字串而不訴諸轉義? 答案: 雖然Java ...
    程式設計 發佈於2024-11-05
  • 耐用的 Python:建立防彈的長期運作工作流程,變得簡單
    耐用的 Python:建立防彈的長期運作工作流程,變得簡單
    在现代软件开发中,创建强大的工作流程来连接来自各种服务的 API 并处理同步和异步事件是一个常见的挑战。传统方法涉及使用队列、微服务和状态管理系统的组合来构建可扩展的应用程序。虽然有效,但这种架构带来了巨大的开销:设置和维护消息队列等基础设施、运行服务器或 lambda 函数、管理数据库中的状态以及...
    程式設計 發佈於2024-11-05
  • 使用 Node.js 建立即時儀表板
    使用 Node.js 建立即時儀表板
    介紹 在當今快節奏的商業世界中,組織存取即時數據以做出明智的決策至關重要。這就是使用 Node.js 建立即時儀表板發揮作用的地方。 Node.js 是一種流行的、輕量級的、高效的 JavaScript 執行環境,近年來獲得了極大的普及。在本文中,我們將討論專門使用 Node.js...
    程式設計 發佈於2024-11-05

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3