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
この記事が気に入ったらサポートをしてみませんか?