最近、コード レビュー ワークロードに関するいくつかのグラフを共有できるように、GitHub API からデータを取得して Google スプレッドシートに公開する必要がありました。この投稿は、認証をどのように機能させたかについてです。
私のユースケースは BASH には複雑すぎ、Go には一時的すぎると思われたため、Node.js スクリプトを作成しました。最初は、スクリプトによってアドホック CSV データが生成され、CSV として貼り付け機能を使用して Google スプレッドシートに手動でコピーできました。手動でコピーを数回行った後、時間を賢く使いたいと思いました。数時間以内にスプレッドシートの統合が機能するようになるだろうと見積もっていました。そうであれば、
おそらく数か月以内に元が取れるでしょう。
余談: スプレッドシートは私のデータベースではありません。これは私のデータレポート UI です。 スプレッドシートをデータベースとして使用しないでください。
認証が難しいため、これを機能させるまでに 4 時間近くかかりました。この投稿では、実用的なソリューションへのより直接的なパスを示します。
oAuth アプリケーションの作成の複雑さに気を取られがちですが、私は特にクラウド サービスのサービス アカウントを使用するのが好きですが、それは
ローカルで実行する場合はあまり便利ではありません。
私が学んだコツは、gcloud CLI によるアプリケーションのデフォルト認証情報の設定は、Google でアカウントを認証する方法を拡張して、さらにいくつかの権限(OAuth スコープ)を含めることにより、Google Workspace コードの一種の OAuth プロキシとして機能できるということです。
Google スプレッドシートに 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'
これにより、ブラウザで Web ページにアクセスすることを含む 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); } }
スクリプトが毎月のメトリクスを収集し、追加を使用すると、以前の行を削除せずに新しい行を追加できるため、「追加」を使用しています。
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 );
ドキュメントには、シートごとに 1 秒あたり複数の API リクエストを送信しないという提案など、Sheets API の操作に関するいくつかの優れたヒントが記載されています。最初のリクエストのデータを 2 番目のリクエストのデータで上書きするという難しい方法であることがわかりました。
これを製品化することに進めば、
の使用に切り替えるかもしれません
Cloud Scheduler と Cloud Run ジョブ。それについて読みたい場合はお知らせください。
Unsplash の Glib Albovsky によるカバー写真
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3