LINE WORKSタスク連携ダッシュボードのスクリーンショット

ミズホアプリ。
紙のToDoとカレンダーを、LINE WORKSで一枚に。

社内で使っている LINE WORKS の「タスク」と「カレンダー」を、 Androidアプリ・PHPサーバ・Roomデータベースで一つのタイムラインにまとめた社内向けダッシュボードです。
OAuth2で安全にログインし、LINE WORKS APIと自前のPHPスクリプトで束ねたタスク群をローカルDBに保存。 いつでもどこでも「やること」と「入っている予定」を一望できることを目指しました。

作品の説明

仕事では「タスク管理」と「カレンダー」が別々のサービスになりがちで、 結局は紙のメモや口頭で補ってしまうことが多くあります。
このミズホアプリは、LINE WORKS のタスク機能とカレンダー機能を API 経由でまとめ、 「案件・カテゴリごとにタスクと予定を紐付けて眺められる」ことをコンセプトに作りました。

Android 側では OAuth2 認証でアクセストークン・リフレッシュトークンを取得し、 PHP サーバ上の syncTasks1.php に JSON を投げることで、 社内ルールに沿ったタスク束(カテゴリ+タスク+紐付いた予定+紐付いていない予定)を一括取得します。 結果は Room データベースに保存し、オフラインでもカテゴリツリーとして閲覧できます。

  • ① OAuth2 で LINE WORKS にログイン
  • ② /users/me /users/{id}/calendar-personals などからID情報を取得
  • ③ Android→PHP(syncTasks1.php) へ JSON POST
  • ④ PHP でタスク・カレンダーを結合し TaskSyncResponse を返す
  • ⑤ Android で TaskSyncResponse を Room に保存
  • ⑥ Jetpack Compose でカテゴリ→タスク→予定のツリーを表示
  • ⑦ チェックボックス操作でタスク完了/取り消しを LINE WORKS に反映
  • ⑧ 新しいタスク・予定はそのまま LINE WORKS へ作成

システム概要

ミズホアプリ システム構成図

Android(Jetpack Compose)・LINE WORKS API・PHPサーバ(syncTasks1.php)・ MySQL/Room データベースの関係をまとめた構成図です。 スマホ上の「ミズホアプリ」が認証と同期のハブになっています。

技術スタック

  • Android / App: Kotlin, Jetpack Compose, Room, OkHttp, Coroutines
  • API / Auth: LINE WORKS API(OAuth2, /users/me, /tasks, /task-categories, /calendar-personals, /calendars/{id}/events)
  • Server: PHP(syncTasks1.php), JSON, MySQL(タスク分類やコード変換表)
  • Data Model: TaskSyncResponse(CategoryBundle, TaskBundle, TaskEvent)

主要コンポーネント

  • ミズホアプリ(Androidクライアント): LINE WORKSへのログイン、タスク・予定の同期、新規タスク/予定登録、 チェックボックスでの完了操作を担当します。
  • LINE WORKS API: 社内で既に使っているグループウェア。 タスク・カレンダー・カテゴリ情報の正本として利用します。
  • syncTasks1.php(レンタルサーバ): Androidから受け取った userId / calendarIds / accessToken をもとに、 タスクとカレンダーをいい感じに束ねて TaskSyncResponse として返す集約レイヤです。
  • Room データベース: CategoryEntity / TaskEntity / EventEntity を持ち、 1回同期した内容はオフラインでも閲覧できるようにします。

技術解説

AUTH / TOKEN

OAuth2 + リフレッシュトークンで「常に有効な」アクセストークンを維持

LINE WORKS の OAuth2 で access_token / refresh_token を取得し、 SharedPreferences に保存しています。 API呼び出し前には ensureAccessToken() を必ず通し、 有効期限が切れていれば refreshAccessTokenBlocking() でリフレッシュ。 「気付いたら全部401で落ちていた」を避ける作りにしました。

TASK AGGREGATION

TaskSyncResponse:カテゴリ+タスク+予定をひとまとめにしたスキーマ

タスクAPIとカレンダーAPIをそのまま叩くと、フロント側での突き合わせが大変です。 そこで PHP 側に syncTasks1.php を置き、 TaskSyncResponse > CategoryBundle > TaskBundle > TaskEvent というツリー構造に整理してから返す設計にしました。
Android ではそのまま Room に保存し、 Compose 側では CategoryWithTasksAndEvents として展開して表示します。

ROOM / OFFLINE

Room によるカテゴリツリーの永続化とオフライン閲覧

同期結果は CategoryEntity, TaskEntity, EventEntity の3テーブルに分けて保存し、 @Relation を使って CategoryWithTasksAndEvents としてツリーで取得できるようにしました。
アプリ起動時はまず Room から読み込み、必要に応じて同期ボタンでサーバと揃える「オフラインファースト」な設計です。

