night and sundial

じゃわじゃわ日記 -the 5th defection-

「myTimeline」の仕様(8/28時点)

jawa-jawa.hatenadiary.jp
 「俺のついったー」の話の続きで、夏にやっていた開発の話。

 今年の5月に作った、Googleフォームとスプレッドシート、そしてGoogle Apps Script(GAS)で構成された、俺の短文ブログ自動投稿システム(「myTimeline」)は、さらに進化して、入力と参照の機能をスマホアプリ化した。7月にGoogle AppSheetでpovoのプロモコード管理アプリを作った流れで、こちらもアプリ化したいという野望が出てきて、8月中旬からぷちぷちと作っていて、8月28日に完成した。

jawa-jawa.hatenadiary.jp

jawa-jawa.hatenadiary.jp

*


 Google AppSheetで作ったアプリ。PCのブラウザからも使用できる。投稿は一応、過去2か月分をここに表示するようにしている。ただし、Google AppSheetではHTMLタグが使用できないので、iframeなどでの他サイトの埋め込みは機能しない。


 投稿フォーム。本文と添付画像(任意)を投稿できる。


 投稿1件の詳細ビュー。

*

 AppSheetでこのアプリを作るにあたって一番悩んだのは、意外にも「投稿にタイムスタンプをつけること」だった。──やりたいことは、

  • 投稿時に、テーブルの[タイムスタンプ]カラムに、投稿時刻を登録したい
  • アプリ側の投稿フォームでは、時刻を、表示したくもないし入力させたくもない

 そんなに難しいこととは思わなかったのだが、これがなかなかできなかった。「投稿した時刻」ではなく「投稿フォームを開いた時刻」が登録されてしまうなど、苦労した挙句、一度は、アプリ側から時刻を渡すのではなく、サーバ側(GAS)で、シートの変更トリガで最終行に現在時刻を追加するというムリヤリな方法で実現してみたが、どうしてもラグが出てしまうし、シートの変更時というトリガは不用意にテーブルを触れなくなる危険があってよろしくない。

 最終的には以下の方法で実現できた。

  • Data画面で、[タイムスタンプ]カラムの、
    • データの型を、"DateTime" ではなく "ChangeTimeStamp" にする
    • "Reset on edit?" のチェックつける
    • "INITIAL VALUE" は "=NOW()" にする
  • フォームのViews画面で、"Column order" を、自動設定のままじゃなくて必要なカラムを並べたうえで、[タイムスタンプ]カラムを削除する

 また、投稿時に添付した画像は従来と同じくGoogleドライブに格納される。画像ははてなフォトライフに連携したいので、それにはGoogleドライブ上のファイルIDが必要になる。Googleフォームからの投稿の場合はテーブルにはURLが登録されたのでファイルIDが簡単に取得できたが、AppSheetからの場合は「[フォルダ名]/[ファイル名]」という形で登録されるという違いがあった。このため、GASで、Googleドライブの特定のフォルダからファイル一覧を取得してファイル名からファイルIDを取得し、さらにはてなフォトライフに連携するまでの処理が、投稿時に自動で動くようにした。

 こういった細かい開発を経て、使い勝手のよい「俺のついったー」ができあがった。──ただ、使ってみて感じた制約として、「アプリ上で投稿の削除ができない」という点がある。したくなる頻度は少ないし、テーブル自体を編集してしまえばなんとでもなるのだが、AppSheetでできると思うんだけどなぜかうまくいかないんだよな。もう一度テーブル構成も考え直して、作り直しをしたい気もするけど、いったんこの開発はこれで一段落にしたい。