macでGoogleカレンダーの予定一覧をメール通知する

携帯メールで「今日の予定は?」というメールを送ったときに、
Googleカレンダーの予定一覧を返信してくれたらいいなと思って

1、iCalとGoogleカレンダーの同期
2、iCalのカレンダーをメール送信するAppleScript
3、Mail.appでメールを受信したら2のAppleScriptを起動

これならできるかも!ということでやってみました。

ちなみにGoogleカレンダーの予定を
毎日6時に通知してくれたらいいなとも思っていたので
2の処理はいろいろ使えそうな予感です。
というよりは、今回は2がメインの内容となっています。

1、iCalとGoogleカレンダーの同期

まずは、iCalとGoogleカレンダー同期させます。

Step1:
「iCal」>「環境設定」>「アカウント」の左下にある「+」ボタンを押してアカウントを追加する
Step2:
下記項目にGoogleアカウントの情報を登録する
アカウントの種類:Google
メールアドレス: Googleアカウントに登録しているメールアドレス
パスワード:Googleアカウントのパスワード
Googleカレンダーの予定一覧をメール通知する_iCalのGoogleカレンダー同期

とりあえずはこれだけでOKだがメインのカレンダーしか同期されないので、
2つ以上のカレンダーも同期したいときは作成したアカウントの「委任」で
他のカレンダーの一覧が表示にチェックをつける

2、iCalのカレンダーをメール送信するAppleScript

iCalにGoogleカレンダーの予定を入れることができたので、
次はiCalの予定を送信するAppleScriptを作成。

-- メール送信用設定
set FromMailAddress to "送信元メールアドレス"
set ToMailAddress to "通知先メールアドレス"

-- 通知するカレンダー名配列
set aryCalName to {"自分のスケジュール", "プライベートな予定", "記念日"}

-- 今日と明日の日付を取得
set dNow to current date
set dToday to date ((year of dNow & " " & getMonth(month of dNow) & " " & day of dNow) as string)
set dTommorow to date ((year of dNow & " " & (getMonth(month of dNow) + 0) & " " & (day of dNow) + 1) as string)

-- 送信するメールの文言
--メールタイトル「YYYY年MM月DD日の予定」
set strMailTitle to (year of dNow & "年" & getMonth(month of dNow) & "月" & day of dNow & "日の予定" & (ASCII character 10)) as string
--スケジュール一覧の文言 初期設定で空文字
set strMailBody to "" as string

--iCalアプリケーションにスコープ
tell application "iCal"

	-- カレンダー別のループ処理
	repeat with calName in aryCalName

		-- カレンダー内のイベント情報を取得(今日dTodayから明日dTommorowまでの範囲指定)
		set theList to (every event of calendar calName whose (start date ≥ dToday) and (start date ≤ dTommorow))

		-- スケジュール別にループ処理
		repeat with x in theList
			-- 日時を取得
			set aDate to (start date of x) as date
			-- 日時と予定のタイトルを繋げていく
			set strMailBody to ((strMailBody & text -2 thru -1 of ("0" & (hours of aDate) as string)) & ":" & text -2 thru -1 of ("0" & (minutes of aDate) as string)) & tab & summary of x & (ASCII character 10)
		end repeat
		-- スケジュール別ループ処理 ここまで

	end repeat
	-- カレンダー別ループ処理 ここまで

end tell
--iCalアプリケーションのスコープ ここまで

-- 予定が1件も無い時のメッセージ
if strMailBody is "" then
	set strMailBody to "本日の予定はありません"
end if

-- メールを送信する
sendMail(strMailTitle, FromMailAddress, ToMailAddress, strMailTitle & strMailBody) of me

-- 月の英語表記から数値に変換する関数
on getMonth(vdateMonth)
	if vdateMonth is January then return "1"
	if vdateMonth is February then return "2"
	if vdateMonth is March then return "3"
	if vdateMonth is April then return "4"
	if vdateMonth is May then return "5"
	if vdateMonth is June then return "6"
	if vdateMonth is July then return "7"
	if vdateMonth is August then return "8"
	if vdateMonth is September then return "9"
	if vdateMonth is October then return "10"
	if vdateMonth is November then return "11"
	if vdateMonth is December then return "12"
end getMonth

-- 数値を2桁に整形したテキストを返す
on Num2Txt(vstrNumber)
	return text -2 thru -1 of ("0" & (vstrNumber as text))
end Num2Txt

--Mail.appでメール送信を行う
on sendMail(vstrSubject, vstrMailAddressFrom, vstrMailAddressTo, vstrMailBody)
	tell application "Mail"
		set newMessage to make new outgoing message with properties {subject:vstrSubject, content:vstrMailBody}
		tell newMessage
			set visible to true
			set sender to vstrMailAddressFrom
			make new to recipient at end of to recipients with properties {address:vstrMailAddressTo}
			send
		end tell
	end tell
end sendMail

AppleScriptでスケジュール取得するときのポイント
・iCalからWhoseで指定した期間内のイベント取得(26行目)
・取得したイベントの「start date」プロパティでイベント開始日、「summary」プロパティでタイトル取得(31〜34行目)
・月は英語表記のため数値に変換する必要がある(52〜65行目)

3、Mail.appでメール受信したら2のAppleScriptを起動する

これはMail.appのルール設定で特定のメールを受信したらAppleScriptを実行するルールを追加するだけ。

Step1:
「Mail」>「環境設定」>「ルール」の右にある「ルールを追加」ボタンを押す
Step2:
スケジュールを送信するための条件を設定する
今回は以下の条件に設定
・送信元のアドレスがiPhoneのSMSアドレス
・送信先のアドレスが自分で運用しているサーバのアドレス
・本文に「今日の予定」という文字が含まれている
Step3:
操作する実行で「AppleScriptを実行」を選択し、2のAppleScriptのファイルパスを指定。
Googleカレンダーの予定一覧をメール通知する_Mail.appルール設定

これで出来ました!!!
iPhoneからメール送信でテストしてみると。。。
Googleカレンダーの予定一覧をメール通知する_iPhoneでテスト

おお!ちゃんと返って来た!
…と思ったらなんか時刻が順番通りになっていない。。。
どうやらループの処理がイベントの登録順に処理されているみたい。
これからの課題だな、ソートアルゴリズム作らないと…

ちなみに2のAppleScriptをCronで実行すれば、
毎朝6時に予定一覧を通知してくれました!べんり便利♪

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>