【Python】「gspread」で「 Googleスプレッドシート」のワークブック、ワークシートを操作してみよう

python

みなさんこんにちは。zak-papaです。

以前にPythonで「Excel」を操作することができる「OpenPyXL」の基本操作について説明しました。

python【Python】「OpenPyXL」で「Excel」のワークブック、ワークシートを操作してみよう

 

今回は、「Excel」と同じような表計算ソフトの「Google スプレッドシート」を操作する「gspread」の使い方について説明したいと思います。

Excelが 「VBA」で操作できるのと同じように、スプレッドシートも基本は「Google Apps Script」で操作をします。
しかし、Pythonで「スクレイピング」などの処理をして、その結果を「Google スプレッドシート」に出力することもできるので、Pythonからスプレッドシートを操作する方法も知っておくと便利です。
 ※ Google Apps Scriptについては別カテゴリで説明していますのでそちらをご参照ください。

 

ただ、「スプレッドシート」の操作については単純にインストールだけではできないんですよね...。
Googleの各種サービスを扱うには「プロジェクトの新規作成」やら「APIの有効化」やら一手間行わないといけません。

プログラミング初心者には難しいと感じてしまうかもしれませんが、そんなに難しいことはなく、手順通りに進めれば10分で初期設定は完了します。

こちらで初期設定方法を説明しているので、まずはこちらで初期設定をお願いします。

gspread【Python】「gspread」で「Google スプレッドシート」を操作するための「初期設定」をしよう

 

 

準備ができたら、まずは「gspread」で「ワークブック」「ワークシート」の基本的な操作方法について見ていきましょう。「セル」の操作方法については次回お伝えします。

 

「Python」から読み書きする準備をしよう

事前準備(前回の復習)

前回と同じ内容になります。

私の動作環境は次の通りです。ご自身の使い慣れているものをお使いいただければと思います。
Windowsでも同じように動作すると思います。

OS macOS Catalina 10.15.3 Version Python 3.7.4
エディタ Visual Studio Code ブラウザ Google Chrome
ディレクトリ Desktop/gspread ファイル gspread_practice.py

 

取得した「秘密鍵(JSONファイル)」も同じディレクトリ内に入れておきましょう。

Desktop_gspread

 

下記のコードは「スプレッドシート」を操作する際に毎回同じ内容のものであるとお伝えしましたね。この後に続けてコードを書いていきます。

ただし、7行目には取得した「秘密鍵(JSONファイル)」の「ファイル名(私の場合は「spreadsheet-sample.json」)」を入力してください。

 

 

「ワークブック」を操作してみよう

準備が完了したら実際に操作していきましょう。

「gspread」でスプレッドシートを操作する場合に、次の3ステップを踏むことが必要です。

「gspread」でスプレッドシートを操作するための3ステップ
  1. ワークブックの取得(指定)
  2. ワークシートの取得(指定)
  3. セル範囲の取得(指定)

 

つまり、

①どの「ワークブック」の
②どの「ワークシート」の
③どの「セル」に対して処理するか
 を取得(指定)する必要があります。

spreadsheet

 

 

なので、まずは「ワークブック」を取得する方法から順に見ていきましょう。
ワークブックの取得方法は3パターンあります。

