LoginSignup
1
2

More than 3 years have passed since last update.

Macのカレンダーアプリから全イベントをテキストで取り出すJXA(JavaScript for Automation)

Last updated at Posted at 2020-02-29

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
}

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2