1
1

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シリーズ #2】chatwork-client-gas、ぶっちゃけいるの?——全ソースコード130行を読んで正直に書く

1
Last updated at Posted at 2026-03-11

「Chatwork Client for Google Apps Script」を入れた。

Chatworkのヘルプページに「GASで業務効率化」という記事がある。そこに「ライブラリを追加してください」とスクリプトIDが載っている。公式が案内しているんだから、とりあえず入れる。反射的に入れる。中身を確認する前に入れる。

入れたんだけど、何ができるのかよくわかっていない。なんとなく「これ入れとけばGASからChatwork使えるんでしょ」と思っている。

……心当たり、ないだろうか。

俺の周りにもいる。「GASでChatwork自動化したいんですけど」と相談されて、「まずこのライブラリ入れて」と教えたら、入れただけで満足して帰っていった人。別の担当者は、とりあえずライブラリを入れてsendMessageだけ動かして「自動化できました!」と報告してきた。ルームIDもトークンもコードにベタ書き。エラー処理なし。毎朝同じメッセージが飛ぶだけの通知bot。……まあ、それでも飛んでいるなら立派なものだ。俺だって最初はそこからだった。

最初にsendMessageでメッセージが飛んだとき、正直に言うと嬉しかった。GASのエディタで実行ボタンを押して、Chatworkの画面を切り替えたら、そこに自分のメッセージがある。「おお、飛んだ」。あの瞬間があったから、今がある。このライブラリが最初の一歩を簡単にしてくれたのは事実だ。

でも、そのあと「メッセージの編集ってどうやるんだろう」と思ってドキュメントを探した。見つからない。

ない。そもそも実装されていない。

そこから全ソースコードを読んだ。読み終わるのに3分もかからなかった。ファイルは1つ、client.jsだけ。130行。

今日は、この130行を正直にレビューする。

まず、このライブラリの正体

GitHubリポジトリは chatwork/chatwork-client-gas。Chatwork社の組織アカウント配下にある。

だから「公式ライブラリ」だと思っている人が多い。

公式じゃない。 READMEにはっきり書いてある。

Chatwork社 公式ライブラリではないので使用上起きた問題についての責任は負いかねます。
自己責任での利用をお願いします

Chatwork社の中の誰か——おそらく当時のエンジニア——が個人的に作ってくれたものだ。2017年にv1 API対応の最初のコミットがあって、以来、コミュニティのPRを取り込みながら少しずつ育ってきた。★86、Fork 28。最終更新は2024年8月(本記事執筆時点)。

ちゃんと手が入っている。ここは素直に敬意を払いたい。公式サポートでもないのに何年も面倒を見てくれている。おかげで「GAS Chatwork 連携」でググった初心者が、スクリプトIDをコピペするだけでメッセージを飛ばせるようになった。さっき書いた「飛んだ」の感動も、このライブラリがあったからだ。この功績は大きい。

入れ方(30秒で終わる)

  1. GASエディタを開く
  2. 左サイドバー「ライブラリ」の「+」をクリック
  3. スクリプトIDを貼る:
1nf253qsOnZ-RcdcFu1Y2v4pGwTuuDxN5EbuvKEZprBWg764tjwA5fLav
  1. 「検索」→ 最新バージョンを選択 →「追加」

これだけ。あとは ChatWorkClient.factory({token: 'xxx'}) でクライアントが作れる。

で、何ができるの?

全メソッド、これで全部。

メソッド やること
getRooms() 自分が参加しているルーム一覧を取得
getRoomInfo(room_id) 指定ルームの詳細情報を取得
sendMessage({room_id, body}) メッセージを送信
sendMessageToMyChat(message) マイチャットに送信
getMessages(room_id, force) メッセージ一覧を取得
sendTask({room_id, body, to_id_list, limit}) タスクを追加
getRoomTasks(room_id) ルームのタスク一覧を取得
getMyTasks() 自分のタスク一覧を取得

8つ。

「え、少なくない?」と思ったなら正しい。Chatwork API v2には34のエンドポイントがある。カバレッジは約23%

何ができないの?

ここが本題。「入れたから何でもできる」と思っている人のために、できないことを並べる。

メッセージの編集・削除ができない

送信はできる。でも送ったメッセージを直せない、消せない。botで自動投稿して誤字に気づいたら? 手動でChatworkを開いて直すしかない。

タスクの完了操作ができない

タスクの追加はできる。一覧も取れる。でも「完了」にできない。作りっぱなし。

これが一番痛かった実体験がある。GASでタスクを自動追加する仕組みを組んだ。月末の締め作業を7人のルームに一斉に振る。ちゃんと飛ぶ。問題は、処理が終わったあとにタスクを「完了」にする手段がこのライブラリにないこと。結局、全員に「手動で完了にしてください」と追加メッセージを送るハメになった。タスク自動化なのに最後が手動。 何を自動化したんだという話だ。

既読をつけられない

自動でメッセージを取得して処理した後、既読にしたい。できない。

メンバー一覧が取れない

「このルームに誰がいるか」がわからない。通知先の動的な振り分けができない。

ファイル操作ができない

ファイルの一覧取得もアップロードもない。

ルームの作成・削除ができない

ルーム一覧は取れるが、新しいルームは作れない。

そもそもDELETEメソッドがない

内部を見ると、get(), post(), put() はある。delete() がない。だからDELETEが必要なAPI(メッセージ削除、ルーム退室、招待リンク削除)は全て呼べない

