ruby 超入門を1週ざっと読んだので、練習がてら何か動くものを作りたい。
ちょうど月末だったので、勤務実績をエクセルに書く定型処理を自動化する。
七転八倒
"ruby excel"でぐぐって、以下のページなどを参考にrubyXLというgemを使おうと思った。
https://qiita.com/m-shin/items/fc6f551da921e00df54d
が、会社PCではgem installコマンドがうまく動かない。たぶんプロキシが動いてるか、ファイアウォールで邪魔されているか。。。
--localオプションも試してみたけど、20分くらい試してみてなんか上手くいかなかったし、gemをネット接続なしで入れるのは茨の道と各所で散見されたので、本筋でもないし諦めることに。
win32oleというライブラリが標準で使えるらしいし、サンプルコードを試したら動いたので採用することに。
やること:とりあえず動くものを作る。最初はハードコーディング上等。徐々に機能を増やす(ファイル自動で見つけてきたりだとか)。
やらないこと:綺麗にかく
実際にコード書き始めたら、if文、case文の書き方とか、eachメソッドの書き方とかすら頭に入ってなかったことが判明。
とりあえずエラーを出して何行目が間違っているか確認しながら進行中。
現状のコード
excel.rb
#! ruby -Ks
require 'win32ole'
def get_shift #シフト表から当月のシフトを取得
app = WIN32OLE.new('Excel.Application')
fso = WIN32OLE.new('Scripting.FileSystemObject') #pathで指定したいときはこの2行
book = app.Workbooks.Open(fso.GetAbsolutePathName('2018-12-Ver01.xlsx'))
#book = app.Workbooks.Open(app.GetOpenFilename)
#手動でファイルを指定するときはこれ
begin #メインの処理ここから
sheet = book.Worksheets('2018年11月シフト') #目標のシートをハードコーディング。。。
@shift = sheet.Range('C6:AG6').Value #目標セルをハードコーディング。。。
#メインの処理ここまで
ensure
book.Close
app.quit
end
end
def timecard
app = WIN32OLE.new('Excel.Application')
fso = WIN32OLE.new('Scripting.FileSystemObject')
book = app.Workbooks.Open(fso.GetAbsolutePathName('timecard_20181128.xlsx'))
begin #メインの処理ここから
sheet = book.Worksheets(1)
x ="C"
y =5
cell = sheet.Range(x + y.to_s)
for i in @shift do
case i
when "N1"
x = "C"
cell.value = "1"
x = "A"
cell.value = "9:00"
when "N2"
x = "C"
cell.value = "2"
x = "A"
cell.value = "17:30"
x = "B"
cell.value = "2:00"
when "N3"
x = "C"
cell.value = "3"
x = "A"
cell.value = "1:00"
when "休"
x = "C"
cell.value = "公休"
end
y += 1
end
book.save
#メインの処理ここまで
ensure
book.Close
app.quit
end
end
会社で夜勤の暇な時間でしこしこやってたら、get_shiftメソッドは動くようになった。
帰ってきて家のPCでtimecardメソッドがある程度できてきたから、試しに動かそうとしたら、以下のエラー。
initialize': unknown OLE server: `Excel.Application' (WIN32OLERuntimeError)
家のPCにエクセルいないもんね。そりゃそうだ。。。
開発環境はCloud9を使って、試すときは1回ローカルに落としてってやってたけど、すぐに動作確認できないのは面倒だなぁ