忍者ブログ

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

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

[PR]

2024-05-03
×

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

[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カレンダーに取り込めば良いわけです。

PR

コメント

お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード Vodafone絵文字 i-mode絵文字 Ezweb絵文字

プロフィール

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