じゃあ、ぶっちゃけいるの?

答えは、「あなたが何をしたいかによる」

ライブラリが合う人

  • GASを触り始めたばかりで、とにかくChatworkにメッセージを飛ばしたい
  • HTTPリクエストの仕組みがよくわからない
  • UrlFetchApp とか JSON.parse とか言われてもピンとこない
  • チームのGASプロジェクトで「Chatworkへの通知」だけ入れたい

この人たちにはありがたい存在だ。2行でメッセージが送れる。

var client = ChatWorkClient.factory({token: 'YOUR_TOKEN'});
client.sendMessage({room_id: 123456789, body: 'Hello from GAS!'});

この手軽さは、直接APIを叩くコードでは出せない。最初の一歩にはこれがいい。

もっとやりたくなった人

  • メッセージの編集・削除もしたい
  • タスクの完了操作をしたい
  • レート制限(300リクエスト/期間)を気にする規模で使う
  • エラーが起きたときに「何が起きたか」を知りたい
  • Chatwork APIの機能をフルに使い倒したい

この人たちは、次のステップに進むタイミングだ。ライブラリの8メソッドに収まらない用途が出てきた瞬間、結局 UrlFetchApp.fetch() で直接書くことになる。ライブラリ経由と直接呼び出しが混在して、コードが散らかる。

ライブラリが悪いんじゃない。やりたいことがライブラリの守備範囲を超えただけだ。

直接叩くと、こうなる

参考までに、UrlFetchApp で直接メッセージを送信するコード。

APIトークンはコードに直書きしない。GASの「プロジェクトの設定」→「スクリプトプロパティ」に CHATWORK_API_TOKEN として保存しておく。

function sendChatworkMessage(roomId, body) {
  var token = PropertiesService.getScriptProperties().getProperty('CHATWORK_API_TOKEN');

  var response = UrlFetchApp.fetch(
    'https://api.chatwork.com/v2/rooms/' + roomId + '/messages',
    {
      method: 'post',
      headers: {'X-ChatWorkToken': token},
      payload: {body: body},
      muteHttpExceptions: true
    }
  );

  if (response.getResponseCode() !== 200) {
    throw new Error('Chatwork API error: ' + response.getContentText());
  }

  return JSON.parse(response.getContentText());
}

15行。確かにライブラリ版の2行よりは長い。でも、エラーが起きたとき何が返ってきたかわかる。レスポンスヘッダからレート制限の残り回数も取れる。全34エンドポイントに同じパターンで対応できる。

補足しておくと、GASのUrlFetchApppayloadにオブジェクトを渡すとapplication/x-www-form-urlencodedを自動で付けてくれる。2025年4月にChatwork APIでcontent-typeの明示が必須化される仕様変更があったが、GASユーザーは実害が少ない。ただし、contentTypeを自分で指定している場合は注意が必要だ。

ライブラリは最初の一歩を楽にしてくれる。でも、その先に道が続いていることを知っておいてほしい。8メソッドの外に、まだ26個のAPIが待っている。

正直、もったいない

ここからは俺の感想。

このライブラリ、もったいない。Chatwork社のGitHubに置いてあるという立地の良さ。★86という認知度。GASユーザーが「Chatwork 連携」で最初にたどり着く場所。

なのに中身は130行、8メソッド。エラーハンドリングは200以外を全部 false で握りつぶす。レート制限対応なし。DELETEメソッドなし。

あと少しなんだ。具体的に言うと、この4つが加わるだけで世界が変わる:

  • タスク完了(PUT /tasks/{id}/status) — タスクの追加から完了まで一気通貫で回せるようになる。月末の締め作業、レビュー依頼、進捗管理。「作って終わり」じゃなくなる
  • メッセージ編集(PUT /messages/{id}) — botの投稿を後から修正できる。定期通知の内容更新、誤字の訂正。「送ったら最後」じゃなくなる
  • 既読化(PUT /messages/read) — 自動処理したメッセージを既読にできる。未読バッジが正しく機能する。「処理したのに未読99+」から解放される
  • メンバー取得(GET /members) — ルームの参加者を動的に取得して通知先を振り分けられる。「全員にメンション」じゃない、賢い通知が作れる

この4つで、「通知を飛ばすだけのbot」が「業務を回すbot」に化ける。

開発者が作ってくれたものを「足りない」と言うのは簡単だ。でも使っている人間として、正直に「ここまで来てるのに惜しい」と思う。愛用しているからこそ、もう少し先まで連れて行ってほしい。

まとめ

やりたいこと ライブラリで足りる?
メッセージ送信だけ ✅ 十分
タスク追加 + 一覧取得 ✅ できる
メッセージ編集・削除 ❌ 無理
タスク完了操作 ❌ 無理
ファイル操作 ❌ 無理
既読化 ❌ 無理
メンバー一覧取得 ❌ 無理
本格的な自動化全般 ⚠️ 途中で限界が来る

「入れたら何でもできる」は誤解。入れたらメッセージが送れる。 それ以上を求めるなら、APIと直接向き合う覚悟がいる。

でも、その覚悟ができたとき、Chatwork APIは思ったより楽しい場所だったりする。


Chatwork APIは、使い倒してみて初めてわかることが多い。このシリーズではそういう話を一つずつ書いていく。


Chatworkシリーズ

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?