スキップしてメイン コンテンツに移動

MacroDroidで予定を読み上げてもらうマクロを少し変更しました(配列/連想配列を繰り返すって便利ですね)

 GeminiからGoogleホームへの連携がイマイチになったので、MacroDroidで予定を読ませるマクロを作ったんですが、


予定を配列変数{全予定}に取り込んだ後に、

・予定数を変数{予定個数}に格納

・変数{ループカウント}をリセット

┏ループ開始:変数{ループカウント} < 変数 {予定個数}

┃テキストを読み上げる:{lv=全予定[{lv=ループカウント}][Title]

┃変数{ループカウント} + 1

┗ループ終了

と言うアクションをしていました。


でも、

配列/連想配列を繰り返す

と言う、物凄く便利そうなアクションがあることに気付きました。


試しに使ってみました。

折角なので、予定の読み上げはサブルーチン化して、

①予定を確認するマクロ

②予定を取得するマクロ

③予定を読み上げるマクロ(アクションブロック)

にしました。


これで、①のロジックを複数のマクロに入れても、②と③は共通で使えます。


①予定を確認するマクロ

簡単に言えば、②のマクロを実行する(アクションの下から2行目)だけです。

でも、呼び出す時刻で、今日の予定を知りたいのか、明日の予定を知りたいのかが変わってくるので、 取得する予定のオフセットをグローバル変数{スケジュールオフセット}で指定できるようにしました。アクションの下から4行目ですね。このマクロは朝しか実行しないので、取得したいのは今日の予定です。なので、今の時刻{hour}に"-"を付加して、ほぼ今日の0時からの予定を取得するようにしています。


 ②予定を取得するマクロ

予定の取得は取得したいカレンダーの数が多いと長くなってきます(対象カレンダーを変数や配列で指定することができないので個別のロジックが必要ですね)。

でも、個々の取得ロジックは至ってシンプルです。

カレンダーの予定を取得アクション(アクションの3行目)をするだけです。  取得した予定をグローバル変数{取得予定(共通)}に格納しています。

予定の件数を読み上げさせるのも至って簡単でした。グローバル変数{取得予定(共通)}の前に"size="を付与するだけで配列数が得られます(アクションの4行目)。

後は、③を実行するだけです。


カレンダー予定を取得するアクションですが、

・オフセット開始(分 | 時 | 日)

・持続時間(分 | 時 | 日)

が指定できます。

オフセット開始は、「いつからの予定を取得するか」で、マイナス指定なら現在から何分(時や日も可)前からの予定を取得し、プラス指定(プラス記号は不要です)なら現在から何分(時や日も可)後からの予定を取得します。

持続時間は、オフセット開始で指定した開始日時から何分(時や日も可)後までの予定を取得するかになります。

 


取得された予定は指定した連想配列に格納されます。

画像は取得した予定が1件の場合で、複数ある場合は0~の複数個が格納されます。


各予定はカレンダーに登録した情報が取得されます。

今回取得した情報はGoogleカレンダーなので、他のカレンダーから情報を取得した場合はキーが異なるのかも知れません。

タイトル[Title]や場所[Location]は扱いやすいんですが、開始[Start]や終了[End]は文字列操作しないと扱いづらい形式ですね。タイムスタンプはシリアル値だと思うので、シリアル値から年月日時分秒に変換する手もアリかも。


③予定を読み上げるマクロ(アクションブロック)

このマクロでグローバル変数{取得予定(共通)}に格納された予定を読み上げます。

 ここで

配列/連想配列を繰り返す

を使ってます。

もう、配列の件数を取得する必要も無いし、ループカウントをインクリメントしながらループ判定で繰り返す必要もありません。

このループの中で予定を読ませるだけです。

読ませるのは予定のタイトルだけなので、キーは[Title]です。

で、配列の何個目なのかも指定する必要があります。

変数はグローバルなので、変数の値は

{v=取得予定(共通)

で取得できます。ローカル変数の場合は

{lv=変数名

です。"v"はValueで値の意味だと思います。

で何個目なのかは

{iterator_array_index}

で指定できるそうです。iteratorは繰り返し処理の場合に使えるマジックテキストのようです。arrayは配列ですね。indexが何個目なのかになるんでしょう。

{ }の中が一つの変数(マジックテキスト?)になるようです。

連想配列なので

{v=変数名[イデックス][キー] }

で設定するらしい。 

これらを使って読ませたい予定のタイトルを指定すると

{v=取得予定(共通)[{iterator_array_index}][Title]}

になります。  

どうすれば目的のタイトルが読まれる指定になるのかで悩みましたが、お作法が分かれば至って簡単でしたね。


ちなみに、繰り返しで使われる

iterator

は一つのマクロで共通的に使われるため、ループをネストさせたりすると正しく動かなくなります。ってGeminiに言われて予定の読み上げをアクションブロックに外出ししたんですね。

と言うのも、取得するカレンダー(カレンダーの指定だけは変数では出来ません)の情報(個人や業務など)を配列に入れて、

「(個人)予定はX件です」

って読ませる部分をループの共通処理にしようとしていたんですね。

でも、どうやら、

iterator

は一つのマクロで共通的に使われているのではなく、一連の動作で共通的に使われているようで、

予定取得ループ -> 予定読み上げループ

のロジックにしたら正しく動きませんでした。


コメント