0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Chatworkシリーズ #15】タスク機能をAPIで使い倒す — 期限切れを自動検知してリマインドする

0
Last updated at Posted at 2026-03-22

タスクが埋もれる問題

Chatworkのタスク機能、使っているだろうか。

メッセージの右上にある「タスク追加」ボタン。押したことはある。期限も設定した。そして忘れた。1週間後にルームを開いたら、期限切れのタスクが3つ赤くなっていた。

チャットツールのタスク機能は、作るのは簡単だが管理が難しい。ルームが増えるとタスクが散らばる。期限を過ぎても通知が来ない。「見に行かないと気づかない」という致命的な欠点がある。

APIで解決した。全ルームのタスクを定期的に取得し、期限切れ・期限間近のタスクを自動でリマインドする仕組みを作った。

Chatwork タスクAPIの全体像

タスク関連のエンドポイントは4つある。

GET    /rooms/{room_id}/tasks          # ルーム内タスク一覧
POST   /rooms/{room_id}/tasks          # タスク作成
GET    /rooms/{room_id}/tasks/{task_id} # タスク詳細
PUT    /rooms/{room_id}/tasks/{task_id}/status # 完了/未完了の切り替え

加えて、自分に割り当てられたタスクを横断的に取得するエンドポイントがある。

GET    /my/tasks    # 自分のタスク一覧(全ルーム横断)

この /my/tasks が地味に強力だ。ルームをまたいで自分のタスクを全部取れる。

タスク一覧を取得する

まずは基本。ルーム内のタスク一覧を取得する。

curl -s -X GET \
  "https://api.chatwork.com/v2/rooms/{room_id}/tasks?status=open" \
  -H "X-ChatWorkToken: ${CHATWORK_TOKEN}" | jq .

レスポンスはこうなる。

[
  {
    "task_id": 123456,
    "account": {
      "account_id": 11111,
      "name": "担当者A"
    },
    "assigned_by_account": {
      "account_id": 22222,
      "name": "依頼者B"
    },
    "message_id": "999999",
    "body": "来週までに見積書を送る",
    "limit_time": 1711324800,
    "limit_type": "date",
    "status": "open"
  }
]

ポイントは3つ。

status パラメータ: open(未完了)と done(完了)でフィルタできる。省略すると全件返る。期限管理が目的なら open だけ取ればいい。

limit_time: UNIXタイムスタンプ。0なら「期限なし」。期限ありのタスクだけ管理したいなら limit_time > 0 でフィルタする。

limit_type: date(日付指定)か time(時刻指定)。日付指定だと、その日の23:59:59が期限になる。

全ルーム横断で自分のタスクを取る

/my/tasks を使うと、全ルームの自分のタスクを一発で取れる。

curl -s -X GET \
  "https://api.chatwork.com/v2/my/tasks?status=open" \
  -H "X-ChatWorkToken: ${CHATWORK_TOKEN}" | jq .

レスポンスにはルーム情報も含まれる。

[
  {
    "task_id": 123456,
    "room": {
      "room_id": 444444,
      "name": "プロジェクトA",
      "icon_path": "..."
    },
    "assigned_by_account": {
      "account_id": 22222,
      "name": "依頼者B"
    },
    "body": "来週までに見積書を送る",
    "limit_time": 1711324800,
    "limit_type": "date",
    "status": "open"
  }
]

どのルームのタスクかがわかるので、横断管理に使える。ルームが10個あっても、APIコールは1回で済む。

タスクを作成する

メッセージ経由ではなく、APIから直接タスクを作れる。

curl -s -X POST \
  "https://api.chatwork.com/v2/rooms/{room_id}/tasks" \
  -H "X-ChatWorkToken: ${CHATWORK_TOKEN}" \
  -d "body=月次レポートを作成する" \
  -d "to_ids=11111,22222" \
  -d "limit=1711324800" \
  -d "limit_type=date"

to_ids: カンマ区切りで複数人に割り当てられる。同じタスクを5人に一括で振れる。手動でポチポチやるより圧倒的に早い。

limit: UNIXタイムスタンプ。人間が日付を入力する場合はGASやスクリプト側で変換する。

// 「3日後の23:59」をUNIXタイムスタンプに変換
const limit = Math.floor(
  new Date(Date.now() + 3 * 86400000).setHours(23, 59, 59, 0) / 1000
);

タスクの完了/未完了を切り替える

curl -s -X PUT \
  "https://api.chatwork.com/v2/rooms/{room_id}/tasks/{task_id}/status" \
  -H "X-ChatWorkToken: ${CHATWORK_TOKEN}" \
  -d "body=done"

bodydoneopen を指定する。完了にしたタスクをもう一度 open に戻すこともできる。

ここで一つ罠がある。タスクの完了は、そのタスクの「担当者」か「依頼者」しかできない。 第三者が他人のタスクを完了にしようとすると 403 Forbidden が返る。管理者権限があっても関係ない。複数人分のタスクを一括完了しようとしたときに、自分が依頼者でも担当者でもないタスクだけ弾かれる。最初はバグかと思った。

GASで期限切れ検知スクリプトを書く

ここからが本題。全ルームのタスクを取得して、期限切れ・期限間近を検知し、自動でリマインドする。

