Help us understand the problem. What is going on with this article?

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

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
}

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした