OutlookからエクスポートしたCSVファイルを読み込んでタスクに登録
というわけで、とりあえずOutlookからエクスポートしたCSVファイルを読みこんでタスクに登録するようにしてみました。
- outlook2task.rb
require "csv" require "date" require "time" DEFAULT_FILENAME = "outlook.CSV" USERNAME = "hoge" # 自分のを書いてね PASSWD = "hoge" RUBYPATH = "C:\InstantRails\ruby\bin\ruby.exe" SCRIPT = "D:\yasuki\documents\program\Ruby\outlook2tasks\showmsg.rb" file = DEFAULT_FILENAME file = ARGV[0] if ARGV.size > 0 csv = CSV.readlines(file) t = Date.today today = "#{t.year}/#{t.month}/#{t.day}" csv.each{|line| if line[1] == today then task = line[0] date = Date.parse(line[1]).strftime("%Y/%m/%d") time = line[2] alert = Time.parse(time) - 60*15 if alert < Time.now then alert = Time.now + 60 end alert_time = alert.strftime("%H:%M:%S") msg = "#{task} - #{time}" taskname = "#{task}" cmd = 'cmd /c #{RUBYPATH} #{SCRIPT} ' + "'#{msg}' '#{taskname}'" print c = <<-EOD cmd /c schtasks /Create /TN "#{taskname}" /TR "#{cmd}" /SC ONCE /SD #{date} /ST #{alert_time} /RU #{USERNAME} /RP #{PASSWD} EOD `#{c}` end }
パスワードをスクリプトに直に書いているのは気分が悪いですが、いちいち面倒なので。
"cmd /c" を使ってschtasks を起動してるのは、ショートカットから起動する際にこうしないとうまくいかなかったから。
原因はよく分からなかったけど、権限の問題??
それと、rubyw.exeを使うと動作しません。これも原因不明。
- showmsg.rb
require 'Win32API' require "date" require "time" USERNAME = "hoge" # 自分のを書いてね PASSWD = "hoge" RUBYPATH = "C:\InstantRails\ruby\bin\ruby.exe" SCRIPT = "D:\yasuki\documents\program\Ruby\outlook2tasks\showmsg.rb" class Win32API # type flag MB_OK = 0 MB_OKCANCEL = 1 MB_ABORTRETRYIGNORE = 2 MB_YESNOCANCEL = 3 MB_YESNO = 4 MB_RETRYCANCEL = 5 # return values IDOK = 1 IDCANCEL = 2 IDABORT = 3 IDRETRY = 4 IDIGNORE = 5 IDYES = 6 IDNO = 7 def Win32API.MessageBox(wnd, text, caption, type = MB_OK) messagebox = Win32API.new('user32', 'MessageBox', %w(p p p i), 'i') messagebox.call(wnd, text, caption, type) end def Win32API.MessageBoxEx(wnd, text, caption, type = MB_OK, languageid = 0) messagebox = Win32API.new('user32', 'MessageBoxEx', %w(p p p i i), 'i') messagebox.call(wnd, text, caption, type, languageid) end end str = "#{ARGV[0]}" msg = str + "\n\nいますぐできますか?できない場合は30分後に再通知します。" r = Win32API.MessageBox(0, msg, str, Win32API::MB_YESNO) if r == Win32API::IDNO then taskname = ARGV[1].to_s # add if /^(.*)_(\d+)$/ === taskname then taskname = $1 + "_" + ($2.to_i + 1).to_s else taskname += "_1" end date = Date.today.strftime("%Y/%m/%d") alert_time = (Time.now + 30 * 60).strftime("%H:%M:%S") cmd = 'cmd /min /c #{RUBYPATH} #{SCRIPT} ' + "'#{str}' '#{taskname}'" print c = <<-EOD cmd /c schtasks /Create /TN "#{taskname}" /TR "#{cmd}" /SC ONCE /SD #{date} /ST #{alert_time} /RU USERNAME /RP PASSWD EOD `#{c}` end
こっちは、メッセージを表示するスクリプト。
いいえを押すと 30分後に再び表示する。
タスク名をいちいち変えているのは、実行中のタスクは削除も変更もできないため。
削除については特に書いていないが、/SC ONCE で作ったタスクは一回実行するとかってに消える。