Claude×LINE連携をGASで実装|送るだけでタスク自動登録
Claude Codeとやり取りしながら仕事をしていると、自然とタスクが増える。「あとでこれをやる」「次回の打ち合わせで確認する」「このクライアントへの提案書を来週までに作る」。
問題は、このタスクが「頭の中にある」か「チャットの流れの中に埋まっている」かのどちらかになることだ。Notionを開くか、スプレッドシートを開いてタスクを入力する、という2ステップが毎回必要になる。忙しいときほど、この2ステップが面倒で後回しになる。
「Claudeとのやり取りの中から直接タスクを登録できたら」というニーズがあった。同時に「外出中にLINEからもタスクを追加できたら」という需要もあった。この2つを一つのシステムに統合したのが、Claude×GAS×LINEのタスク自動登録システムだ。
最初に作ったのはClaude→GASの連携
Claude Codeのターミナルからタスクを登録できる仕組みを先に作った。
構成はシンプルだ。GASでWeb Appを作成し、Googleスプレッドシートにタスクを追記するエンドポイントを用意する。Claude Codeから「タスク追加」という指示があれば、PythonでそのエンドポイントにPOSTする。
タスクのデータ構造は次の通りだ。
- タスク内容:何をするか
- 依頼者:誰からの依頼か(Claudeターミナルからの場合は「Claude Terminal」固定)
- 期限:いつまでか(省略可)
- 優先度:高/中/低(省略可)
- 懸念点:注意事項や不安な点(省略可)
- 担当者:誰がやるか(省略可)
期限がある場合は、Googleカレンダーにも終日イベントとして自動登録する。これで「スプレッドシートを見忘れていたが、カレンダーには出ていた」という二重のセーフネットができた。
curlが使えないという予期しない問題
実装中に想定外の問題にぶつかった。GASのWeb Appへの投稿をcurlコマンドで行おうとしたら、うまくいかなかった。
原因はGASのリダイレクト仕様だ。GASのWeb AppにPOSTリクエストを送ると、一度リダイレクトが発生する。curlはリダイレクト後のPOSTをGETに変換してしまう。つまり、curlでPOSTしてもGASはGETとして受け取り、doPostではなくdoGetが呼ばれてしまう。
解決策はPythonでの送信だった。urllib.requestを使ってPOSTを送ると、リダイレクト後もPOSTのまま処理される。
この制約はGASのWeb Appを使う上での重要な知識だ。curlで動かないとき、curlの問題ではなくGASのリダイレクト仕様が原因であることが多い。
LINEからも同じシートに集約する仕組み
Claude Codeからの登録が動くようになってから、次のフェーズに入った。外出中にLINEからタスクを追加できる仕組みだ。
LINEからのタスク追加は、LINE公式アカウントとGASを連携させる。LINEにメッセージを送ると、GASのdoPost関数が受け取り、スプレッドシートに追記する。
重要な設計判断は「同じスプレッドシートに書き込む」ことだった。Claude Codeから登録したタスクとLINEから登録したタスクが同じシートに並ぶ。管理の一元化だ。どこから登録しても、確認は一箇所でよい。
Slackへの通知も追加した。タスクが登録されるたびに、Slackの指定チャンネルに通知が飛ぶ。優先度に応じて絵文字を変える(高=🔴、中=🟡、低=🟢)。画面を開かなくても、Slackを見れば新しいタスクが入ったことがわかる。
期限リマインダーで「見落とし」を防ぐ
スプレッドシートにタスクを溜めても、見なければ意味がない。この問題を解決するために、期限リマインダー機能を追加した。
GASのトリガーで毎日決まった時刻にsendDeadlineReminders関数を実行する。スプレッドシートを走査して、期限が3日以内のタスクをSlackに通知する。
「3日前に通知」は意図的な設定だ。当日リマインドでは対応できないタスクがある。3日前なら大抵のタスクは間に合う。
完成した仕組みの全体像
このシステムが完成してからの運用は、次のようなフローになった。
PC作業中にClaudeとやり取りしていて「あとで〇〇をやる」という話になったとき、すぐに「タスク追加: 内容 / 期限 / 優先度」という形式で伝える。ClaudeがPythonでGASに送信し、スプレッドシートとカレンダーに自動登録される。Slackにも通知が来る。
外出中に「あ、これもやらないと」と思いついたとき、LINEに「〇〇する 来週まで」と送る。GASが受け取り、同じスプレッドシートに追記される。
どちらのルートから入力しても、一つのスプレッドシートに集約されている。確認・管理の場所は一つだ。
業務自動化で大切にしたこと
このシステムを作る中で実感したことがある。業務自動化は「難しいツールを導入すること」ではないということだ。
大事なのは「すでに使っているものの延長線上に作る」ことだ。LINEはすでに毎日使っている。Googleスプレッドシートはすでに使っている。Claudeはすでに使っている。これらを繋いだだけだ。新しいツールを覚える必要はなかった。
自動化のハードルが上がる理由の多くは「新しいツールへの移行コスト」だ。既存の習慣にそのまま乗っかれる設計にすれば、継続しやすい。
ClaudeとGASを連携する最小構成
ここまでは実際に作ったものの話ですが、「ClaudeをGASから呼ぶ」だけなら必要なものは2つしかありません。UrlFetchApp と APIキーです。まずこの最小形から始めると、詰まる場所が絞れます。
function askClaude(prompt) {
const key = PropertiesService.getScriptProperties().getProperty('CLAUDE_API_KEY');
const res = UrlFetchApp.fetch('https://api.anthropic.com/v1/messages', {
method: 'post',
contentType: 'application/json',
headers: {
'x-api-key': key,
'anthropic-version': '2023-06-01',
},
payload: JSON.stringify({
model: 'claude-sonnet-5',
max_tokens: 1024,
messages: [{ role: 'user', content: prompt }],
}),
muteHttpExceptions: true,
});
const body = JSON.parse(res.getContentText());
if (res.getResponseCode() !== 200) {
throw new Error(body.error ? body.error.message : res.getContentText());
}
return body.content[0].text;
}
APIキーはコードに直接書かず、スクリプトプロパティ(プロジェクトの設定 > スクリプト プロパティ)に入れます。GASのコードは共有された相手に読まれる前提で書くべきなので、ここは省略しないでください。
muteHttpExceptions: true を付けているのは、エラー時にレスポンスの中身を読むためです。これがないと「例外が出た」ことしか分からず、原因の切り分けに時間がかかります。
LINEから呼ぶ場合に増えるもの
LINEを入口にする場合、上の関数に加えて必要になるのは次の3つです。
- doPost関数:LINEからのWebhookを受け取る入口。GASでは
doPost(e)という決まった名前にします - ウェブアプリとしてデプロイ:「アクセスできるユーザー」を「全員」にしないとLINEから届きません
- 返信用のトークン:LINE Developers で発行するチャネルアクセストークン
LINEは3秒以内に応答がないとタイムアウト扱いにします。Claudeの返答を待ってから返信しようとすると間に合わないことがあるので、先に「受け付けました」と返し、処理は裏で進めてから追って通知する形にすると安定します。
よくある詰まりどころ
この構成で実際に止まった場所を挙げておきます。どれも原因が分かれば数分で直りますが、知らないと長時間はまります。
- curlの例をそのまま貼っても動かない:GASにcurlはありません。UrlFetchApp に読み替えます(この記事の前半で書いたとおりです)
- 実行時間6分の上限:GASは1回の実行が6分で強制終了します。件数が多い処理は分割し、続きを次のトリガーで処理する形にします
- デプロイしたのに古いコードが動く:GASは「新しいバージョン」としてデプロイしないと反映されません。上書き保存だけでは公開側は変わりません
- トリガーだけ失敗する:手動実行では通るのにトリガーでは落ちる場合、権限の承認が済んでいないことが多いです
- APIキーの権限・残高:401なら鍵、429なら回数制限です。レスポンスの中身を読めば区別できます
デプロイまわりとトリガーの詰まりについては、それぞれ別記事に詳しく書いています。
まとめ
Claude×GAS×LINEのタスク自動登録システムは、「どこから入力しても同じ場所に集まる」という設計原則から生まれた。curlが使えないという躓きや、LINEとClaudeの統合、期限リマインダーの追加を経て、日常的に使える形になった。
graciautoでは業務自動化システムの設計・構築を支援しています。「こんなことを自動化したい」というご要望はお気軽にご相談ください。