タスクが埋もれる問題
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"
body に done か open を指定する。完了にしたタスクをもう一度 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シリーズ
- #1 なぜ2026年にまだChatworkを使い倒しているのか
- #2 chatwork-client-gas、ぶっちゃけいるの?
- #3 ルームの参加者データだけで、組織の人間関係マップを作った
- #4 「Chatworkに確定連絡が来たら請求書を送る」をGASで自動化する
- #5 Chatwork MCPを繋いだら、17ルームの未読が10秒で片付いた
- #6 MCP vs GAS — Chatwork自動化の「正解」はどっちか
- #7 コンタクト承認をn8nで自動化しようとしたら、3つの罠にハマった
- #8 ChatworkにAIチームを住まわせたら、勝手に会話が始まった
- #9 Chatwork 8ルームの全メッセージからFAQ429件を自動抽出した
- #10 Webhook署名検証を入れたら全メッセージが消えた
- #11 過去メッセージを全件取得しようとしたら、APIの「100件の壁」にハマった
- #12 Chatwork APIの「既読」は自分で制御できる
- #13 Chatwork APIのファイル機能、使ったことある?
- #14 n8nで全ルーム巡回
- #15 タスク機能をAPIで使い倒す(この記事)
- #16 MCPを2アカウント同時接続したら、仕事用と事務局用が1画面で回った
- #17 【世界初かもしれない】ChatworkでClaude Code Channelsを実装してみた
- #18 Chatwork × Dify × GASで問い合わせ回答を自動提案する
- #19 RelationMapを夜間バッチで毎日自動更新する
- #20 17記事書いて見えた、Chatwork APIエコシステムに足りないもの
- #21 Googleフォームの回答をChatworkに自動投稿するGAS
- #22 Chatworkの会話を毎日AIが要約してくれる仕組みをn8nで作った話
- #23 chatwork-cliを入れたら、シェルからChatworkが操作できて世界が変わった
- #24 ChatworkのWebhookをn8nで受けるなら、HMAC署名検証は必ずやれ
- #25 Chatwork × GAS × Claude Codeで会員制講座の運用を自動化した