忍者ブログ

書かないと忘れてしまうから

仕事上必要な工夫など、備忘録として残します。

[PR]

2024-05-17
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

[Ruby][iCal] iCal_to_CSVのEXE版なのですが・・・

2012-12-07
 iCalファイルをCSVに変換するRubyソースを報告しましたが、Rubyはコンパイラですから、Rubyを使用していない人にはEXEで提供する必要がありそうです。

■使用法
ical_to_csv xxxx.ics とするだけです。
xxxx.ics はiCalファイル名です。
xxxx.CSV に変換されます。

処理対象のiCalファイルは Shift-JIS か UTF-8 形式でないといけません。

PR

[Ruby][iCal]iCalファイルをCSV形式に変換するコード

2012-12-07
 カレンダーソフトの定番フォーマットと言えるiCalですが、一覧性に乏しく、手動で編集するのは困難です。
 CSVやExcel形式ならば一覧性に優れ、コピー・アンド・ペーストでデータの再利用が簡単となります。

iCal(エンコードShift-JIS)をCSVに変換するRubyコードを作成


 そこで、iCal(エンコードShift-JIS)をCSVに変換するRubyコードを作成しました。

 Rubyはインタープリタですので、Ruby(1.9.3で作成)のインタープリタ環境があることが前提です。
 Rubyのインタープリタがないとか、とにかく早く変換したい人は→こちらへ

 Rubyのインタープリタに加えて、
  Ri_Cal
     nkf
  kconv
  csv
  vruby が必要です。
 (16,19,201行目のメッセージボックスが不要ならvrubyはインストール不要)
 Googleカレンダー(カレンダー)、Remember The Milk(タスク管理)のiCalに対応していると思います。

■ソース
#! ruby -Ks
# coding:windows-31j
#! /usr/bin/env ruby

require 'rubygems'
require 'csv'
require 'nkf'
require 'ri_cal'
require 'kconv'
require 'vr/vrdialog'

