LoginSignup
1
0

More than 1 year has passed since last update.

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

Posted at

スクレイピングの失敗結果を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を使う

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
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0