雨のち晴れ

北海道在住。緑色のハムスターだハム

pythonの勉強-google spread sheet内のデータ操作

作成したプログラム

pythonのプログラムを通してgoogle spread sheetのデータを操作するプログラム。
使用したライブラリはgspread。

今回はWindowsのイベントビューアーのWindowsログをCSV形式で保存したものをgoogle spread sheetで読み込み保存。google spread sheet内に保存したWindowsログのデータの中で欲しいイベントIDのデータを抽出し別のシートに書き込むプログラムを作成した。



具体的な動作

WindowsログのデータのイベントIDとそのイベントの発生した時刻を読み込む。

抽出したいイベントIDを設定しWindowsログから抽出する。

書き込み用のシートに抽出したWindowsログを書き込む。

google spread sheet ワークブックの構成

google spread sheetのワークブックに3つのシートを予め作成しておく。

各シートの役割は

①操作する元のデータのあるシート(シート名:log)

Windows10の場合

アプリ

Windows管理ツール

イベントビューアー

Windowsログ

システムを選択

全てのイベントを名前をつけて保存(CSV形式)

保存したものをgoogle spread sheetで読み込み保存しておく。

f:id:morisoba_delo02:20161231163856p:plain

②データを操作し書き込むシート(シート名:write)
最初はまっさらなシート。
プログラムを実行すると画像のように抽出したイベントIDと時刻が書き込まれる。
今回の場合は7001(Windowsの起動)と7002(シャットダウン)を抽出。
f:id:morisoba_delo02:20161231163938p:plain

③書き込むデータの条件を設定するシート(シート名:arg)

B列に抽出したいイベントIDを記述しておく。
f:id:morisoba_delo02:20161231163944p:plain

ソースコード

# -*- coding: utf-8 -*-

import sys
import gspread
from oauth2client.service_account import ServiceAccountCredentials
import datetime

#認証
scope = ["https://spreadsheets.google.com/feeds"]
credentials = ServiceAccountCredentials.from_json_keyfile_name("J-sonファイルの名前", scope)

gc = gspread.authorize(credentials)
wb = gc.open('windows_log') #書き込むワークブック
wks_read = wb.worksheet('log') #元のwindows_logデータのあるシート
wks_write =  wb.worksheet('write') #取得したいwindows_logデータを書きこむシート
wks_arg = wb.worksheet('arg') #取得したいevent_idを記載するシート
get_event_id = wks_arg.col_values(2) #取得したいevent_idを記載するシートからevent_idを取得
time_log = wks_read.col_values(2) #元のwindows_logデータのあるシートから時間のデータを取得

#logデータの行数を数える
def count_log_col(col,time_log):
    for i in time_log:
        if i == '':
            break
        col+= 1
    return col-1
    
#取得したいevent_idの行数を数える
def count_event_col(col2,get_event_id):
    for i in get_event_id:
        if i == '':
            break
        col2+= 1
    return col2-1

#各event_idの時間ログの取得    
def make_log_list(i, j, col):
    event_time_log = []
    event_id_log = wks_read.col_values(4)
    while j <= col:
        if event_id_log[j] == get_event_id[i]:
            event_time_log.append(time_log[j])
        j+=1
    return (event_time_log, get_event_id)

#google_spread_sheetにログの書き込み      
def write_log(i, j, event_time_log):
    for e_t_l in event_time_log:
        wks_write.update_cell(i,j,event_time_log[i-2])
        i+=1

#google_spread_sheetの1列目に取得したevent_idの書き込み
def write_event_id(i,j,get_event_id):
    for event_id in get_event_id:
        if get_event_id[j].isdigit() == True:
            wks_write.update_cell(i,j,int(get_event_id[j]))
            j+=1
        
#各関数を実行しwindows_logを取得しgoogle_spread_sheetに書き込み 
def get_win_log_sys(i,j):
    win_log =[]
    col = count_log_col(0,time_log)
    col2 = count_event_col(0,get_event_id)
    while i<=col2:
        win_log, g_e_i = make_log_list(i,1,col)
        write_log(2,j,win_log)
        write_event_id(1,j,g_e_i)
        i+=1    
        j+=1
        del win_log[:] 

get_win_log_sys(1,1)

感想

自分的には結構苦労して作った感があったけど、実際の動作はかなりチープなものができた印象(わざわざプログラムで書くまでもなかったかな…)。
反省点はgspread内の行数を数えるための関数col_countのがうまく動作しなかったため、logデータと取得したいevent_idの行数のカウントをfor文で代用したところと、自分で命名した変数名、関数名がわかりずらいの2点。