#OCRA でコンパイルする時に内容チェックさせない。
unless (defined?(Ocra))
  #入力ファイル名を引数で受け取る。引数がなければ中止。
  inf=ARGV[0]
  if inf.nil? then
    SWin::Application.messageBox("処理対象のファイルをドラッグして起動するか、

バッチファイルで
 ical_csv 対象ファイル名 
で起動してください。

終了します。" ,"エラー",0)
    exit
  else
    SWin::Application.messageBox("iCSファイルをCSVに変換します。" ,"処理開始",0)
  end

  f = open(inf, "r")
    str = f.read
  f.close
  
  #入力ファイルがShift-JISではないかもしれないので強制変換して.tmpに出力
  ott=File.dirname(inf)+"/"+File.basename(inf,".*")+".tmp"
    ot= open(ott,"w")
    str_sjis=NKF.nkf('-s -Lw',str)
    ot.print str_sjis
  ot.close

  #.tmpから入力して.csvに出力すると宣言
  inf=File.dirname(inf)+"/"+File.basename(inf,".*")+".tmp"
  otf=File.dirname(inf)+"/"+File.basename(inf,".*")+".csv"

  ics = open(inf)
  cal = RiCal.parse(ics)
  # calendarという文字列があればカレンダーと判断 <<<< 必要に応じて修正
  calortask=cal.first.prodid.downcase.index(" calendar")

  CSV.open(otf, 'w') do |writer|
    unless calortask.nil? then
      #カレンダーと判断した時のヘッダ
      writer << ["Subject","Start Date","Start Time","End Date","End Time"," Meeting Organizer"," Description", "Location","Categories","Attendee","Status","Duration"]
    else
      #タスクと判断した時のヘッダ
      writer << ["Subject","Start Date","Due Date","Status","Date Completed","% Complete","Categories","Notes","Priority"]
    end
  end

  unless calortask.nil? then
  
    cal.first.events.each do |event|

      p1= event.summary

      x=event.dtstart
      unless x.nil? then
        p2= x.strftime("%Y/%m/%d")
        p3= x.strftime("%H:%M")
      else
        p2= ""
        p3=""
      end

      x=event.dtend
      unless x.nil? then
        p4= x.strftime("%Y/%m/%d")
        p5= x.strftime("%H:%M")
       else
        p4= ""
        p5=""
      end

      x=event.organizer
      unless x.nil? then
        p6= x
      else
        p6= ""
      end

      x= event.description
      unless x.nil? then
        p7= x.gsub(/(
|
|
)/, '
')
      else
        p7= ""
      end

      x=event.location
      unless x.nil? then
        p8= x
      else
        p8= ""
      end
      
      x=event.categories
      unless x.nil? then
        p9= x
      else
        p9= ""
      end
      
      x=event.attendee
      unless x.nil? then
        p10= x
      else
        p10= ""
      end
      
      x=event.status
      unless x.nil? then
        p11= x
      else
        p11= ""
      end
      
      x=event.duration
      unless x.nil? then
        p12= x
      else
        p12= ""
      end

      CSV.open(otf, 'a') do |csv|
        unless p1.nil? then
          row = [p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12]
          csv << row
        end
      end
    end
    # cal.first.events.each do に対応
    
  else
  #calortask=nil なのでtodoと判断した時の処理

    cal.first.todos.each do |todos|
      
      x=todos.summary
      unless x.nil? then
        p1= x
      else
        p1= ""
      end
      
      x=todos.dtstart
      unless x.nil? then 
        p2= x.strftime("%Y/%m/%d %H:%M")
      else 
        p2= ""
      end

      x=todos.due
      unless x.nil? then
        p3= x.strftime("%Y/%m/%d %H:%M")
      else
        p3= ""
      end

      x=todos.status
      unless x.nil? then
        p4= x
      else
        p4= "Not Started"
      end

      x=todos.completed
      unless x.nil? then
        p5= x.strftime("%Y/%m/%d %H:%M")
      else
        p5= ""
      end
      
      x=todos.percent_complete
      unless x.nil? then
        p6= x
      else
        p6= ""
      end
      
      x=todos.categories
      unless x.nil? then
        p7= x
      else
        p7= ""
      end
      
      x= todos.description
      unless x.nil? then 
        p8= x.gsub(/(
|
|
)/, '
')
      else
        p8= ""
      end
      
      x=todos.priority
      unless x.nil? then
        p9= x
      else
        p9= "Normal"
      end
      
      CSV.open(otf, 'a') do |csv|
        unless p1.nil? then
          row = [p1,p2,p3,p4,p5,p6,p7,p8,p9]
          csv << row
        end        
      end
      
    end # cal.first.todos.each do に対応
  end #calortask=nil なのでtodoと判断した時の処理を閉じる
  SWin::Application.messageBox(otf+"に出力しました" ,"完了",0)
  ics.close
  a=File.delete(*inf)
end

右クリック(Macの場合はしばらくクリック)して、「対象をファイルに保存」などしてください。

 私はRubyがインストールされていない環境で使用するためOcraにてコンパイルするのですが、その場合、いちいち引数をチェックに行ってうるさいのでコンパイル時にはメインルーチンをチェックしないようにしています。

■iCal の区別は PRODID で
Remember The Milk の iCal の PRODID
 PRODID:-//Remember The Milk//rtm.Service.iCalendar.Export 3.0//EN
Google Calendar の iCal の PRODID
PRODID:-//Google Inc//Google Calendar 70.9054//EN
 PRODIDでカレンダーかタスクかの分岐設定をしていますので、ご自分の使いたいiCalのPRODIDに合わせてください。私の場合RTMとGoogleの区別だけつけば良く、Googleカレンダーでは、「 Calendar」となっているので、スペース+Calendarを含んでいればGoogleカレンダーとしています。

■実行法
 iCal_to_CSV.rb  xxxxx.ics
 のように引数でインプットファイルを指定します。
 これにより xxxxx.CSV が作成されます。
 ただし、RUBY.EXE に PATH が通っていなければエラーになります。

■実行結果(Google Task:Google Task Backup経由で取得)

■実行結果(Remember The Milk)

■実行結果(Google Calaendar)




[Gcal2Excel]ファイルを[Googleカレンダー]Outlook形式CSVに変換する[Ruby]コード

2012-12-06
 GCal2ExcelによりGoogleカレンダーの予定表データはxls,xlsx,CSVに変換できます。
 ここではGCal2Excelで作成されるxls形式データをGoogleカレンダーOutlook形式CSVに変換するRubyコードを紹介します。
 Excel形式になっているのだから、変換する必要はないように思うかもしれませんが、GCal2Excelで作成されるデータは編集後にGoogleカレンダーに戻すことを想定していないようですので、ヘッダが異なっています。

■GCal2Excelで得られたデータの例
Title Start End Duration Description Where
社内試験監督官 2012/12/17 15:00 2012/12/17 17:00 02:00 管理職
一部専門職
1405,会議ルーム
 例えばヘッダがTitleとなっていますが、アップロードするときにはSubjectとすべきです。
 微妙にGoogleカレンダー形式CSVと異なるので変換します。

■ソース(Ruby 1.9.3)
#! ruby -Ks
# coding:windows-31j
#! /usr/bin/env ruby

# GCalExcel.rb
# Coded in Ruby 1.9.3

require 'rubygems'
require 'vr/vrdialog'
require 'spreadsheet'
require 'nkf'

#引数チェック(この if then ブロック使わないなら vr/vrdialog Gem はrequire不要)
    inf=ARGV[0]
  if inf.nil? then
      SWin::Application.messageBox("処理対象のファイルをドラッグして起動するか、

バッチファイルで
 GCalExcel.rb 対象ファイル名 
で起動してください。

終了します。" ,"エラー",0)
      exit
  else
    SWin::Application.messageBox("GCalExcelファイルをGoogleカレンダー対応CSVに変換します。" ,"処理開始",0)
  end
  
#引数で渡されたファイルから入力して.csvに出力すると宣言
  book = Spreadsheet.open(inf,"rb")
  otf=File.dirname(inf)+"/"+File.basename(inf,".*")+".csv"
  o=File.open(otf,"w")

#引数で渡されたファイルから入力して.csvに出力すると宣言
book.worksheets.each do |ws|

    #ヘッダチェック:Location(GCal2EccelのWhere)格納列はどこか?
  for i in 0..10 
    if ws[0,i]=="Where" then 
      LocationCol=i
    end
  end
    #ヘッダ出力
      record = []
      record << ["Subject","Start Date","Start Time","End Day","End Time","Description","Location","All Day Event"]
      o.puts NKF.nkf('-w80 -Lu',record.join(","))

    #一行ずつ処理
  ws.each do |row|
      record = []
      allDayEvent=TRUE
    unless row[3][0,5]=="24:00" then 
      allDayEvent=FALSE
    end
      unless row[0]=="Title" && row[1]=="Start" then
          unless row[0].nil? then row[0]=row[0].gsub(",","") end 
          unless row[4].nil? then row[4]=row[4].gsub(",","") end 
          unless row[LocationCol].nil? then row[LocationCol]=row[LocationCol].gsub(",","") end 
      record << [row[0],row[1][0,10],row[1][11,5],row[2][0,10],row[2][11,5],row[4],row[LocationCol],allDayEvent]
                #日付時刻のデータの正当性チェックをしていないので必要ならチェック手順を追加して下さい
      o.puts NKF.nkf('-w80 -Lu',record.join(",").gsub(/
/,":|:"))
      end
  end
end

  #使用ファイルのクローズ処理
  o.close
  book.io.close

#-------------------------------------------------- 
#---- Additional Setting for Spreadsheet Gem  ----#
#-------------------------------------------------- 

module Spreadsheet
  class Workbook
    attr_accessor :io
  end
end


右クリック(Macの場合はしばらくクリック)して、「対象をファイルに保存」などしてください。

 Excel(xls)ファイルにアクセスするためにspreadsheetというGemをrequireしています。
 vr/vrdialogは初期処理のダイアログボックスを表示しないならrequireしなくてもかまいません。
元のExcelファイルはSHIFT―JISと想定されますが、出力はUTF-8のBOMなし形式です。NKFによりUTF-8のBOMなしに変換しています。
 このような場合には
#! ruby -Ks
 は、これで良いのか?にわかRubyUserである私は悩んでしまいます。
 このスクリプトにおけるCSVとはカンマ区切りテキスト形式だけ再現しています。文字列を""で囲むK3方式ではありません。そのため元データに半角カンマがあるとセルが分割されてしまいますから、省力化のため削除しています。
 また元データにセル内改行が含まれているとCSVでは再現できず崩れてしまいます。
 Created By,Attendees,Atendee Countは無視しています。必要ならばWhereをLocationにしている処理を参考にして改良して下さい。

■実行法
 GCalExcel.rb   xxxxx.xls
 のように引数でインプットファイルを指定します。
 これにより xxxxx.CSV が作成されます。
 ただし、RUBY.EXE に PATH が通っていなければエラーになります。

■変換したデータの例
Subject Start Date Start Time End Day End Time Description Location All Day Event
社内試験監督官 2012/12/17 15:00 2012/12/17 17:00 管理職:|:一部専門職 1405会議ルーム FALSE
 セルデータにカンマや改行があるとCSVが崩れてしまいます。
 そのため、改行は:|:という文字列に置換し、カンマは削除しています。

 変換したデータをもとにして複写したり新たに作成したりしてデータを作り上げたら、CSVをGoogleカレンダーに取り込めば良いわけです。

[iCal][RTM]RTMのiCalの取得

2012-12-05
 Remember The Milk は他のアプリとの連携のためにiCal URLを用意しています。
 このiCal URLにアプリから自動ログインしてデータを取得することも可能です。
 ただ、うちの会社ではセキュリティの関係なのか自動ログインはできません。また、ソースコードでIDやパスワードを埋め込むのは怖いですから、データの自動取得はやめておきます。

■Remember The Milk のiCalについて
rtmid は架空のidです。
 トップページから「設定」「情報」と選ぶと上記画面になります。
 このうち、iCalendarサービス(すべてのリスト)を選ぶと完了済みも含めたリストとなります。
 iCalアドレスは他のアプリと連携する際に設定するURLです。

■Googleカレンダーに表示する
 Google にログインした状態で、iCalendarサービス(すべてのリスト)等をクリックすると となりますので「はい、このカレンダーを追加します」を選ぶと、Googleカレンダーにタスクが表示されるようになります。

■iCal形式のファイルをローカルにダウンロードする

ブラウザのアドレスバーにiCalアドレスを入力し、webcal:とあるのをhttps:に変更すると、iCSファイルがダウンロードされるはずですのでローカルで作業する場合にはそれを利用します。

[Google Tasks] をCSVなどに落とす(Google Tasks Backup)

2012-12-04
 Google Tasks はとても便利なのですが、標準ではデータのインポートもエクスポートもできないという困った代物となっています。
 以前は、Google Tasks Porterというサービスがあったのですが、2012年10月時点では正しく動作しなくなっているようです。
 しかし、世の中には賢い人が多数いるもので、Google Tasks Backup というwebサービスを提供してくださっている方がおられますので紹介します。


■初めて使用する時などに表示される画面
 

表示される画面はGoogleの使用環境によって変わります。
この画面で Main menu ボタンをクリックすると


■アクセス許可を求める画面
 
という画面が表示されますから、少し考えてから「アクセスを許可」するを押しました。
 

■Advanced settings において
 

 Include completed tasks?  完了済タスクを含めるか
 Include deleted tasks?   削除済みタスクを含めるか
 Include hidden tasks?   完了済で隠したタスクを含めるか
を選択します。
 

■エクスポートまたは画面表示の形式を選択
 
という画面では、
・iCal iCS
・CSVが欲しい時は、OutlookCSV
・Remember The Milk と連携させたい時はRTM email
の3つが使えそうです。


■注意
(1)この方法で得られるファイルは、UTF-8形式のようです。
(2)RTM emailについて
 リスト名はタグ名に変換されます。
(3)アクセス許可について
 「アクセスを許可」するとGoogle Task BackupがGoogle Calendarに常時接続状態になります。気持ちが悪いという場合には  [Googleアカウントへのアクセス許可を削除する]


■ちなみに
 iCalやCSVは Google Tasks Import という逆方向サービスでGoogleTaskに送れます。
 

プロフィール

HN:
otsukare30
性別:
男性
自己紹介:
mail:otsukare30★gmail.com

カレンダー

04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

ブログ内検索

忍者カウンター

P R