スクレイピングの失敗結果をCSVファイルに出力していたのですが。
使う人いわく
「CSVよりもスプレッドシートがいい」
↓
それならばと SheetsAPI+Pythonでスプレッドシートにログを出力したのですが、
使う人いわく「ログが黒くて見る気しない。どれが重要かわからない」(全部重要なログなのですが)
↓
じゃスプレッドシートに色を付けてログ出力ようとしたのですが、
SheetsAPI+PHPばかりが検索結果で困ったのでSheetsAPI+Pythonをメモ
前提条件
・SheetsAPIを使う各種手続きは済んでいる
参考:SheetsAPI
参考 : Google Apps Scriptの関数をPythonから起動する
・Windows
・Python3.9
・クライアントシークレットjsonファイルやトークンファイルはカレントフォルダにある
前もって必要な情報
・スプレッドシートIDとシート名
参考:スプレッドシートIDとシートIDの確認方法
・RGBカラーコード
参考:SheesAPIのColorオブジェクトカラーコードは0から1の間の数値で表す
結論:batchUpdateを使う
SheetsAPI 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カラーコード
色の例
色 | red,gren,blue(SheetsAPI) | RGB形式 |
---|---|---|
赤色 | 1,0,0 | 255,0,0 |
黄色 | 1,1,0 | 255,255,0 |
青 | 0,0,1 | 0,0,255 |
緑 | 0,0.5,0 | 0,128,0 |
灰色 | 0.5,0.5,0.5 | 128,128,128 |