(画像あり)コピペで使える、PythonでGoogleスプレッドシートへ色をつけて書き込む

#書き込み後の画像
下記のように書き込まれます
コードのサンプルは
![スクリーンショット 2021-07-20 22.02.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1130166/28b460f1-a68d-2f99-e7e0-86375658ac17.png)


#自己紹介
普段私は、
一番得意な機械学習(深層学習)をしたり、
Python/Django でWebアプリを開発したり、
TypeScript/Vue or React でフロントエンドの開発をしたり、
PHP/Laravel でWebアプリを開発したり、
さまざまなことを行っています。

趣味で休みの日にGo言語で色々作成しているのですが、型のある世界は素敵だなと昨今感じています。
今最もやりたいことは、Goで大規模なWebアプリケーションを作成したい。

企業案件やご連絡等ございましたらお気軽に下記よりご連絡いただければと思います。
kohei0801nagamatsu@gmail.com

#Googleスプレッドシートに書き込む超便利なクラスを作成した

##ライブラリのInstall
下記がrequirements.txtの中身になります。

```text
gspread==3.7.0
gspread-dataframe==3.2.1
gspread-formatting==1.0.3
oauth2client==4.1.3
pandas==1.3.0
```
実際に下記のコマンドでinstallできるので実行していってください。

```shell
$ echo gspread==3.7.0"\n"gspread-dataframe==3.2.1"\n"gspread-formatting==1.0.3"\n"oauth2client==4.1.3"\n"pandas==1.3.0 >> requirements.txt
$ pip install -r requirements.txt
```

#先に使い方！！
コードを全文をspread_tranceform.pyで保存していたとする。

```python
# インスタンスの生成
from spread_tranceform import SpreadSheetManipulate

"""
色々と処理をする。
スクレイピングなり、なんでも良い。
"""

ss = SpreadSheetManipulate(
    "スプレッドシートID",
    "service-account.jsonのパス"
)

# 書き込みたい2次元配列
array2D = [
   ["会社名", "従業員数", "電話番号", "メールアドレス", "HP"],
   ["株式会社A社", "234名", "09000000000", "kabusikigaisya-a@a.com", "https://a.com/"],
   ["株式会社B社", "65名", "09011111111", "kabusikigaisya-b@b.com", "https://b.com/"],
   ["株式会社C社", "769名", "09022222222", "kabusikigaisya-c@c.com", "https://c.com/"]
]

# シート名
sheet_name = "会社情報"

# 2次元配列の書き込み
ss.write_shape_of_array2D_to_spreadsheet(
    sheet_name, array2D
)
```

これで終わりです！！

**実際に下記写真のように書き込まれます。**
![スクリーンショット 2021-07-20 22.02.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1130166/c260c82b-6c8f-8685-460e-d994569660f0.png)





#コードを全文！
本来は3ファイルにそれぞれ分割していたが分けるのがめんどくさかったため1つにまとめた笑
許してください、、、
メソッドにコメント載せてるので深く知りたい人はリーディングしてください

コピーして使用できます。
file名を下記にしてコードを貼り付けて保存する。
**spread_tranceform.py**

