ところが、DL可能なファイルそのものでは、きちんと動作しないケースがある。
①前日に終日スケジュールが設定されている時は、それが次の予定として読みだされてしまう。
②当日に終日スケジュールが設定されている時は、それが次の予定として読みだされ、他に予定されているスケジュールは無視されてしまう。
③日時が変更されたスケジュールがあると、変更前のデータを読み込んでしまうことがある。
④(当然のことながら)マナーモードが設定されていると、音声読み上げがなされず、終了してしまう。
⑤全体にわたってグローバル変数が使用されており、メモリーを圧迫する恐れがある。
そこで使いこみながら手を加え、前述の問題点を回避するように改造を施した。
ほしい人がいるかどうかわからないが、参考までに公開します。
次の予定読み上げ
A1: HTTP Get [ Server:Port:https://www.google.com Path:calendar/feeds/XXXX%40gmail.com/private-YYYY/full?singleevents=true&futureevents=true&orderby=starttime&sortorder=ascending&max-results=4 Attributes: Cookies: Timeout:30 Mime Type: Output File:Calendar.txt ]
※「XXXX」と「YYYY」の部分は、Googlelでのユーザーネーム(「XXXX@gmail.com」の前半部分)と、Googleカレンダーへのプライベート・アクセスキーを入れる必要があります。
(プライベート・アクセスキーを入手するには、Googleカレンダーサイトを開き、「設定」を開きます。次に「カレンダー」タブをクリックし、参照したいカレンダーを選びます。開いた画面の下方で、「カレンダーのアドレス」からオレンジ色の「XML」ボタンをクリックします。)
A2: Read File [ File:Calendar.txt To Var:%calendar ]
<変更前データをカット>
A3: Variable Search Replace [ Variable:%calendar Search:<gd:originalEvent.*?gd:originalEvent> Ignore Case:OffMulti-Line:On One Match Only:Off Store Matches In: Replace Matches:On Replace With: ]
※ここで、修正があった場合に残されている変更前のデータをカットする作業をしています。「Replace With」の後にはスペースをひとつ設定しています。NULL文字が設定できないのでスペースにしていますが、後の処理に影響しない文字なら何でも構いません。
※A3のコードにバグがあったので修正しました。[2013-11-20]
※見やすいようにラベルを設定しました。[2014-01-21]
A4: Variable Split [ Name:%calendar Splitter:<title type='text'> Delete Base:Off ]
A5: Variable Set [ Name:%index To:1 Do Maths:Off Append:Off ]
A6: Variable Set [ Name:%ceventdate To:%calendar Do Maths:Off Append:Off ]
A7: Variable Split [ Name:%ceventdate Splitter:startTime=' Delete Base:Off ]
<開始時刻取得>
A8: Variable Set [ Name:%index To:%index+1 Do Maths:On Append:Off ]
A9: Variable Clear [ Name:%etime Pattern Matching:Off ]
A10: Variable Set [ Name:%eventdate To:%ceventdate(%index) Do Maths:Off Append:Off ]
A11: Variable Split [ Name:%eventdate Splitter:- Delete Base:Off ]
A12: Variable Split [ Name:%eventdate3 Splitter:T Delete Base:Off ]
A13: Variable Section [ Name:%eventdate3 From:1 Length:2 Adapt To Fit:Off Store Result In:%eday ]A14: Variable Set [ Name:%samedayevent To:no Do Maths:Off Append:Off ]
※A14の処理を追加。当日これからの予定が残っていない場合に対応。[2014-01-21]
A15: Goto [ Type:Action Label Number:1 Label:予定がない場合 ] If [ %eday > %DAYM ]
※データの日付が翌日以降なら、処理終了。[2014-01-21追加]
A14: Return [ Value:1 Stop:Off ] If [ %eday > %DAYM ]
※削除。[2014-01-21]
<終日スケジュールの場合>
A16: If [ %eventdate31 !~ %eday ]
<昨日の日付>A17: If [ %DAYM > %eday ]
※ラベルを追加。[2014-01-21]
A18: Goto [ Type:Action Label Number:3 Label:開始時刻取得 ]
A19: End If
A20: Variable Set [ Name:%eventdate31 To:%eday Do Maths:Off Append:Off ]
A21: Variable Set [ Name:%etime To:終日 Do Maths:Off Append:Off ]
A22: End If
A23: Variable Set [ Name:%eventdate31 To:%eventdate31/1 Do Maths:On Append:Off ]
A24: Variable Set [ Name:%eventdate2 To:%eventdate2/1 Do Maths:On Append:Off ]
A24: Variable Set [ Name:%samedayevent To:no Do Maths:Off Append:Off ]
※A15に移動。[2014-01-21]
A25: Variable Set [ Name:%samedayevent To:yes Do Maths:Off Append:Off ] If [ %DATE ~ %eventdate2-%eventdate31-%eventdate1 ]
A26: Variable Set [ Name:%indexc To:%index+1 Do Maths:On Append:Off ]
A27: Variable Set [ Name:%calcut To:%calendar(%indexc) Do Maths:Off Append:Off ]
A28: Variable Split [ Name:%calcut Splitter:</title> Delete Base:Off ]
A29: Variable Split [ Name:%calcut2 Splitter:where valueString=' Delete Base:Off ] If [ %calcut2 Is Set ]
<場所のセット>
A30: Variable Split [ Name:%calcut22 Splitter:'/ Delete Base:Off ] If [ %calcut22 Is Set ]
<開始時刻のセット>
A31: Variable Section [ Name:%eventdate32 From:1 Length:5 Adapt To Fit:Off Store Result In: ] If [ %etime !~ 終日 ]
※「if」文を追加しました。[2014-01-21]
<終日スケジュールの場合>
A32: Variable Set [ Name:%eventdate32 To:%etime Do Maths:Off Append:Off ] If [ %etime ~ 終日 ]
<文章セット前半>
A33: Variable Set [ Name:%nextevent To:今日予定されている次のスケジュールは、 %calcut1 です。時刻は %eventdate32 です。 Do Maths:Off Append:Off ] If [ %samedayevent ~ yes ]
<文章セット後半>
A34: Variable Set [ Name:%nextevent To:%nextevent 場所は %calcut221 です。 Do Maths:Off Append:Off ] If [ %calcut221 !~ \%calcut221 ]
<予定がない場合>
A35: Variable Set [ Name:%nextevent To:本日これからの予定はありません Do Maths:Off Append:Off ] If [ %samedayevent ~ no ]
A36: If [ %SILENT !~ off ]
A37: Popup [ Title:次の予定 Text:%nextevent Background Image: Layout:Popup Timeout (Seconds):5 Show Over Keyguard:On ]
A38: Wait [ MS:0 Seconds:3 Minutes:0 Hours:0 Days:0 ]
A39: ElseA40: Say [ Text:%nextevent Engine:Voice:jp.kddilabs.n2tts:jpn-JPN-F01 Stream:3 Pitch:5 Speed:5 Continue Task Immediately:Off ]A41: End IfA42: If [ %eventdate32 ~ 終日 ]A43: Goto [ Type:Action Label Number:1 Label:開始時刻取得 ]A44: End IfA45: Return [ Value:1 Stop:Off ]
※当然のことながら日本語用TTS(テキスト読み出しエンジン)を設定しておく必要があります。本例では「N2」が設定されている前提で設定を行っています。
他の設定に代えたい場合は、A40の部分を適宜改変してください。
最後にお決まりですが、当研究所は上記タスクの正常動作を一切保証いたしません。ご利用になる方は、個人の責任においてご利用願います。
これはすべて個人の暴走である。
[https://www.blogmura.com/ にほんブログ村 ] ←クリックしていただければありがたく