作った動機は以下の記事を読んで。
http://readingmonkey.blog45.fc2.com/blog-entry-556.html
効率良く記憶/勉強するためには特定の法則間隔でリマインドするのが効率良いらしい。
でもそのリマインドの間隔ではOmnifocusではやれない。
うまいことやれないかなーと考えてみたらGoogleカレンダー上に通知イベントを生成するスクリプトを書けばいいじゃんと思い至る。
んでちょいと調べた結果、可能だということが分かったので早速作成。
作業2時間。久々にJavascript触った割りにちゃんとできました。
要件整理
- ボタンを押すと前述の前述のURLの間隔単位でGoogleCalendarにイベントを生成してくれる。
- イベント名は任意で。
- リマインドしてくれる回数もしていさせて欲しい。
- 可能であれば今何回目なのかも知らせて欲しい。
- リマインダーなんだから通知して欲しい。
- 詳細もメモできたらいいな。
とする。
作り方
- google docsに新しいスプレッドシートを作成する
- スクリプトエディタを開いて後述のソースをコピペする
- ボタンを設置してfunctionを関連づけさせとく
- google calendarに新しいカレンダーを作り、ソース上に記述されてるカレンダー名と同じ名前を付けておく
- 4のカレンダーの通知の項目にメールとかポップアップとかでリマインドさせるようにしとく
- 完成!
1:google docsに新しいスプレッドシートを作成する
割愛
2:スクリプトエディタを開いて後述のソースをコピペする
スプレッドシートを開き、メニューバーからツール->スクリプトエディタでエディタを開き、
後述のソースをコピペします。
3:ボタンを設置してfunctionを関連づけさせとく
メニューバーから↑の手順で図形描画を選択し、”図形描画を挿入”画面に移行し、
矩形を配置します。
矩形が用意できたら右上の”保存して閉じる”ボタンを押してスプレッドシートに戻ります。
スプレッドシートに描画された図形にマウスオーバーすると”図形描画”の文字が。ここのプルダウンからスクリプトを関連づけさせます。
記述する関数名はソースの2つ目の関数名を記述します。
“makeRemindEventOnCal change inspector”
4:google calendarに新しいカレンダーを作り、ソース上に記述されてるカレンダー名と同じ名前を付けておく
自分のアカウントのグーグルカレンダーを開いて、新しいカレンダーを追加します。カレンダーに名前を付けれるのでソースで指定してある”記憶強化リマインダ”に。
名前を変えるのであればソース側のカレンダー名も偏向すること。
5:4のカレンダーの通知の項目にメールとかポップアップとかでリマインドさせるようにしとく
カレンダーの通知の項目を開いて、メールやポップアップに適当な時間を記述して通知してくれるようにしときます。これを設定しないとただのカレンダー止まりなのでちゃんと能動的に動いてくれる様にします。
6:完成!
ここまでやれば完成。動作は以下の通りです。
イベント名を記述。
カレンダー上に表記される文字なので短く分かりやすいものに。
最初の1ヶ月は間隔が長くなる不定期なので、固定でリマインドするようにしてあります。
その後の安定的(31日毎)にリマインドする回数を指定します。
カレンダーに記載する詳細を入力する欄。思い出すべき内容を出来るだけ細かく書くか、何をやるかだけ書くか、見出し以外の事を書いときます。
スクリプトが完了するとこれが表示されます。
ではカレンダーを見てみます…。
おお!ちゃんと書かれてる!
詳細もご覧の通り記述されます。
ソース
ソースは以下の通り。
/* カレンダーにリマインダーの理論間隔でイベントを設置するスクリプト ver. 0.1 2012/1/3: OHGAKI Kunihiro ver. 0.2 2012/1/4: OHGAKI Kunihiro : コメントを書き直し。 */ /* makeCalEvent カレンダーにイベントを書き込む関数 cal as Calendar Object カレンダーオブジェクト。何度も取得するのもアレなので一度取得したら保持させるようにしたので引数で渡してます。 グローバル変数にしとけよって話だ…。 GoogleAppってグローバル変数ってつかえるのかね eventName as String. カレンダーに記述するイベント名を文字列で取得。 targetDate as Date 実際に記述する日時を日付で指定。 count as Integer リマインドした回数を詳細とかイベント名に記述する。 descript as String カレンダーのイベントの詳細部分に記述する文字列。 */ function makeCalEvent(cal,eventName, targetDate,count,descript){ var cname = eventName; if (cname != "" & cname != "cancel"){ targetDate.setHours(0); targetDate.setMinutes(0); targetDate.setSeconds(0); // Browser.msgBox(descript); cal.createEvent( eventName+"@"+count+"回目", targetDate, targetDate, { description:count + "回目のリマインド" + descript, sendInvites:false } ); } } /* メインの関数な。スプレッドシートから呼び出すのはこれ。 makeRemindEventOnCal カレンダーにリマインダーイベントをセットするスクリプト。 リマインドの間隔は以下のURLの記事を元に作成してます。 http://readingmonkey.blog45.fc2.com/blog-entry-556.html */ function makeRemindEventOnCal(){ var cal = CalendarApp.openByName("記憶強化リマインダ"); //←リマインダー専用のカレンダーを予め作成。名前は任意で。 //カレンダーに表示するイベント名を入力する。 var eventName = Browser.inputBox("イベント名を入力してください"); if(!eventName)return; //リマインドする回数を入力。 var count = Browser.inputBox("安定期後にリマインドしたい回数を数値で入力", "整数でよろしく", null); var description = Browser.inputBox("詳細を記述してください。未記入でもOK"); var remindArray = [1,2,4,7,15,21]; //軌道に乗るまでの1ヶ月はこの間隔で広げて行く。 var remindMonth = 31; //軌道にのったら一月以上あけてはならないらしい。 var beforStationaryPhaseCount = remindArray.length; for(var i = 0; i < beforStationaryPhaseCount; i++){ var day = new Date; var target = remindArray.shift(); day.setTime(day.getTime() + target*24*3600*1000);//指定の日にリマインドタイミングをセット。 makeCalEvent(cal,eventName,day,i+1,description); } var afterDay = new Date; if(count != 0){ for(var i = 0; i < count; i++ ){ afterDay.setTime(afterDay.getTime() + remindMonth*24*3600*1000);//31日後にセット。 makeCalEvent(cal,eventName,afterDay,i + beforStationaryPhaseCount +1,description); } } //完了通知 Browser.msgBox("イベントのセットが完了しました。"); }
ハマったところ
カレンダーのイベントを生成する.createEvent()の引数に詳細を文字列で入力するんだけども、この引数がAdvanced Argumentsであり、省略可能引数オブジェクトのプロパティで、最初に発見したサンプルはバージョン違いなのか記述方法が違っていた。エラーが出ていたので本家サイトを探すに至り、難を逃れた。今後は最初から本家を見るように心がける。日本語サイトに逃げがちなのを戒めますわよ。
あと、タイポで反映されてなかったのに気づかずに5分くらい悩んだ。相変わらずエラー出ないのでこういうバグ発見はマジ困る。ブラウザ上のエディタではなくてローカルのちゃんとしたエディタで作業すべきなんだろうな。※英語記述のタイポを戒めてくれるエディタを教えて下さい!英語力低い僕には(ry