それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

AppleScript のJavaScript版 JXAで、リマインダを登録する

リマインダって単体だと意味なくないですか?

なにか別のアプリと連携したり、タスクを自動的にどっかに放り投げたり、Remenber The Milk と連動したら便利だと思うんですね。

なので、リマインダを扱えるようになりたい。

JavaScript で  リマインダを登録

var app = Application("Reminders")
entry = app.Reminder(  { name : "アドベントカレンダー", body: "JavaScript化されたAppleScriptについて書く" } )
app.lists["明日の予定"].reminders.push( entry )

調子に乗って登録すると大変なことに

あまりにも簡単に登録できるので。調子に乗ってループ回して150件登録しました。

スクリーンショット 2014-12-08 4.04.08

リマインダのDOM(?)構造

リマインダは、AppleScriptの基本形で作られている

Application ⇛ タスクリスト(左ペイン) ⇛ タスク

まず、リマインダ.appから、TODOを足したいリストを探す

var app = Application("Reminders")
app.lists["明日の予定"].name() //=>明日の予定

これで探せます。簡単

次に、リストに新規追加したいリマインダ(TODO)を作る

Application("Reminders").Reminder() が新規作成する関数オブジェクトの実行になる。

var app = Application("Reminders")
entry = app.Reminder(  { name : "アドベントカレンダー", body: "JavaScript化されたAppleScriptについて書く" } )

最後に、作ったreminderオブジェクトを追加する

ここは、普通に配列にオブジェクト追加するのと同じ

app.lists["明日の予定"].reminders.push( entry )

この、push は Array.push() と同じものだと思えばいいみたい。

タスクリストから、TODOを取り出すには

//タスク一覧
var app = Application("Reminders")
var arr = app.lists["明日の予定"].reminders
var list = Array.apply(null, arr)
list = list.map(function(e){
    return e.name()
})


list

と、配列相当の reminders オブジェクトを Array.apply でJavaScriptの配列に変換してやれば、もう通常のJavaScriptと同じに使える。便利!

左側のリストの一覧を取り出すときも同じ。

ほとんど同じに使えますね。

//タスク一覧
var app = Application("Reminders")
var arr = app.lists
var list = Array.apply(null, arr)

list = list.map(function(e){
    return e.name()
})

list //=> ["INBOX", "気になってるリスト", "お買い物", "明日の予定"]

TODOエントリを削除するには

app.lists["明日の予定"].reminders[0].delete()

とReminder() オブジェクトのdeleteを呼んでやります。

これは、Application.delete()を使っても同じことが出来ます。

app.delete(lists["明日の予定"].reminders[0])

さらに、まとめて削除するには

app.delete(lists["明日の予定"].reminders)

などと、配列を渡してやれば全部消せます。

名前指定したリマインダだけを消すには

app.lists["明日の予定"].reminders["アドベントカレンダー"].delete()

とします。ただ、これは複数選択できててもひとつしか消えないみたい。

新しいTODOエントリを追加するときに細かい条件を

ただ、名前と中身を書いているなら、単純なテキストファイルで用が足りるわけですから、ちゃんとリマインダ.app の日付時刻指定、優先度指定も使ってみましょう

var app = Application("Reminders")


entry = app.Reminder( 
 {  name : "アドベントカレンダー", 
    body : "JavaScript化されたAppleScriptについて書く",
    //remindMeDate : Date.parse("2014/12/08 15:00:00 GMT+0900 (JST)"),
    priority  : 1
}
)
app.lists["明日の予定"].reminders.push( entry )

なぜか、日付指定が上手く行かずにフリーズする謎現象。 日付指定が上手くいかないと、Reminders.appが永遠にフリーズして帰ってこないので iCloudにWEBからログインして消すことにしました。

日付指定については今度詳しく調べておきます。

日付や場所指定ないと、使いものにならないのに、ごめんなさい。時間切れ。

本当は、「◯◯に到着したら時にやること」をまとめて追加したりしたかったんだけど。。

今回はリマインダを扱いました。

リマインダは単体ではちょっと使いにくいのですが、AppleScriptを使って、EvernoteWEBサービスや、オシゴトのサイボウズ的なアプリと組合せて戦えば、結構使えると思います。

リマインダって少しのスパイスで結構使えるアプリなんだと思います。

なんで、連携してくれるアプリは少ないんだろうなぁ。すぐ通知センタ使いたがるのやめてほしいなぁ