PythonでGoogle Sheetsを編集する方法

February 16, 2017
レビュー担当者

PythonでGoogle Sheetsを編集する方法

この記事はGreg Bauguesこちらで公開した記事(英語)を日本語化したものです。

本稿は、以下に示す「データベースが必要ない場合もある」というPatrick McKenzie氏のツイートに触発されて書きました。

このチュートリアルでは、Anton Burnashev氏gspread Pythonパッケージを使用し、わずか数行のコードでGoogleスプレッドシートからデータの読み込み、書き込み、削除を実行する方法をご紹介します。

Google Drive APIとサービスアカウント

このチュートリアルを実践するには、スプレッドシートが必要になります。米国議会議員の全員の連絡先情報を記載したスプレッドシートをコピーし、使用してください。スプレッドシートのファイル名を任意の名前に変更してください。本稿では「米国議会議員リスト」とします。

スプレッドシートのコピーを作成

補足: Ian Webster氏は、このデータとTwilioと組み合わせて、市民が議会に簡単に電話できる方法を編み出しました。詳しくは、Twilioブログの「Call Any Representative Using One Phone Number」を参照してください。

プログラムでスプレッドシートにアクセスするには、Google APIコンソールからサービスアカウントとOAuth2認証情報を作成します。OAuth2の開発に苦労した経験がある場合でも、心配する必要はありません。サービスアカウントの使い方は非常に簡単です。

Google APIコンソールのUIは今後変更される可能性があります。

以下の手順と動画に従ってください。

  1. Google APIコンソールにアクセスします。
  2. [プロジェクトの選択]から[新しいプロジェクト]を選択し、プロジェクト名を入力し新規プロジェクトを作成します。
  3. APIとサービスから[ライブラリ]を選択します。Google Drive APIGoogle Sheets APIを検索し、[有効にする]を選択します。
  4. Webサーバーがアプリケーションデータにアクセスするための認証情報を作成します。APIとサービスから[認証情報]を選択します[認証情報を作成]をクリックし、[サービスアカウント]を選択します。
  5. サービスアカウント名を入力し、[作成を続行]を選択します。ロールを選択から[編集者]権限を選択し、[続行]を選択します。権限情報が保存されたら、[完了]を選択します。
  6. 作成したサービスアカウントのメールアドレスをクリックし、キーから[鍵を追加]をクリックします。[新しい鍵を作成]を選択し、キーのタイプは[JSON]を選択します。作成されたJSONファイルが自動的にダウンロードされます。
  7. JSONファイルをプロジェクトのルートディレクトリに移動し、ファイル名を「client_secret.json」に変更します。

Steps to get JSON file

 

最後に、アプリの認証に必要なステップである編集者権限の付与を行います。見逃しがちなので注意してください。

client_secret.jsonの、client_emailをコピーします。

JSONファイルで`client_email`が確認できる。

スプレッドシートに戻り、[共有]をクリックします。次に、クライアントのメールアカウント(client_email)をユーザーやグループと共有フィールドに貼り付け、[送信]をクリックします。

共有ボタン

サービスメールアドレスに共有

 

この手順をスキップし、Pythonからスプレッドシートにアクセスしようとすると、gspread.exceptions.SpreadsheetNotFoundエラーが発生します。

これで終了です。次にコードに進みます。

Pythonでスプレッドシートからデータを読み込む

認証情報が設定されている場合、PythonでGoogleスプレッドシートにアクセスするには、次の2つのパッケージが必要です。

  1. oauth2client – OAuth 2.0を使用し、Google Drive APIで認証します。
  2. gspread – Googleスプレッドシートを操作します。

以下のコマンドを実行し、パッケージをインストールします。

pip install gspread oauth2client

次に、プロジェクトのルートディレクトリにspreadsheet.pyファイルを作成します。以下のコードをspreadsheet.pyファイルに追加します。

sheet = client.open("{シートのファイル名}").sheet1{シートのファイル名}を編集するシートのファイル名に変更してください。今回は、ファイル名を「米国議会議員リスト」に設定したので、sheet = client.open("米国議会議員リスト").sheet1に変更します。

import gspread
from oauth2client.service_account import ServiceAccountCredentials

# use creds to create a client to interact with the Google Drive API
scope =['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive']
creds = ServiceAccountCredentials.from_json_keyfile_name('client_secret.json', scope)
client = gspread.authorize(creds)

# Find a workbook by name and open the first sheet
# Make sure you use the right name here.
sheet = client.open("{シートのファイル名}").sheet1

# Extract and print all of the values
list_of_hashes = sheet.get_all_records()
print(list_of_hashes)

sheet = client.open("{シートのファイル名}").sheet1{シートのファイル名}部分が編集したいシートのファイル名と一致していることを確認してください。シート名と不一致の場合、プログラムが正しく動作しません。

プロジェクトのルートディレクトリで以下のコマンドを実行します。

python3 spreadsheet.py

綺麗に整理されたデータが出力され驚くと思います。

データ出力

Pythonでスプレッドシートから挿入、更新、削除する

gspreadsの機能全般については、ドキュメントで詳細に解説しています。ここまでは、gspreadsの表面的な部分に触れてきました。

たとえば、データをハッシュのリストに抽出しましたが、必要に応じて複数のリストの中からリストを取得することもできます。

sheet.get_all_values()

また、単一の行、列、セルからデータを取得することもできます。

sheet.row_values(1)
  
sheet.col_values(1)

sheet.cell(1, 1).value

特定のセルを変更し、スプレッドシートに書き込むこともできます。

sheet.update_cell(1, 1, "I just wrote to a spreadsheet using Python!")

または、スプレッドシートに行を挿入することもできます。

row = ["I'm","inserting","a","row","into","a,","Spreadsheet","with","Python"]
index = 1
sheet.insert_row(row, index)

スプレッドシートから行を削除することもできます。

sheet.delete_row(1)

行の総数を調べることもできます。

sheet.row_count

これらの関数とその他数十種類の関数の詳細については、gspread APIリファレンスを参照してください。

PythonでGoogleスプレッドシートを使用すると、スプレッドシートを永続レイヤーとしてFlaskアプリケーションを開発したり、GoogleスプレッドシートからJupyter NotebookにデータをインポートしてPandasで分析したりできます。PythonでTwilioを試してみたい場合は、Pythonクイックスタートを参照してください。

良いプロジェクトが開発できた場合は、ぜひ教えてください。連絡先はgb[at]twilio.comまたは@greggybです。この投稿がお役に立ちましたら、ぜひご興味のありそうな方に共有してください。

レビューを提供してくれたDevin氏とSam氏、シートを提供してくれたGoogle、そして何よりも、gspreadを提供してくれたAnton氏に感謝申し上げます