AppleScriptでタスクのリマインド機能を実現

## はじめに

AppleScriptを使ってタスクのリマインドをmac標準のデスクトップ通知に出現させたお話です。

## 背景

普段作業している中で、

 - **来週の火曜日14:00~MTGしたいので開けておいてね**
 - **このレビュー明後日の13:00までには終わらせて欲しいです**
 - **来週の水曜14:00~この機能リリースするので忘れないように**

などなど期限付きのタスクが様々な方面から降ってきます。
一つ一つが大事なタスクが、時間がたつとすっかり忘れてしまって後から怒られるとなんだかやるせない気持ちになるので、何とか出来ないものかと。
タスクをリマインドするアプリとか他にも色々あるんですが、普段shell上で作業している僕らはわざわざ**この黒い画面から離れてGUIから操作するのはなんだか面倒...ただ学習コストはそこまでかけたくもないなぁ**
そこで

 - **シンプルな機能のみを提供**。時間になったら右上のデスクトップ通知が表示してタスクが完了するまで残り続けて欲しい。
 - **CLIで簡潔**。なるべく黒い画面から離れない
 - **めちゃ簡単に作れる**。複雑な知識はいらない。

この条件下を満たしつつ、shell上で完結するリマインダーを作るのに、AppleScriptがなんだか手軽にできそうだったので、手を出してみました。

## 対象バージョン
マシン: MacbookPro
OS: macOS High Sierra
バージョン: 10.13.1

## AppleScriptとは

> AppleScript（アップルスクリプト）は、アップルが開発したClassic Mac OS/macOS用のオブジェクト指向のスクリプト言語。System 7（Mac OS 7にあたる）から採用されている。
> 標準環境で利用でき、ある程度自然言語（英語）に似た構文を持つ。制御構文、ハンドラや変数、オブジェクトやプロパティの記述といったプログラミングの基本機能を言語に備えており、Mac OSのプロセス間通信機能の一つであるApple eventによって、システムや様々な対応アプリケーションにまたがって制御できる。
> https://ja.wikipedia.org/wiki/AppleScript

Mac OS/macOS用の専用のスクリプトで、シェル、コマンドの呼び出しから、アプリケーション等のプロセスにApple eventを送るコマンド等を記述していくことで、各アプリケーションだったり、定期バッチだったりを実行が出来るスクリプト言語です。

## スクリプトエディタについて

Macには標準でAppleScriptを編集するためのスクリプトエディタが存在します。
スクリプトエディタ上では、スクリプトを編集、デバッグ、およびコンパイルすることができます。[スクリプトエディタについて](https://support.apple.com/ja-jp/guide/script-editor/scpedt6935/mac)

また、対象のアプリケーションがAppleScriptに対応しているか、またその対応しているアプリケーションが提供しているコマンド等を

 - ``shift + command + O``または ``メニュー > ファイル > 用語説明を開く``

により、アプリケーション毎にドキュメント画面を確認出来ます。
各アプリケーションのコマンドのドキュメントは

<img width="808" alt="スクリーンショット 2018-09-02 20.57.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/194069/51ff90c0-0668-91e4-f837-c7eb8dd75a16.png">

こんな感じで表示されます。
どんなコマンドが使えるのか、そしてそのコマンドがどんな機能を提供しているのかが事細かに記述してあるので、わからなくなったらここをみると良いです。


## 事前準備

shell上からMac標準のリマインダーにtaskを登録するため、事前にリストを作成しておく必要があります。

<img width="469" alt="reminder.png" src="https://qiita-image-store.s3.amazonaws.com/0/194069/128e3afa-2ae0-ddc0-2744-d652e05ae5c8.png">

Reminder.Appを開く > リストを追加ボタンをクリック > 新規リストの名前を好きな名前に変更
を実行することで、新規リストを作成してください。
この追加したリストに後々リマインドタスクを追加していく流れになります。

## 実装

```sh:.zshrc
alias rt=remind-tasks
function remind-tasks(){
	REMIND_TASK_FILE_PATH="/path/to/remindTask.applescript"
	if [ ! $1 ]; then
		echo "please input YMDtime first arg : time format is YYYY.MM.DD"
		return
	fi
	if [ ! $2 ]; then
		echo "please input HMtime second arg : time format is HH:MM"
		return
	fi
	if [ ! $3 ]; then
		echo "please input task name third arg : task samle is 'task name'"
		return
	fi
	osascript $REMIND_TASK_FILE_PATH $1 $2 $3
}
```

```applescript:remindTask.applescript
on run argv
	set timeYMD to (item 1 of argv)
	set timeHM to (item 2 of argv)
	set task_name to (item 3 of argv)
	tell application "Reminders"
		set mylist to list "tasks"
		set task_date to date timeYMD of date timeHM of (current date)
		tell mylist
			make new reminder at end with properties {name:task_name, remind me date:task_date}
		end tell
	end tell
end run
```

実装はたったこれだけ。シンプル。

## 実行

以下コマンドで実行します。

```sh
rt "2018.09.03" "13:00" "taskだよ"
```
実行が成功すると、
![remind-tasks.gif](https://qiita-image-store.s3.amazonaws.com/0/194069/72956342-8524-96c5-0e28-6564d4f21a44.gif)

の画像のように指定した時間になるとリマインダーが起動し、デスクトップ通知が表示されます。
もちろん、実行済みを押すまでずっと残り続けてくれるので忘れることもない！ミッションコンプリートです！

## 終わりに

普段使っているようなアプリでもAppleScriptの機能を提供するものが以外にあったりするので探してみると作業を自動化させる掘り出し機能に出会えるかも...?

## 参考文献

https://mc909j.blogspot.com/p/document.html