読者です 読者をやめる 読者になる 読者になる

SCUEL開発者ブログ

医療機関および介護事業所などのデータベース事業『SCUEL』を作っているエンジニア達のブログです。エンジニア募集中です!ご興味がありましたら、以下のフォームからお問い合わせください。 http://goo.gl/forms/8fPwBHDL2H

gspreadを使ってpythonからGoogle Spreadsheetsを編集する

動機

これ自動で作れるんじゃない? と思えるエクセルのドキュメントが目についたのでやってみた

前提条件

  • Googleアカウントを持っている
  • pythonが動く環境がある(本記事はUbuntu 14.04 LTS上でやってます)

ながれ

  1. プロジェクトを作成する
  2. Google Drive APIをオンにする
  3. Credentialを発行する
  4. 操作したいスプレッドシートにユーザを登録
  5. プログラムを作って操作

1. プロジェクトを作成する

Google API Consoleにアクセスして、新規プロジェクトを作成する。

gyazo.com

2. Google Drive APIをオンにする

作成したプロジェクトのGoogle Drive API をオンにする。

↓のリンクでオンにするページにいける

Google API Console

gyazo.com

3. Credentialを発行する

引き続き、作成したプロジェクトのCredentialの設定から、Service Account Keyの作成を選択。

gyazo.com

適当なサービスアカウントを選択し、Key typeは、JSONを選択して、Createをクリックします。

gyazo.com

すると、キーを含んだJSONファイルがダウンロードされるので、これから作るpythonプログラムから参照しやすい場所にてきとうに保存します。

4. 操作したいスプレッドシートにユーザを登録

先ほどダウンロードしたJSONファイルを開いてみると、client_emailというキーの値に、"プロジェクト名-xxxx@appspot.gserviceaccount.com"といった形のメールアドレスが記載されているので、クリップボードにコピーします。

次に、編集したいGoogle Spreadsheetを作成して、共有設定から、上でクリップボードにコピーしたメールアドレスを編集可能でインバイトします。

gyazo.com

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を見た感じできそうです。

gspread API Reference — gspread 0.3.0 documentation

コマンドラインで素早く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