首頁  >  文章  >  web前端  >  透過 gcloud CLI 驗證從本機腳本寫入 Google 表格

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

Susan Sarandon
Susan Sarandon原創
2024-09-26 08:38:22982瀏覽

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