最近,我需要從 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中文網其他相關文章!