ワークブックの取得方法
  1. 「名前」で取得する (spreadsheet_sample)
  2. 「キー」で取得する (URLの「/d」と「/edit」の間)
  3. 「URL」で取得する (https://docs.google.com/spreadsheets/…)

spreadsheet_sample

 

順に見ていきましょう。

 

一般的には②の「キー」を変数に代入して指定することが多いようです。

 

 

「名前」でワークブックを取得する

まずは①のワークブックの「名前(spreadsheet_sample)」で取得する方法です。

spreadsheet_sample

 

コードはこちら。print()で出力して確認してみましょう。
※ 1行目〜6行目までは毎回同じコードになるので次回からは割愛します。

 

「spreadsheet_sample」が出力されたので無事取得できています。同時に「id」も出力されましたね。

ワークブックの取得

 

 

「キー」でワークブックを取得する

次に②の「キー(スプレッドシートキー)」で取得する方法を見ていきましょう。「キー」は次の図の②にあるURLの「/d」と「/edit」の間にあります。

spreadsheet_sample

 

コードはこちら。一般的に②の「キー」を使ってワークブックを取得することが多いようです。
「キー」を変数に格納した上で処理しています。

 

こちらも全く同じものが出力されたので、「キー」を使ってワークブックを取得できています。

ワークブックの取得

 

 

「URL」でワークブックを取得する

最後に③の「URL」で取得する方法を見ていきましょう。「URL」は説明するまでもないですが次の図の③の部分ですね。

spreadsheet_sample

 

コードはこちら。こちらも「URL」を変数に格納した上で処理しています。

 

こちらも全く同じものが出力されましたね。

ワークブックの取得

 

以上、ワークブックを取得する方法でした。

 

 

「ワークシート」を操作してみよう

次は「ワークシート」を取得します。こちらも取得方法は3パターンあります。

ワークシートの取得方法
  1. 「名前」で取得する  (「シート1」)
  2. 「index」で取得する   (「0」「1」...)
  3. 「sheet1」で取得する (「sheet1」のみ)

 

順に見ていきましょう。

 

 

 

「名前」でワークシートを取得する

まずは①のワークシートの「名前(シート1)」で取得する方法です。

コードはこちら。print()で出力して確認してみましょう。
※ 前提条件として「キー」でワークブックを取得しています。

 

「シート1」が出力されたので無事ワークシートを取得できています。

ワークシートの取得

 

 

「index」でワークシートを取得する

次に②のワークシートの「index(インデックス:「0」「1」など)」で取得する方法です。
インデックスは一番左のシートが「0」となります。

 

コードはこちら。

 

こちらも同じように「シート1」が出力されましたね。

ワークシートの取得

 

ちなみにインデックスを「1」にするとシートがないため「None」と表示されます。

None

 

 

もちろん、次のようにシート名を「sample」に変更した場合も、同じコードでワークシートを取得することができます。

samplesheet

 

Worksheet_sample

 

 

「sheet1」でワークシートを取得する

最後に③の「sheet1(「sheet1のみ」)」で取得する方法を見ていきましょう。一番左のシートが「sheet1」となります。
※ 「sheet2」「sheet3」のように記述した場合については後ほど説明。

 

コードはこちら。

 

 

こちらも同じように「シート1」が出力されましたね。

ワークシートの取得

 

①の取得方法では「シート名」が変わる度にコードも変更する必要がありましたが、②と③の取得方法では「シート名」が変わってもコードを変更することなく対象となるワークシートを取得できます。

 

 

ちなみに「sheet2」や「sheet3」にしてみるとどうなるでしょうか。
先ほどは「None」と出力されましたが、こちらは「エラー」になります。AttributeError

 

どうやら最初(一番左)のワークシートしか取得できないようですね。
ワークシートが1つしかない場合や1つしか使用しない場合には、こちらの③の取得方法を使うと良いと思います。「アクティブ」なワークシートを取得する感覚に近いですかね。

 

以上、ワークシートを取得する方法でした。

 

 

「ワークシート」を操作してみよう_2

続いて、ワークシートの「新規作成」など、他の操作をしてみましょう。

ワークシートを「新規作成」する

まずはワークシートを「新規作成」します。

「add_worksheet()」の引数に「タイトル」「行数」「列数」を予め指定して作成します。
下記コードでは、「new worksheet」というタイトルで「100行、20列(T列まで)」で作成しています。

 

new_worksheet

 

 

ワークシートの「シート名」を変更する

続いてワークシートの「シート名」を変更します。

「update_title()」の引数に「変更後のシート名」を書きます。
下記コードでは、一番左の「シート1」というシート名を「update title」に変更しています。

 

update_title

 

 

ワークシートを「コピー」する

続いてワークシートを「コピー」してみましょう。

コピーするためには「シートID」が必要になります。上記で説明した「スプレッドシートキー」ではなく「シートID」です。実は「シート」にもそれぞれ「ID」があります。

 

では、どのように「シートID」を取得すれば良いでしょうか。
次のように「id」属性を付けて取得することができます。上記2つのシートの「シートID」を取得してみましょう。

 

それぞれ「シートID」を取得できました。一番左のシートはデフォルトでは「0」になるようですね。

sheet_id

 

 

では、この「シートID」を使って、2つ目のシート(new worksheet)をコピーしてみましょう。

「duplicate_sheet()」の引数に取得した「シートID(source_sheet_id = シートID)」を書きます。
また、シート名も予め決めることができ、続けて「new_sheet_name = "コピー先のシート名"」と書きます。

 

無事コピーされましたね。ただ、デフォルトでは「一番左」の位置にコピーされるようです。

second_worksheet

 

では、指定した場所にコピーしたい場合はどうしたら良いでしょうか。
こちらも引数に「insert_sheet_index = インデックス番号」を追加すれば指定した場所にコピーすることができます。

先ほど作成した「socond worksheet」は一度削除して、今度は一番右(インデックスは「2」)に先ほどと同じようにコピーしてみましょう。

 

今度は一番右に作成されましたね。

second_worksheet2

 

 

最後に、上記のコードを少し手直ししてみましょう。修正する箇所は下記2つです。

「シートID」の取得
「インデックス番号」の指定

 

①「シートID」については、毎回「シートID」を出力して確認するのは手間です。なので、「ws1.id」としてあげれば毎回出力して確認する手間はなくなります。

②「インデックス番号」については、毎回「一番右」のシートのインデックスが何番目か確認するのは手間です。なので、「要素数」つまり「len(wb.worksheets())」とすれば毎回「一番右」にコピーされることになります。
※ 「wb.worksheets()」はすべてのシートを「リストで取得」するメソッドです。使い方は後ほど説明します。

 

 

では、先ほど作成した「socond worksheet」は一度削除して、修正したコードで再度実行してみましょう。先ほどと同じ結果になったと思います。

 

 

ワークシートを「すべて取得」する

先ほどまで作成したワークシート3つを「すべて取得」してみましょう。「wb.worksheets()」で簡単に「リスト」ですべて取得できます。

 

3つのシートを取得できました。「id」も同時に取得できています。

worksheets

 

 

ワークシートを「削除」する

最後に、ワークシートの削除方法を見ていきましょう。
次のように「del_worksheet()」の引数に削除したいワークシートオブジェクトを入れるだけで「削除」することができます。
では、3つ目のシート「second worksheet」を削除してみましょう。

 

3つ目のシート「second worksheet」が削除され、2つのシートになりましたね。

del_worksheet

 

 

ワークシートの操作については以上となります。

 

 

終わりに

以上、「gspread」で「Google スプレッドシート」のワークブック、ワークシートを操作する方法についてお伝えしました。

操作したいワークブックとワークシートを取得(指定)することができれば、次に「セル」に対して値を取得したり入力したりと処理を行うことができます。「セル」の操作方法は次回お伝えしたいと思います。

また、「gspread」の「公式サイト」もあるので、何か処理したいことがあればそちらも参考にしてみてください。

 

以上となります。最後まで読んでいただきありがとうございました!