COMPOSE UI

Jetpack Compose でカテゴリ/タスク/予定をアコーディオン表示

UI はすべて Jetpack Compose で記述。 CategoryAccordionItem でカテゴリ単位の折りたたみ、 TaskItemRow でチェックボックス付きタスク行を実装しました。
新規タスク・新規予定はそれぞれ NewTaskScreen / NewEventScreen として 画面を分離し、入力完了後は LINE WORKS API に POST します。

実験・結果・課題

同期画面とカテゴリツリー表示

実際に社内 LINE WORKS アカウントでログインし、カテゴリ・タスク・予定の同期とツリー表示を確認しました。

同期前のタスク一覧画面
(a) 同期前:ローカルDBのみ
同期後のタスク一覧画面
(b) 同期後:カテゴリ+タスク+予定が展開

完了チェックのAPI連携

タスク行のチェックボックスを ON/OFF すると、 即座に tasks/{taskId}/complete / tasks/{taskId}/incomplete を叩き、 サーバ側のステータスも連動することを確認しました。

タスク完了チェックのデモ
完了→取り消しの連打に対しても API が落ちないよう実装を調整中。

現在の課題

現状は「クライアント側から手動同期」を前提にしていますが、 実運用では定期同期や差分同期、二重起票の防止など、もう一段階踏み込んだ運用設計が必要です。
また、syncTasks1.php で扱う MySQL テーブルも暫定設計のため、 取引先コード変換表などを含めて再設計する余地があります。

差分同期・自動同期は未実装 MySQL側のスキーマ整理

動作デモ

認証→同期→カテゴリ展開→タスク完了チェック→新規タスク作成までをまとめたデモ動画です。

LINE WORKS ログイン〜初回同期
カテゴリツリーと完了チェック

ログ可視化(サーバ側)

PHP サーバ側では、どのユーザがいつ同期したか、 どの calendarId を対象にしたかをログとして残し、 後から運用上の問題を追いやすい形にしています。

サーバログ画面
syncTasks1.php のアクセスログとレスポンス時間の例。

まだできていない部分と今後

「案件単位のダッシュボード」への拡張

今は「カテゴリ × タスク × 予定」という構造ですが、 実際の業務では「案件」「取引先」「担当者」など、別の軸からも眺めたい場面が多くあります。
今後は MySQL 側の取引先コード変換表と組み合わせて、 「〇〇社の案件だけを絞り込んだ週次ダッシュボード」のような粒度で見られるUIに発展させたいと考えています。

  • 短期: MySQLテーブルの整理・syncTasks1.php のリファクタリング
  • 中期: 案件/取引先単位でのフィルタリング・集計機能
  • 長期: LINE WORKS以外の社内ツールとも連携した「社内統合ダッシュボード」へ拡張

これからの改善点と開発計画

このアプリの開発ロードマップを、 認証・同期基盤・UI改善・サーバ側整備の4つに分けて整理しました。

  • Auth: クライアントシークレットのサーバ移行、より安全なトークン管理
  • Sync: 差分同期・バックグラウンド同期、エラーリトライ戦略の導入
  • UI: 週/月ビュー、ガントチャート表示、タグ・検索機能
  • Server: syncTasks1.php の API 化と CI/CD、監視の導入
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Authまわりの安全化
差分同期ロジックの実装
案件ビュー / 絞り込みUI
サーバ監視・ログ基盤

このプロジェクトを通して

「会社の現場」と「自分の技術」がちゃんとつながった感覚

LINE WORKS API、OAuth2、Room、PHP、MySQL……と技術スタックは盛りだくさんですが、 実際に会社のタスクや予定が自分のアプリに流れてきたとき、 「ああ、自分のコードが現場とちゃんとつながったな」と実感しました。

・OAuth はドキュメントが長くて何度も心が折れかけたけれど、
・一度フローを理解してしまえば、他のサービスにも応用できる強い武器になると感じました。
・「ただ動けばいい」ではなく、「運用したときにどうなるか」を考えながら設計する練習にもなりました。

今の自分へのメモ

  • ・syncTasks1.php の中身もちゃんとドキュメント化しておこう。
  • ・「差分同期」に手を出す前に、現場での運用フローをもう一度聞いておくこと。
  • ・このアプリをベースに、他の社内ツールともつなげられるようにしていきたい。

リファレンス & リンク

リファレンス

  • LINE WORKS Developer Guide(Tasks / Calendar / OAuth2)
  • Jetpack Compose / Room / Kotlin Coroutines 公式ドキュメント
  • PHPマニュアル(cURL / JSON / PDO)

リンク