どのサイトを見ても出来ない、出来ないと書いてあるが、結論から言えば内容の表示は出来る。ただし、なかなかのピタゴラシステムで実現する必要がある。よって各サイトの「出来ない」というのも嘘ではない。
常時カレンダーを表示したかっただけなのに…
私は予定関係のタスクが苦手である。上手く予定をこなするためには日常生活にGoogleカレンダーを取り入れなければならない!、それならばモニタに常に予定を表示すると良いはずと思い、中古のGoogle Nest Hubを購入した。カレンダー常時表示は普通のニーズだし、当然に出来るでしょうと思い可能かどうか調べることもしなかった。
しかし現実はそうではなかった。どのサイトを見ても出来ないと書いてある。そんな馬鹿な…、と呆れると同時に悲しい気持ちになった。デバイス自体リリースから結構時間が経過しているし、レイオフが続くGoogleがこんな細かな改善を入れてくれるはずがないと思ったからだ。
あ〜無駄金かムカつくな〜許せんな〜と思っていたが、私が見たいのはGoogleカレンダーではなくてGoogleカレンダーに登録した予定が見たいのだということに気づき、瞬時にGoogleカレンダー"の内容"を常時表示する作戦を思いついた。
必要なもの
- Google Nest Hub
- Google Nest Hub のGoogleフォトの特定のアルバムを常時表示する機能(標準機能)
- Google Apps Script
- Google Calendar API
- Google Slides API
- Google Photos Library API
- Google Drive API
作戦立案詳細
Nest Hub は一定時間操作がなく待機状態になると必ずフォトフレームモードになる。ここは揺るがせない仕様なわけである。であればやるべきことは至極単純で、ここにGoogleカレンダーの予定を画像化したものを出せれば良い。また、任意の画像を表示させる機能として「指定のアルバムのみを表示する機能」が提供されていることもわかった。
となると次に調べるべきことは「APIから特定の画像をGoogleフォトのアルバムに追加することができるか」「カレンダーの予定を画像化できるか」である。それが分かれば実現可能性がぐんと上がる。
幸いにして画像化はSlides APIを使ったら可能であることがわかっていたし、Calendar APIのこともまあまあ知っていたので可能であると断定。前者についてもPhotos API で画像投稿とアルバムへの追加操作が可能だったので作り始めることにした。
処理過程
- Calendar APIを叩き、表示すべき予定に更新がないかチェックする
- 更新があれば Drive API を叩き、テンプレートスライドを2ファイルコピーする
- Slides APIでスライドの中身をカレンダーの予定に置換する
- スライドを画像化し、Googleフォトにアップロード、アルバムに紐づける
- Drive APIでスライドファイルを削除する
- 古い予定画像をアルバムから削除しゴミ箱アルバムに紐づける
以上の処理をGoogle Apps Scriptで定期的に実行する。
翻弄させられた仕様達
アルバムに画像が1枚しかないと勝手にアートギャラリーモードになる
1枚だけ画像を設定しているアルバムをフォトフレームに設定すると何故かその画像が全然表示されず名画などが表示させるアートギャラリーの画像が表示される。設定壊れてるのか?と思ったけど2枚以上画像があると意図通りに動作する事が分かった。
同じ画像は受けつけない Google PhotoAPI
Googleフォトは大変ありがたいことに同じ画像を複数枚アップロードしない仕組みになっている。これはAPI経由でも同じであった。しかし前述の通りアルバムには2枚画像を登録しなければならない。そのため、目に見えない小さな違いを画像に含ませるようにしてこの制限を回避した。
画像削除機能が提供されていない Google Photos API
新しい予定画像に更新したら古い予定画像は削除されてほしいが、Google Photos APIでは削除APIが提供されていない。そのため、古い画像はゴミ箱アルバムを作成しそちらに紐づけることで一括削除を容易に実行できるようにした。
感想
デバイスが届いた翌日には実装完了して動作しているので達成感はある。想定通り便利だし。が、Googleが普通に実装してくれ!と思う。