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 で作ったタスクは一回実行するとかってに消える。