GAS スプレッドシートにスケジュール一覧記入 ➡ カレンダーに自動追記 ➡ Amazon Alexaにスケジュール読み上げ計画

私自身年間のスケジュールをGoogleのスプレッドシートに一覧記入している。
これはこれで便利なのだ。
いつでもどこでも、PCやスマホで記入、確認きるし、シンプルで管理も簡単。

しかしこれを少しバージョンアップしたくなった。
先日、安売りで購入したAmazon Echo Show 5のAlexaにスケジュールを読み上げて欲しくなったのだ。

Googleのスプレッドシートはこんな感じ。
各スケジュールを背景色で色分けしている。対応したイベント予定に背景色を変えると、Googleカレンダーに転記する仕組み。

Googleスプレッドシート

Googleカレンダー

『今日は〇〇〇〇の予定があります♬』などと。
Amazon Echo Show 5はGoogleカレンダーと連動してスケジュールを読み上げることが可能で、Googleのスプレッドシートの内容を変更時に自動でGoogleカレンダーへ転記できればOKだ。
ということで、Googleのスプレッドシートにスクリプトを書き始めた。

簡単そうに見えて幾つか、はまった所を未来の自分か何処かの誰かに覚書。

カレンダーの共有にはまった!

GoogleカレンダーはIDをもっており、そのIDによってGASから操作可能となる。
上記のスプレッドシートのgoogleアカウントとAlexaに読ませるGoogleカレンダーはセキュリティの関係で別アカウントにしている。
GASはスプレッドシートに書かれているので、GoogleカレンダーのIDを設定してスプレッドシートのアカウントを共有すればよいと思っていた。
しかしこれが上手くいかない。
書き込めるはずのGoogleカレンダーに書き込めないのだ。
色々試して、エラーの原因は、

Googleカレンダーはスプレッドシートユーザーでカレンダー内に読み込む必要があり、単にGoogleカレンダーのオーナー側で共有設定するだけではダメなのだ。

イベントは配列

こちらも一瞬はまった。30分ほど…
カレンダーイベントの重複追記を避けるために、特定の条件下でイベントの削除を行うが、この削除が上手くいかない。
イベントの取得と削除は以下のコード。

var events = calender.getEventsForDay(date);

for (var i in events) {
  events[i].deleteEvent();
}

つまり、dateで特定の終日イベントが取り出せ、deleteEvent();できるとおもったが、イベントは複数存在する前提なので、配列として格納されている。


そのためeventsは配列となり、例えば終日全削除する場合はfor in で配列を回す必要があるのだ!!

、、とそんなに難しい話ではないが、一年に一度プログラマーの私としてはちょっと覚書。

何とか完成し、これから毎朝Alexaに忘れず声がけしてもらえる、ハズだ。

おすすめ