Webアプリ「Reading Tracker」リリースしました

Webアプリ「Reading Tracker」リリースしました

ご利用はこちらから

前記事にて紹介した手順を踏んで制作したのが当Webアプリ「Reading Tracker」になります。公開初期(前記事時点)と比べて、仕様も見た目もずいぶん変わりました。

はじめに

「読書時間を自動で記録できたら便利だな」
そんな思いから、Googleスプレッドシートにデータを書き込むWebアプリを作りました。

開発に使った技術は Google Apps Script(GAS)PHPHTML/CSSJavaScript
GASをWebアプリとしてデプロイし、PHPを中継サーバーに使うことで、
認証を通さずスプレッドシートに安全に書き込める仕組みを構築しています。

完成版はこちら♪(リリースが嬉しくて何度も提示)

開発のきっかけ

もともと読書習慣をつけたいと思っていましたが、Kindleのような電子書籍サービスはAPIが公開されておらず、読書時間を自動で取る仕組みが作れませんでした。

そこで、「自分で作ってみよう」と思い立ち、ChatGPTを相棒にプロトタイプから構築していきました。

全体の構成

Reading Tracker の構成はシンプルです。

HTML + CSS + JavaScript
↓ fetch()
relay.php

Google Apps Script(GAS)

Google スプレッドシート

  • フロントエンド:UI構築(HTML/CSS)+動作制御(JavaScript)
  • PHP:WAF回避とCORS対策を担う中継レイヤー
  • GAS:スプレッドシートへの書き込み・読み出し
  • スプレッドシート:ログの保存先(データベース代わり)

使えるようになるまでの流れ

  1. スプレッドシートを用意(空白でOK)
  2. GASをWebアプリとしてデプロイ(アクセス権:全員)
  3. PHPサーバーに relay.php を配置(CORS対応)
  4. index.html, style.css, app.js を同階層に配置
  5. .js 内でシートURLと relay.php のURLを指定

これで、ブラウザから読書開始・終了を押すだけで、スプレッドシートにデータが記録されます。

実装のポイント

Google Apps Script 側 (doPost(e))

function doPost(e) {
  const mode = e.parameter.mode;
  const ss = SpreadsheetApp.openByUrl(e.parameter.sheetUrl);
  const sheet = findOrCreateTargetSheet(ss);
  ...
}
  • モード別処理(append_start, append_end, verify, delete_row)
  • ヘッダー構造が一致するシートを自動検出
  • 一致しない場合は新しいシートを生成
  • 日本時間(JST)で時刻変換

PHP 側 (relay.php)

<?php
  $url = 'https://script.google.com/macros/s/xxxxxxxx/exec';
  $data = $_POST;
  $options = [
    'http' => [
      'method'  => 'POST',
      'content' => http_build_query($data),
      'header'  => "Content-Type: application/x-www-form-urlencoded\r\n"
    ]
  ];
  $context  = stream_context_create($options);
  $result = file_get_contents($url, false, $context);
  echo $result;
?>

PHPは「GASに直接POSTできない」環境でのCORS回避・WAF対策用。
この1ファイルで通信が安定します。

JavaScript 側 (app.js)

  • fetch()で relay.php にPOST → GAS経由でスプレッドシートへ
  • ローカルに履歴・進行中IDを保持(localStorage)
  • 「照合」ボタンでGASから進行中データを取得・表示
  • 「続ける」「終了」「削除」「×閉じる」などのUI操作をすべてJavaScriptで制御

スプレッドシートの構造

項目名内容
AID一意の識別子
Bタイトル書籍名
C開始日時JST
D終了日時JST
E経過時間(分)自動計算
F状態「進行中」or「完了」
  • 構造が一致するシートに追記
  • 空白シートは自動で初期化して使用
  • 構造が違う場合も新シート生成で安全運用

デザイン面での工夫

  • クラフト紙風の背景と文具感のある配色
  • ボタンはすべて同じ色相系で統一
  • こげ茶文字で柔らかいコントラスト
  • 音(完了/警告)とミュートボタンを搭載
  • 一覧(照合結果)を自動・手動どちらでも閉じられる設計

「使っていて心地よい」UIを目指しました。

今回学べたこと

  • GASを「Webアプリ」として外部通信に活用する方法
  • PHPを介したCORS・WAF回避構成
  • スプレッドシートを“簡易DB”として使う設計思想
  • UIの状態管理(ローカルストレージ・DOM制御)
  • 小規模アプリでも「例外時の挙動」を丁寧に扱う重要性

関連リンク

まとめ

Reading Tracker は「GAS × Web × スプレッドシート」で構築した、軽量かつ実用的な読書記録アプリです。
クラウド上で動くため、インストール不要。コードもすべて公開しているので、学習素材としてもおすすめです。
GASを通じてWebとスプレッドシートをつなぐ体験は、“プログラミングが日常に入り込む”感覚が味わえます。

この記事が気に入ったら
フォローしてね!

share
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする