gspreadを使ってpythonからGoogle Spreadsheetsを編集する
動機
これ自動で作れるんじゃない? と思えるエクセルのドキュメントが目についたのでやってみた
前提条件
ながれ
- プロジェクトを作成する
- Google Drive APIをオンにする
- Credentialを発行する
- 操作したいスプレッドシートにユーザを登録
- プログラムを作って操作
1. プロジェクトを作成する
Google API Consoleにアクセスして、新規プロジェクトを作成する。
2. Google Drive APIをオンにする
作成したプロジェクトのGoogle Drive API をオンにする。
↓のリンクでオンにするページにいける
3. Credentialを発行する
引き続き、作成したプロジェクトのCredentialの設定から、Service Account Keyの作成を選択。
適当なサービスアカウントを選択し、Key typeは、JSONを選択して、Createをクリックします。
すると、キーを含んだJSONファイルがダウンロードされるので、これから作るpythonプログラムから参照しやすい場所にてきとうに保存します。
4. 操作したいスプレッドシートにユーザを登録
先ほどダウンロードしたJSONファイルを開いてみると、client_emailというキーの値に、"プロジェクト名-xxxx@appspot.gserviceaccount.com"といった形のメールアドレスが記載されているので、クリップボードにコピーします。
次に、編集したいGoogle Spreadsheetを作成して、共有設定から、上でクリップボードにコピーしたメールアドレスを編集可能でインバイトします。
5. プログラムを作って操作
ようやくpythonを書きます。
pythonは、2系を使っています。
まず、gspreadとoauth2clientをインストールします。
$ pip install gspread ...略 $ pip install oauth2client ...略
次にpythonのコードをかきます。
import gspread from oauth2client.service_account import ServiceAccountCredentials scope = ['https://spreadsheets.google.com/feeds'] # 3でダウンロードしたjsonファイルを指定する credentials = ServiceAccountCredentials.from_json_keyfile_name('プロジェクト名-zzzzzzzzz.json', scope) gc = gspread.authorize(credentials) # 4で作成したスプレッドシートの名前を指定する # スプレッドシートの名称以外に、 # URLに含まれるIDで開くopen_by_key、URL自体を指定してスプレッドシートを開くopen_by_url # というメソッドもある。 Credentialのメールアドレスでパーミッションが与えられているものしか開けない # ので、注意! wks = gc.open("gspread example").sheet1 # A1セルの値を取得 print wks.acell('A1') # A1セルを更新 wks.update_acell('A1', u'Hello, gspread.')
まだ、細部までチェックはできていませんが、ひと通りの操作については、以下のAPI Referenceを見た感じできそうです。
コマンドラインで素早くcsvの特定カラムを削除する
レコード数が多いcsvやtsvの、特定のカラムのみを削除したい場合、 cutコマンドが使えます。
例)
list.csv
id, name, address, tel 1, mike, foo, 000 2, bob, bar, 000 3, nancy, baz, 000 4, ken, boo, 000
上のようなcsvの、addressのカラムを削除したい場合。削除したいカラムは3列目なので、以下のようになる。
$ cat list.csv | cut -d "," -f 1-2,4 > list_new.csv
-dオプションで、区切り文字の指定が可能。デフォルトはタブとなっているため、 tsvのカラムを削除したい場合は、-dオプションは指定する必要はない。
-fオプションで、出力したいカラムの番号を指定する。開始は1からで、 -(ハイフン)を使って範囲を指定することもできる。
"Unused block argument - `%s`. If it's necessary, use `_` or `_%s` as an argument name to indicate that it won't be used."の対処方法
Rubocopで、以下のような警告が出た場合の対処方法。
Unused block argument - `%s`. If it's necessary, use `_` or `_%s` as an argument name to indicate that it won't be used.
%sには、ブロック内で使われていないアーギュメントが入ります。
ブロック内で利用しないアーギュメントの頭にアンダースコアを付けることで解決します。
Class: RuboCop::Cop::Lint::UnusedBlockArgument — Documentation for rubocop (0.39.0)
@bad do_something do |used, unused| puts used end @good do_something do |used, _unused| puts used end
"Move `%s` out of conditional." の対処方法
Rubocopで、こんなエラーが出た時の対処方法。
Move `%s` out of the conditional.
%sには、メソッドの呼び出しなどが入る。
対処方法は、以下のように%sで指摘されているメソッド呼び出しが冗長になっているので、条件分岐のブロックの外にだすことで解決する。
Class: RuboCop::Cop::Style::IdenticalConditionalBranches — Documentation for rubocop (0.39.0)
@bad if condition do_x do_z else do_y do_z end @good if condition do_x else do_y end do_z