SheetsAPI Python スプレッドシートに色をつける

スクレイピングの失敗結果をCSVファイルに出力していたのですが。
使う人いわく
「CSVよりもスプレッドシートがいい」
↓
それならばと SheetsAPI+Pythonでスプレッドシートにログを出力したのですが、
使う人いわく「ログが黒くて見る気しない。どれが重要かわからない」(全部重要なログなのですが)
↓
じゃスプレッドシートに色を付けてログ出力ようとしたのですが、
SheetsAPI+PHPばかりが検索結果で困ったのでSheetsAPI+Pythonをメモ

# 前提条件
・SheetsAPIを使う各種手続きは済んでいる
[参考：SheetsAPI](https://developers.google.com/sheets/api)
[参考 : Google Apps Scriptの関数をPythonから起動する](https://qiita.com/apple123/items/631a8dc1a7a9aa57ee02)
・Windows
・Python3.9
・クライアントシークレットjsonファイルやトークンファイルはカレントフォルダにある

# 前もって必要な情報
・スプレッドシートIDとシート名
[参考:スプレッドシートIDとシートIDの確認方法](https://blog-and-destroy.com/33158)
・RGBカラーコード
[参考:SheesAPIのColorオブジェクトカラーコードは0から1の間の数値で表す](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/other#Color)

# 結論：batchUpdateを使う
[batchUpdate参考](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/request#RepeatCellRequest)


# SheetsAPI Python スプレッドシートに色をつけるコード

```python:

#JSONファイルも、トークンファイルも、カレントフォルダにあるものとする
JSONFILE="client_secret_1234561-l2bs.apps.googleusercontent.com.json"               
SCOPES=['https://www.googleapis.com/auth/drive','https://www.googleapis.com/auth/spreadsheets']  
SPREADSHEET_ID="aaaaa44444T53aUtRavu_KJ23423M12rHoI_eert4565679w0"　　#スプレッドシートID
SHEETNAME="メニュー"  #シート名


def chengespredrangecolor(servise,SPREADSHEET_ID,SHEET_ID,row,col,red,green,blue):        
        """
        serviceをもとにスプレッドシートのセルの色を変える
        1セルのみ　引数を変更すれば複数もOKのはず
        Args: 
           service(obj):SheetAPIの認証が済んだオブジェクト
            SPREADSHEET_ID(string):スプレッドシートのID
            SHEET_ID(string):スプレッドシートのシートID
            row(int):行（0から開始) 
            col(int) :列（0から開始) 
            red(int)  :赤の色 0から1以下の数 
            blue(int):青の色 0から1以下の数
            green(int):緑いろ 0から1以下の数        
        Returns
            エラーが発生しなかった okの文字列 エラーが発生した errorの文字列

        """        
        requests= [
        {
        "repeatCell": {
            "range": {
            "sheetId": SHEET_ID,
            "startRowIndex": row,
            "startColumnIndex": col,
            "endRowIndex": row+1,　  #複数行色を付けたいときはここを調節　
            "endColumnIndex": col+1　#複数列色をつけたいときはここを調節
            },
            "cell": {
            "userEnteredFormat": {                
                "backgroundColorStyle": {
                "rgbColor": {
                    "red": red,
                    "green": green,
                    "blue": blue
                    
                }
                }
            }
            },
            "fields": "userEnteredFormat(backgroundColorStyle)"
        }
        }
    ]
        try:
            body = { 'requests': requests }
            response = service.spreadsheets().batchUpdate(spreadsheetId=SPREADSHEET_ID, body=body).execute()        
            return "ok"
        except:
            return "error"

def getspredsheetId(service,SPREADSHEET_ID,sheetname):
        """
        serviceをもとにシートIDを取得する
        Args:
            service(obj):SHEETAPIの認証をしたオブジェクト
            SPREADSHEET_ID(string):スプレッドシートファイルのID
            sheetname(string):このシート名のシートIDを取得します。           
        Returns
            シートID シートIDを取得できなかった場合 errorの文字列

        """  
       
        sheet = service.spreadsheets()        
        result = sheet.get(spreadsheetId=SPREADSHEET_ID).execute()
        for she in result["sheets"]:
            if she['properties']['title']==sheetname:
                return she['properties']['sheetId']
                
        return "error"


#クライアントシークレットjsonファイルのフォルダ名
jsonfull = os.path.join(os.path.dirname(sys.argv[0]), JSONFILE)
tokenpath = os.path.join(os.path.dirname(sys.argv[0]), "token.json")
creds = None
# The file token.json stores the user's access and refresh tokens, and is
# created automatically when the authorization flow completes for the first
# time.
if os.path.exists(tokenpath):
  creds = Credentials.from_authorized_user_file(tokenpath, SCOPES)
    
if not creds or not creds.valid:
  if creds and creds.expired and creds.refresh_token:
    creds.refresh(Request())
  else:
    flow = InstalledAppFlow.from_client_secrets_file(jsonfull, SCOPES)
    creds = flow.run_local_server(port=0)
    # Save the credentials for the next run
    with open(tokenpath, 'w') as token:
      token.write(creds.to_json())

service = build('sheets', 'v4', credentials=creds)

###スプレッドシートのファイルのIDとシート名からスプレッドシートのIDを取得する
sheetid=getspredsheetId(service,SPREADSHEET_ID,SHEETNAME)

###sheetidを元にスプレッドシートの色を変える
##下の例はA5セルを赤にしてます
#他の色がよい場合はこのページ下部分の色見本を参考に
chengespredrangecolor(SPREADSHEET_ID,sheetid,6,0,1,0,0)

```

# 色
上の関数はRGB形式で色を指定しています。
WEBのRGB形式は0から255ですが、
SheetsAPIのColorは0から1の数値を使います
例
WEBのRGB形式が128の場合
SheetsAPIで使う場合は
128/255*1=0.5
[参考：WEBカラーコード](https://note.cman.jp/color/create_color.cgi)


## 色の例

|色  |red,gren,blue(SheetsAPI)  | RGB形式 |
|---|---|---|
|<font color="red">赤色</font>|1,0,0  |255,0,0  |
|<font color="yellow">黄色</font>  |1,1,0  |255,255,0  |
|<font color="blue">青</font>  |0,0,1  |0,0,255  |
|<font color="green">緑</font>  |0,0.5,0  |0,128,0  |
|<font color="gray">灰色</font>  |0.5,0.5,0.5 |128,128,128  |