created: 2023-05-31T07:02:35.370Z

google-sheet-cli を使って Spreadsheet のデータをCSVで取得する

Spreadsheet で管理しているデータをCSVでダウンロードして扱うことがあるが、データが更新されるごとにいちいちGoogleDriveのSpreadsheetのUIに行ってポチポチとタブごとにダウンロードするのが面倒なので、コマンドラインからダウンロードしたい。

認証が不要なシートなら curl で取れる。

しかし、仕事で使っているデータとかだとパブリックにオープンにできないものも多いし、認証的な抜け穴を整備するのも憚られる。できればきちんと自分のアカウントから認証認可の権限を払い出したい。

検索したところ、圧倒的デファクトみたいなツールは見つからなかったが、このソフトウェアを試してみたところ期待通り動作したのでメモ。

まず認証

つかってみて思ったことは、認証方法がややこしくて広く使われてるツールがないのかな。ということ。データを実際にダウンロードするまでに色々手順が必要で、そして GoogleWorkspace と GCP の連携がもう少しこなれて来るまではこの手順を簡単にする方法はないんじゃないかなというところ。

手順

  • GCPプロジェクト(あるものを流用でもいい)を作成
  • Google Sheets API のAPIを有効化
  • プロジェクトのIAMでサービスアカウントを払い出す
  • サービスアカウントの client_email を利用したいスプレッドシートの共有リストに追加(これはスプレッドシートのUIから追加する必要がある)
  • サービスアカウントの秘密鍵を環境変数 GSHEET_PRIVATE_KEY に入れておく

このあたりの手順はツールのREADMEだとこの辺に書いてある。

使い方

brew では入らないので npm からグローバルインストールする。

$ npm install -g google-sheet-cli

GCPのコンソールから認証情報のjsonファイルを取得して対象のシートに共有。セットアップではこの手順が一番大変。

... コンソールの操作なので中略 ...

jsonファイルから利用する認証情報を抜き出し。

$ cat ~/Download/xxxxx-0xxxxxx702a.json | jq -r .client_email
$ cat ~/Download/xxxxx-0xxxxxx702a.json | jq -r .private_key

払い出したサービスアカウントの鍵とメールアドレスを環境変数に設定。

export GSHEET_CLIENT_EMAIL="google-sheet-cli@myproj.iam.gserviceaccount.com"
export GSHEET_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nMI...

いろいろオプションをつけて実行すると取得できる。

$ google-sheet data:get \
    --hasHeaderRow \
    --csv \
    --spreadsheetId='1HxxxxxxxxxxxxaqA' \
    --worksheetTitle='取得されたデータの一覧'
ダークナイト [Blu-ray]
[ad] ダークナイト [Blu-ray]
出演 クリスチャン・ベール, マイケル・ケイン (Blu-ray)