【Python】スプレッドシートを読み書きする方法を解説!事務効率化にも役立つ!¶
- URL: https://www.youtube.com/watch?v=KkDt3GMS00k
- 文字起こし日: 2026-02-24 02:41
内容概要¶
- Pythonでスプレッドシートを読み書きする方法を解説。
- スプレッドシートとは、Googleが提供している表計算ソフトのこと。Excelと同じような機能を提供。
- Pythonからスプレッドシートを操作する方法はいくつかある。
- GoogleのアカウントとGoogle Cloudのアカウントを作成する必要がある。
- Pythonからスプレッドシートを操作するためのライブラリ、「gspread」をインストールする。
- サービスアカウントを使って認証情報を設定する。
- gspreadライブラリを使って、スプレッドシートの作成、読み込み、書き込み、シートの追加、削除、書式設定を行う。
- Pandasライブラリを使うと、データフレームとしてスプレッドシートのデータを扱うことができる。
文字起こし¶
こんにちは。 Python VTuber のサプーです。今回は Python でスプレッドシートを読み書きする方法について解説したいと思います。事務効率化にも役立つ技術なので、ぜひ最後まで見てみてください。このチャンネルは Python に関する情報を発信してるので、よければチャンネル登録よろしくお願いいたします。またメンバーシップ会員しか見れない動画、ライブもあるので、よければメンバーシップのご検討もよろしくお願いいたします。
まずスプレッドシートについて簡単に解説します。スプレッドシートと は、Google が提供している表計算ソフトのことで、Excel と同じような機能を提供しています。 Google のアカウントがあれば誰でも Google ドライブ上にスプレッドシートを作成して、データを入力して編集することができます。実際に仕事でスプレッドシートを使ってる人も多いのではないでしょうか。 Python からスプレッドシートを操作する方法はいくつかあって、例えば最近だとコラボからもスプレッドシートを簡単に扱えるようになりました。ただこの動画では Python スクリプトからスプレッドシートを操作する方法を解説します。スクリプトから操作する理由は、スクリプトから扱えた方が他のサービスと組み合わせる時に便利だからですね。今後このスプレッドシートと他のサービスを連携する動画もアップする予定なので、楽しみにしていてください。では実際にどうやって Python からスプレッドシートを操作するか解説していきますね。まず Google のアカウントと Google Cloud のアカウントを作成する必要があります。 Google アカウントというページの右上にアカウントを作成するというボタンがあるので、それを押して作成してください。このページの URL は概要欄に貼っておきますね。そして Google Cloud のアカウントの作成は Google Cloud のトップページの右上の無料で利用開始というボタンを押して作成をします。こちらも URL を概要欄に貼っておきますね。 Google Cloud のアカウント作成時にクレジットカードの登録をする画面がありますが、勝手に課金されることはないので安心してください。課金される場合は必ず Google から料金がかかることが表示されます。 Google Cloud のアカウントを作成したらそのアカウントでログインしてください。ログインしていると Google Cloud のトップページの右上にコンソールというリンクがあるので、そこをクリックして Google Cloud のコンソール画面を開いてください。こんな画面です。では今回用に1つプロジェクトを作っておきます。左上のプロジェクトを選択するボタンをクリックしてこんなポップアップが出てきたら右上の新しいプロジェクトというボタンをクリックしてください。ここでプロジェクト名 を何か適当に決めて作成ボタンを押してください。今回はスプレッドシートテストという名前にしておきます。
プロジェクトを作ったらまた左上のプロジェクト選択のボタンをクリックしてさっき作ったスプレッドシートテストというプロジェクトをクリックしてプロジェクトを切り替えます。切り替えたら左上のメニューボタンからAPIとサービスの有効なAPIとサービスというところをクリックしてください。こんな画面が表示されるので、上にある API とサービスを有効にするというボタンをクリックします。で、こんな画面が表示されるので、この検索バーにシートという単語を入力して検索するとこんな風に Google Sheets API という API が表示されるので、これをクリックします。そしてこの有効にするというボタンを押してこの API を有効にしましょう。で、API サービスの詳細の左側にある戻るボタンを押して、また API とサービスを有効にするというボタンを押します。で、今度は検索 バーでドライブと入力して検索すると、Google Drive API という API が見つかるので、これをクリックしてこちらも有効にするボタンを押します。
次に認証情報の設定をしていくのですが、やり方が大数を使うやり方とサービスアカウントを使うやり方があります。冒頭でも話した通り、後々他のサービスと連携することを見据えて、ここではサービスアカウントを使って認証情報を設定していきますね。まず左側の鍵マークの認証情報というの をクリックします。そして上にある認証情報を作成という部分をクリックして、サービスアカウントという部分をクリックしてください。で、このような画面が表示されるので、サービスアカウント名 とIDを何か入力します。今回はサービスアカウント名 もサービスアカウント ID もスプレッドシートユーザーという名前にしておきます。そして作成して続行を押してロールの選択のところを基本の編集者に設定しておきます。で、また続行を押してユーザーにこのサービスアカウントへのアクセスを許可というところは何 も入力せずに1番最後の完了ボタンを押します。そうするとこんな画面が表示されるのですが、下の方にあるサービスアカウントという欄にさっき作ったスプレッドシートユーザーが表示されるので、ここの部分をクリックするとこんな画面が表示されます。このキーという部分をクリックして 鍵を追加というところを押して新しい鍵を作成という部分をクリックします。キーのタイプを JSON にして作成を押してください。そうすると勝手に JSON ファイルがダウンロードされるはずです。ダウンロードされた JSON ファイルはこの後使います。これで Google Cloud 側の設定は終了です。この JSON ファイルは他の人が触れないような場所に移動するのですが、今回は分かりやすいようにこれから作る Python スクリプトを入れておくフォルダー、ソースフォルダーに JSON ファイルを入れておきます。で、この JSON ファイルの名前が長いのでスプレッドシートテスト.jsonという名前に変更しておきます。次に Python からスプレッドシートを操作するためのライブラリー gspread をインストールします。コマンドラインツールを開いて pip install gspread というコマンドを実行してインストールしてください。また動画の後半の方で使う gspread formatting というライブラリーもインストールしておきます。 pip install gspread formatting このようなコマンドを実行してください。
次に Google ドライブ を開いてください。 Google ドライブ の中にテストというフォルダーを作っておけました。そしてこのフォルダーはこんな感じで今何もありません。ここにスプレッドシートのファイルを作っていきたいのですが、このフォルダーの ID をあらかじめ調べておきます。フォルダー ID はフォルダーにアクセスしている時のこの Google Drive の URL の 1 番後ろの部分、この部分になります。これをどこかに控えておいてください。そして先ほどダウンロードした JSON ファイルを開いてクライアントEメール の Value にあたるメールアドレスの部分をコピーしておいてください。で、この Google Drive 上のテストというフォルダーの名前の右側のこれをクリックして共有、共有をクリックしてここに先ほどコピーしたアドレスを追加します。ロールは編集者で共有を押してください。これでさっき作ったサービスアカウントのスプレッドシートユーザーの認証情報を持っていればこのフォルダーにアクセスしてスプレッドシートを新規作成したり、既存のスプレッドシートを操作することができます。では実際に Python からスプレッドシートを操作していきたいと思います。ここで少しだけ書籍の PR をさせてください。この度 VTuber サプーが教える Python 初心者のコード プロのコードという書籍が出版されました。もしもまだチェックしてない人がいたら概要欄に書籍のリンクを貼っておくので、ぜひチェックしてみてください。
では実際に Python からスプレッドシートを操作していきたいと思います。 Python スクリプトのファイルをさっきダウンロードした JSON ファイルと同じフォルダーに作っておいてこれを編集していきます。 import Gスプレッドで Gスプレッドのライブラリーをインポートしてで Gスプレッドのサービスアカウントという関数を呼び出して認証を行い、その戻り値を GC という変数に代入します。この時サービスアカウントの引数ファイルネームに先ほどのJSONファイルのパスを指定します。なので今回だとこのように書きます。この戻り値はスプレッドシートを扱うためのクライアントオブジェクトです。このクライアントオブジェクトを通じてスプレッドシートを操作していきます。新しいスプレッドシートを作るにはクライアントオブジェクトのクリエイトというメソッドを呼び出します。第1引数に新しいスプレッドシートのファイル名を指定します。今回はテスト 1 という名前にします。そしてフォルダーIDという引数に対してスプレッドシートを作成する先のフォルダーIDを指定します。先ほどテストというフォルダーを作成した際に控えておいたフォルダーIDを指定しておきます。そしてクリエイトメソッドの戻り値は新しく作られるスプレッドシートオブジェクトになっています。スプレッドシートのファイル1つを表したオブジェクトというイメージです。このスプレッドシートオブジェクトをSHという変数に代入しておきます。そしてこのスプレッドシートオブジェクトの get work seat というメソッドを呼び出しましょう。引数に0という数値を指定するとそのスプレッドシートのインデックスが 0 、つまり 1 つ目のシートを表したシートオブジェクトが取得できます。これを WS 、ワークシートという意味の変数に代入しておきます。このシートオブジェクトを使って実際にデータを入力したり変更したり削除していきます。では 2 つデータを入力してみます。シートオブジェクトのアップデートセルというメソッドを呼び出して、第 1 引数にセルの位置を文字列で指定して、第 2 引数に 入力したい値を指定します。例えば A 1 のセルに 2024 という数値を入力して A 2 のセルにこんにちはサプーですというデータを入力したかったらこのように書きます。ではこれを動かしてみましょう。これを実行してみると処理が完了して Google Drive の方を見てみるとこんな感じでテスト 1 というスプレッドシートが作られています。これを開いてみると確かに A の 1 に 2024 A の 2 にこんにちはサプーですと入力されていますね。どうでしょう。準備はちょっと必要ですが Python のコードはそんなに難しくないですよね。
ではもう少し広い範囲に対してデータを入力していきましょう。今度は先ほど作成したスプレッドシートを読み込んでそのスプレッドシートに対してデータを入力してみます。先ほどのコードのクライアントオブジェクトを作成するところまでは全く同じです。既存のスプレッドシートを読み込む時はクライアントオブジェクトのオープンメソッドを呼び出します。第1引数にファイル名を指定して、フォルダーIDという引数にフォルダーIDを指定します。これでさっき作ったスプレッドシートのオブジェクトが取得できるので、また先ほどと同じようにシートオブジェクトを取得するのですが、先ほどはインデックスを指定しましたが、今度はシート名を指定してシートオブジェクトを取得してみたいと思います。スプレッドシートのオブジェクトのワークシートのメソッドの引数にシート名今回だとシート 1 を指定してワークシートメソッドを呼び出します。これでシートオブジェクトがWSという変数に代入されます。次に広い範囲でデータを入力してみたいと思います。1列目に上から順番に1から100までの数値、2列目には上から順番に101から200までの数値を入力するケースを考えています。今回はアップデートというメソッドを使います。アップデートはレンジネームにセルの範囲を文字列で指定して、バリューという引数に 入力したい値を多重リストで指定して呼び出します。多重リストの指定方法ですが、言葉で説明すると難しいのでこのような多重リストがこのようなセルへの入力に対応します。で、まず多重リストを作っておきましょう。リスト内表記法を使うとこんな風に多重リストは作れます。1と101というリストを2と102というリストを3と103というリストを要素に持つリストが作れます。これをナンバースという変数に代入しておきます。そしてシートオブジェクトのアップデートのレンジネームに A 1 コロン B 100 バリューという引数にナンバーズを指定してアップデートを呼び出します。これで1列目に1から100までの数値、2列目に101から200までの数値が入力されるはずです。これを実行してみるとスクリプトが終了してスプレッドシートを開いてみてみるとこんな風に A には 1 から 100 B は 101 から 200 の数字が入力されています。ちなみにパンダスが使える人はパンダスのデータフレームのデータをその ままスプレッドシートに書き込むことができるのでこちらを使った方が便利 かもしれません。パンダスについては以前に動画を出してるのでよければ参考にしてみてください。パンダスを使う場合は pip install パンダスでパンダスをインストールしておいてソースコードの方に import パンダスア PDとインポート文を書いておきましょう。シートを取得するところまでは先ほどと同じでここでシートのクリアというメソッドを呼び出します。これでシートのデータが全て削除されます。そして名前というカラムに斉藤、田中、山田。年齢というカラムに352056というデータが入っているデータフレームを用意しておき、DFという変数に代入しておきます。データフレームとして表示した場合はこんなデータフレームになります。そして先ほどと同じようにシートオブジェクトのアップデートメソッドを呼び出そうと思うんですが、引数には DF のカラムズのバリューのトゥーリストを呼び出したリストとDFのバリューのトゥーリストを結合したものを指定してください。なんだこれって思うかもしれないんですが、前半がカラムを多重リストにしたもので後半が各行のデータを多重リストにしたものです。そしてこれを実行してみるとスクリプトが正常に終了してスプレッドシートを開いてみてみると確かにデータフレームの形がそのままでデータが入力されていますね。
今度はスプレッドシートのデータを読み込む方法を説明します。今このデータが入力されているこのスプレッドシートを対象にデータを読み込んでみましょう。こちらもシートオブジェクトを取得するところまでは全く同じです。まず1つだけのデータを取得するにはシートオブジェクトのアセルというメソッドを呼び出します。引数にセルを文字列で指定して呼び出してそのバリューを取得します。なのでセル A 1 のデータを取得して表示するにはこのように書きます。これだけでまず実行してみましょう。そうすると A 1 の値、名前が取得できましたね。次にどこかの 1 行、もしくはどこかの1列を指定してそのデータをリストとして取得してみます。ある 1 行のデータを全て取得するにはシートオブジェクトのローバリューというメソッドを使って引数に行番号を指定します。なので2行目のデータを全て取得するにはこのように書きます。ある 1 列のデータを全て取得するにはシートオブジェクトのコルバリューというメソッドを使って引数に列番号を指定します。なので 2 列目のデータを全て取得するにはこのように書きます。最後に両方のデータをプリントで表示させてみましょう。これを実行してみると2 行目のデータと2列目のデータがリストで取得されたのが分かりますね。全てのデータを取得するにはシートオブジェクトのゲットオールバリューというメソッドを呼び出します。戻り値をオールバリューという変数に代入してプリント文で表示してみましょう。これを実行してみると多重リストで全てのデータが取得できました。また書き込みの時と同様にパンダスのデータフレームとしてデータを取得することもできます。シートオブジェクトそのゲットオールレコードズメソッドを呼び出して、それをデータフレームオブジェクトを作る時の引数にそのまま指定します。そうするとデータをデータフレームとして格納することができます。これ をプリント文で表示してみるこんなコードを作ってこれを動かしてみると 確かに全てのデータがデータフレームとして取得できましたね。パンダスに慣れてる人はデータの入力も取得もデータフレームで扱うのが楽そうですね。ただパンダスに慣れていない人も多いと思ったのでこの動画ではリスト多重リストで扱う方法についても解説してみました。あとシートの追加はスプレッドシートオブジェクトのアドワークシートメソッドを呼び出します。引数タイトルにシート名、引数ローズに行数、引数コルズに列数を指定してください。例えばテスト 1 というスプレッドシートに 行が 100 で列が 20 のあえ お っていう名前のシートを追加しようと思ったら、このように書きます。戻り値はその時新しく作ったシートのオブジェクトです。これを実行してみると正常にスクリプトが終了してテスト 1 のスプレッドシートを開いてみてみると確かにあえ お っていうシートができていますね。そして今度はこのあえ お っていうシートを削除してみます。削除するにはスプレッドシートオブジェクトから対象のシートオブジェクトを取得します。あえ をっていうシートを取得するにはワークシートメソッドを呼び出して引数にあえを と指定します。で、スプレッドシートオブジェクトのデルワークシートメソッドを呼び出します。引数に対象のシートオブジェクトを指定します。これで先ほど作ったあえお というシートが削除されるはずです。これを実行してみると正常にスクリプトが終了して、テスト1のスプレッドシートを見てみるとあえお のシートが削除されたのが分かりますね。
最後にセルの書式設定を変更する方法を説明します。例えばこのスプレッドシートの A 1 と B の 1 の文字を太文字にしたいと思ったら シートオブジェクトを取得してそのシートオブジェクトのフォーマットメソッドを呼び出して第1引数に書式設定を変更したいセルの範囲を文字列で指定して第2引数に辞書を指定します。この辞書のキーをテキストフォーマットマリューがキーがボールドでマリューがツルーの辞書を指定します。これでOKです。これを実行してみるとスクリプトが正常に終了してテスト 1 を見てみると A の 1 と B の 1 が太文字になってるのが分かりますね。これ以外にも書式の設定の仕方をいくつか解説します。フォントのサイズを変更したい場合はテキストフォーマットのバリューの部分にキーがフォントサイズバリューにフォントのサイズの数値が指定されている辞書の要素を追加します。今回はフォントを15と多めにしてみました。さらに中央揃えにしたい場合はフォントメソッドの第2引数に指定する辞書にキーがホリゾンタルアライメントマリューがセンターという要素を追加します。左寄せに左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に左に