function checkOverdueTasks() {
  const TOKEN = PropertiesService.getScriptProperties()
    .getProperty('CHATWORK_TOKEN');
  const REMIND_ROOM_ID = '自分の通知用ルーム';
  const now = Math.floor(Date.now() / 1000);
  const tomorrow = now + 86400;

  // 自分のタスクを全ルーム横断で取得
  const tasks = fetchMyTasks(TOKEN);

  const overdue = [];
  const dueSoon = [];

  tasks.forEach(task => {
    if (task.limit_time === 0) return; // 期限なしはスキップ
    if (task.limit_time < now) {
      overdue.push(task);
    } else if (task.limit_time < tomorrow) {
      dueSoon.push(task);
    }
  });

  // リマインドメッセージを組み立て
  if (overdue.length === 0 && dueSoon.length === 0) return;

  let message = '[info][title]タスクリマインド[/title]';

  if (overdue.length > 0) {
    message += '🔴 期限切れ:\n';
    overdue.forEach(t => {
      const date = new Date(t.limit_time * 1000);
      const dateStr = Utilities.formatDate(date, 'Asia/Tokyo', 'MM/dd');
      message += `・${t.body}${dateStr}期限 / ${t.room.name})\n`;
    });
  }

  if (dueSoon.length > 0) {
    message += '\n🟡 明日まで:\n';
    dueSoon.forEach(t => {
      const date = new Date(t.limit_time * 1000);
      const dateStr = Utilities.formatDate(date, 'Asia/Tokyo', 'MM/dd HH:mm');
      message += `・${t.body}${dateStr}期限 / ${t.room.name})\n`;
    });
  }

  message += '[/info]';
  postMessage(TOKEN, REMIND_ROOM_ID, message);
}

function fetchMyTasks(token) {
  const url = 'https://api.chatwork.com/v2/my/tasks?status=open';
  const res = UrlFetchApp.fetch(url, {
    headers: { 'X-ChatWorkToken': token }
  });
  return JSON.parse(res.getContentText());
}

function postMessage(token, roomId, body) {
  UrlFetchApp.fetch(
    `https://api.chatwork.com/v2/rooms/${roomId}/messages`,
    {
      method: 'post',
      headers: { 'X-ChatWorkToken': token },
      payload: { body: body }
    }
  );
}

GASのトリガーで毎朝9時に実行する。朝一でチャットを開いたら、期限切れタスクの一覧が目に入る。「見に行かないと気づかない」問題が消える。

落とし穴:APIレート制限とタスク取得上限

レート制限

Chatwork APIのレート制限は5分間に300リクエスト。/my/tasks は1回のAPIコールで全ルームのタスクを取れるので、期限チェックだけなら余裕で収まる。

ただし、ルームごとにタスクを取得する方式だと話が変わる。20ルーム × 1リクエスト = 20リクエスト。これを5分おきに回すと、他のAPI処理と競合する可能性がある。横断取得には /my/tasks を使え。

タスク取得の上限

/my/tasks は最大100件を返す。タスクが100件を超えている場合、古いものから取れなくなる。実運用では100件を超えることは少ないが、長期間完了しないタスクが溜まっていると起きうる。

対策は2つ。定期的に完了済みタスクを整理すること。もう一つは、ルーム単位での取得(/rooms/{room_id}/tasks)を併用すること。こちらも上限100件だが、ルームを指定できるぶん、取りこぼしを防げる。

応用:タスクの自動作成

手動でタスクを作るのは面倒だ。定例作業のタスクは自動で作ってしまえばいい。

function createMonthlyTasks() {
  const TOKEN = PropertiesService.getScriptProperties()
    .getProperty('CHATWORK_TOKEN');
  const ROOM_ID = '対象ルーム';

  // 月末のタイムスタンプ
  const now = new Date();
  const lastDay = new Date(now.getFullYear(), now.getMonth() + 1, 0, 23, 59);
  const limitTs = Math.floor(lastDay.getTime() / 1000);

  const monthlyTasks = [
    { body: '月次レポート提出', to: '11111' },
    { body: '経費精算', to: '11111,22222' },
    { body: '来月の予算申請', to: '33333' }
  ];

  monthlyTasks.forEach(task => {
    UrlFetchApp.fetch(
      `https://api.chatwork.com/v2/rooms/${ROOM_ID}/tasks`,
      {
        method: 'post',
        headers: { 'X-ChatWorkToken': TOKEN },
        payload: {
          body: task.body,
          to_ids: task.to,
          limit: limitTs.toString(),
          limit_type: 'date'
        }
      }
    );
    Utilities.sleep(1000); // レート制限対策
  });
}

月初にトリガーで回す。月末期限のタスクが自動で3つ作られる。担当者にはChatworkの通知が飛ぶ。「今月もよろしく」を自動化した形だ。

まとめ

  • /my/tasks で全ルーム横断のタスク取得。ルームごとに叩く必要なし
  • 期限切れ検知はGASのトリガー × /my/tasks × limit_timeの比較。毎朝自動リマインド
  • タスク作成もAPIで自動化できる。定例タスクを月初に自動生成
  • 落とし穴は「他人のタスクは完了にできない」と「上限100件」の2つ
  • Chatworkのタスク機能は手動だと埋もれる。APIで管理すると、埋もれない仕組みになる

タスクを手動で追いかけるのは、自動化できる作業の中で最も報われない行為だと思う。期限切れに気づくのは人間の仕事じゃない。


Chatworkシリーズ

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?