見出し画像

YMLをGoogleSpreadSheetに変換!

こんにちは。

本記事ではざっと最近私が作成したymlのコンバージョンプログラムを紹介します。

機能:dict型のデータがlist形式で格納されているymlファイルをdictのkeyをカラムとして、対応するvalueを順に書き込んでいく。

認証自体は、OAuth認証を使用していますが、ServiceCredentialを使用するやり方もあります。

本プログラムの特徴は、大きく二つです。

・pythonを扱ううえでデファクトスタンダードのpyyamlを使用せず、ruamel.yamlを使用しています。理由として、ユースケースとして考えられた対象YMLにYML1.1でbool型に解釈される文字列onが入っていたためで、1.2でloadするためruamel.yamlを用いた(cf https://yaml.org/type/bool.html)。1.2での対応としてpyyamlはongoingである。

・OAuth認証として、APIcall数が限られているので、呼び出す回数をいかなるファイルでも可能にするため、原則書き込むのは2回ですむ仕様になっています。

 #以下でspreadsheet上での操作
def GSpread_Operate(credential, obj, file): #SpreadSheetの認証
   gc = gspread.authorize(credential)
   title = []
   try: #ワークブックを開く 。該当ワークブックのIDをカッコに格納。mainfileというワークブックを取得。
       sh = gc.open_by_key(WORKBOOK_ID)
       worksheet_list = sh.worksheets() #対象fileがリストの中に同名のsheetがあるかないか確認 。titleにsheet名を入れて、そこにfileと同名があるか否か。
       for sheet in worksheet_list:
           title.append(sheet.title)    
   except:        
       sys.exit('Wrong WORKBOOK_ID or No such Workbook to the ID . Please verify the ID') #同名のファイル名があるケースと新規作成のケースを 、取得したタイトルに名前があるかないかでchekck。 #上書きのケースは既存のものより上書きするものがレコード数が少ないケースを考慮し 、空白の行・列がある場合は削除する仕様。
   if file in title:
       columns = Get_Column(obj)
       worksheet = sh.worksheet(file)
       worksheet.clear() 
       Write_Yml(credential, obj, file, columns, worksheet)
       if worksheet.col_count > len(columns):
           worksheet.delete_columns(len(columns) + 1, worksheet.col_count)  
       else:
           pass
       if worksheet.row_count > len(obj) + 1:
           worksheet.delete_rows(len(obj) + 2, worksheet.row_count)
       else:
           pass
   else: #以下該当のワークシートがなく新規作成のケース 。まず、シートを作成。
       columns = Get_Column(obj)
       worksheet = sh.add_worksheet(title= file, rows=len(obj)+1, cols=len(columns))
       Write_Yml(credential, obj, file, columns, worksheet)
 #sheetのcolumnの情報を取得する関数
def Get_Column(obj):
   columns = []
   for i in range(0, len(obj)):
       list_keys = list(obj[i].keys())
       for l in range(0, len(list_keys)):
           if list_keys[l] in columns:
               pass
           else:
               columns.append(list_keys[l])
   return columns
 #情報を書き出す関数
def Write_Yml(credential, obj, file, columns, worksheet):
   try: #カラムを書き込む
       worksheet.append_row(columns) #valuesを書き出して 、シートに書き込む。        
       values = []
       for i in range(0, len(obj)):
           value_units = [] 
           for x in columns:
               if x in obj[i].keys():
                   value_units.append(obj[i][x])
               else:
                   value_units.append(None)
           values.append(value_units)
       try:
           worksheet.append_rows(values, value_input_option='RAW', insert_data_option=None, table_range=None, include_values_in_response=False)
       except gspread.exceptions.APIError as e:    
           type_, value, _ = sys.exc_info()
           print(type_)
           print(value)
           sys.exit('There are some invalid values in the data to write in a worksheet. Thus, you cannot write them to a worksheet. Please refer to "Invalid values[(number)][(number)]" mentioned above, which means a position of the invalid values in the yml files. ')
   except Exception as e:
       type_, value, _ = sys.exc_info()
       print(type_)
       print(value)

以上はspreadsheet上の動きの関数部分。

詳細は以下githubのREADMEを参考に。ぜひ試してくれると嬉しいです。
https://github.com/Chimay-0426/YMLFileExportTool-for-GoogleSpreadSheet

                                                                                                 文責:SHIMMEI

この記事が気に入ったらサポートをしてみませんか?