```python
from gspread_dataframe import set_with_dataframe
from oauth2client.service_account import ServiceAccountCredentials
import gspread
from gspread_formatting import *
import pandas as pd


class ChangeAlphabet():
    def toAlpha(self, num: int) -> str:
        """数字からスプレッドシート用のアルファベットに変換

        Args:
            num (int): アルファベットへ変換したい数字

        Returns:
            str: アルファベット
        """
        if num <= 26:
            return chr(64 + num)
        elif num % 26 == 0:
            return self.toAlpha(num // 26 - 1) + chr(90)
        else:
            return self.toAlpha(num // 26) + chr(64 + num % 26)

    def toNumber(self, alphabet: str) -> int:
        """アルファベットから数字へ変換

        Args:
            alphabet (str): 数字に変換したいアルファベット

        Returns:
            int: 数字
        """
        num = 0
        for index, item in enumerate(list(alphabet)):
            num += pow(26, len(alphabet) - index - 1) * \
                (ord(item) - ord('A') + 1)
        return num


class SpreadBase(ChangeAlphabet):
    def __init__(self, spreadsheet_id: str, json_name: str):
        """スプレッドシートのオブジェクトを取得する."""
        SCOPES = [
            'https://spreadsheets.google.com/feeds',
            'https://www.googleapis.com/auth/drive'
        ]
        credentials = ServiceAccountCredentials.from_json_keyfile_name(
            json_name, SCOPES)
        gc = gspread.authorize(credentials)

        self.workbook = gc.open_by_key(spreadsheet_id)

    def background_color(self, wide_length: int, worksheet_name: str):
        """ワークシートの背景を変える

        Args:
            wide_length (int): 何列まで変えるか指定するための長さ
            worksheet_name (str): 変更するシート名
        """
        alphabet = self.toAlpha(wide_length)
        fmt = cellFormat(
            backgroundColor=color(1, 0.9, 0.9),
            horizontalAlignment='CENTER'
        )
        range_ = 'A1:{}1'.format(alphabet)

        format_cell_range(
            worksheet_name,
            range_,
            fmt
        )

    def pd_change(self, dict_type: dict):
        """辞書からデータフレームを作成する

        Args:
            dict_type (dict): dataframeに変換したい辞書

        Returns:
            [type]: データフレーム
        """
        d2 = {}
        for k, v in dict_type.items():   # 一度pd.Seriesに変換
            d2[k] = pd.Series(v)
        df = pd.DataFrame(d2)
        # df.to_csv("オスオス.csv")
        return df


class SpreadSheetManipulate(SpreadBase):
    def __init__(self, spreadsheet_id: str, json_name: str):
        super().__init__(spreadsheet_id, json_name)

    def write_shape_of_array2D_to_spreadsheet(
        self,
        worksheet_name: str,
        array2D: list,
        background_color: bool = True
    ) -> None:
        """
        2次元配列をスプレッドシートに書き込むメソッド
        カラムの部分をピンク色にするだけでなく、
        シート名を引数に渡すことで、spreadsheet(WorkBook)に存在しないシート名だった場合
        新規にシートを作成して、そこに書き込む

        Args:
            worksheet_name (str): 書き込みたいシート名(既存でも新規でも良い)
            array2D (list): 書き込む値の入った2次元配列 => [[a,b,c],[1,2,3]]
            background_color (bool, optional): カラムに色をつけるかどうか. Defaults to True.
        """
        # * 追加する項目の横の長さ
        width: int = len(array2D[0])
        # * 追加する項目の縦の長さ
        height: int = len(array2D)
        try:
            self.workbook.add_worksheet(
                title=worksheet_name, rows=height, cols=width)
            print("追加")
        except BaseException:
            pass

        update_ws = self.workbook.worksheet(worksheet_name)

        # * Spreadsheetの背景の色を変える
        if background_color:
            self.background_color(width, update_ws)

        # * 行列の作成
        cell_list = update_ws.get_all_values()
        # * 行の数
        columns = len(cell_list) + 1

        ranges = '{0}!A{1}'.format(worksheet_name, columns)
        # * print(ranges)
        self.workbook.values_update(
            ranges,
            params={'valueInputOption': 'USER_ENTERED'},
            body={'values': array2D}
        )

    def write_dataflame_to_spreadsheets(
        self,
        type_dict: dict,
        worksheet_name: str,
        background_color: bool = True
    ) -> None:
        """
        辞書型をスプレッドシートに書き込むメソッド
        カラムの部分をピンク色にするだけでなく、
        シート名を引数に渡すことで、spreadsheet(WorkBook)に存在しないシート名だった場合
        新規にシートを作成して、そこに書き込む

        Args:
            type_dict (dict): 書き込む値の入った辞書型
            worksheet_name (str): 書き込みたいシート名(既存でも新規でも良い)
            background_color (bool, optional): カラムに色をつけるかどうか. Defaults to True.
        """
        dataframe = self.pd_change(type_dict)
        # * dataframeの長さ取得(行, 列) -> (縦, 横)
        shape = dataframe.shape()
        try:
            self.workbook.add_worksheet(
                title=worksheet_name, rows=shape[0], cols=shape[1])
        except BaseException:
            pass

        update_ws = self.workbook.worksheet(worksheet_name)
        # * Spreadsheetの背景の色を変える
        if background_color:
            self.backGroundColor(shape[1], update_ws)

        # * 作ったDataFrameを貼り付ける。
        set_with_dataframe(
            update_ws,
            dataframe,
            resize=False,
            include_index=True
        )

```