MacのカレンダーApp内の全予定をテキストで取り出す
Macのカレンダーアプリ(Calendar.app)から、指定したカレンダー内の全イベントをテキスト形式
(yyyy/mm/dd hh:mm - hh:mm Summary)
で取り出して、テキストエディットAppに書き出す JXA(JavaScript for Automation) ができたので
とりあえずソースを公開します。
ソースのアップデート
最初に公開したソースは、できた!としてとりあえず版でした。
その後、使い勝手など以下の改善をしました。
- カレンダー選択のダイアログがカレンダーアプリに隠れていたのを前に出す
- 出力結果が日付順になるようにソート
- カレンダー名と出力件数を表示する
- カレンダー名をドキュメントの名前にセットする
使用上の注意
繰り返しは解釈していません (Summury の後に ">>" があれば繰り返しの予定で、繰り返しの情報が iCal形式の定義情報が付加されています)
件数が多いカレンダーでは、とっても時間がかかるようです。
その際は、全件出力している for 文を適当な件数( 0~199 など)に分割して処理すれば良いと思います。
参考になったサイト
ソース
ical2txt_java.scpt
// カレンダーアプリ(Calendar.app)から、指定したカレンダー内の全イベントをテキスト形式
// (yyyy/mm/dd hh:mm - hh:mm Summary)
// で取り出して、TextEdit.app に書き出すJXA(JavaScript for Automation)
var app = Application.currentApplication()
app.includeStandardAdditions = true
var iCal = Application("Calendar")
iCal.activate()
var calNames = []
for (item in iCal.calendars) {
calNames.push(iCal.calendars[item].name()) // カレンダー名を取り出す
}
delay(2)
app.activate()
var iCalName = app.chooseFromList(calNames, { // カレンダー名の選択
withPrompt: "抽出するカレンダーを選んでください。",
defaultItems: [calNames[1]]
})
var Events = iCal.calendars[iCalName].events
var result = []
for (ev in Events) { // 指定されたカレンダー内の全てのイベントを取り出す
var startDT = YMDHM(Events[ev].startDate())
var endDT = YMDHM(Events[ev].endDate())
var timeStamp = startDT + " - " + endDT.slice(-5)
var sum = Events[ev].summary()
try {var reccur = Events[ev]. recurrence() }
catch(e) {}
if (reccur !== null) { sum = sum + " >> " + reccur }
result.push(timeStamp + " " + sum)
}
result.sort() // 日時の順にソートする
var sortedText = result.join('\n')
var textEdit = Application("TextEdit");
textEdit.activate() // TextEdit を起動する
var doc = textEdit.Document(); // 新規にドキュメントを作成
textEdit.documents.push(doc); // 画面に表示する
doc.text = sortedText // TextEdit に結果をセットする
// doc.name = String(iCalName) // ドキュメント名をセット(セットすると保存ができなくなるので、コメントアウト)
app.activate()
app.displayDialog("「" + String(iCalName) + "」から予定を " + result.length + " 件抽出しました。")
textEdit.activate()
function YMDHM(wDate) {
var yy = wDate.getFullYear()
var mm = ("0" + (wDate.getMonth() + 1)).slice(-2)
var dd = ("0" + wDate.getDate()).slice(-2)
var hh = ("0" + wDate.getHours()).slice(-2)
var min = ("0" + wDate. getMinutes()).slice(-2)
return yy + "/" + mm + "/" + dd + " " + hh + ":" + min
}