はじめに
支援相談員さんとのやり取り、行政・事業所とのメール連絡、Discordでの情報共有。
それぞれ単体なら小さな作業なのですが、毎回やっていると地味に負担が大きいです。
AI電話が禁止される昨今、ログを残すためにもメールは必須です。
特に困っていたのは、Gmailで作成したメール内容を、支援相談員さん向けにショートメールで共有したい場面でした。
GmailではGeminiを使って文面作成ができます。
一方で、GoogleメッセージはGemini非対応です。
そのため、
- Gmail用の文章を作る
- その内容を要約する
- ショートメール用に短くする
- Discord用には少し読みやすく整える
- いつ、誰に、何を送ったか記録する
という作業のために、別途AIを立ち上げたり、手作業でメモしたりする必要がありました。
「これはブラウザだけで完結する小さな業務ツールにできるのでは?」
と思い、Claude Desktopに相談しながら、
Google Apps Script + HTML + Gemini API + スプレッドシートで簡易ツールを作ってみました。
この記事では、実装してみて分かったこと、ハマったこと、そして「完璧に動かなくても運用が楽になる」という話を書きます。
作りたかったもの
作りたかったのは、以下のような流れのツールです。
目標は大きく3つです。
- Gmail用のメール文面を作成する
- その内容を要約し、共有先ごとの文面に変換する
- 送受信・共有内容をスプレッドシートに残す
最初から本格的な業務システムを作るつもりはなく、
「自分が毎回困っている手間を少しでも減らす」ことを目的にしました。
なぜGAS + HTMLにしたのか
Claude Desktopに相談したところ、候補として以下の2つを提案されました。
- GAS + HTML
- 単一HTMLファイル
今回は、スプレッドシートとの連携やGoogleアカウント上で完結できることを重視して、
GAS + HTMLを選びました。
理由は以下です。
- ブラウザだけで使える
- Googleスプレッドシートに記録しやすい
- Gemini APIキーをサーバー側に置ける
- 個人用の小さな業務ツールとして始めやすい
- デプロイすればURLからアクセスできる
Apps ScriptのWebアプリとして公開すれば、
Gmailやスプレッドシートを開く感覚で使えるのが魅力でした。
全体構成
構成はかなりシンプルです。
Google Apps Script
├── Code.gs // Gemini API呼び出し、スプレッドシート保存
└── Index.html // 入力フォーム、タブUI、コピー処理
使うものは以下です。
| 用途 | 技術 |
|---|---|
| UI | HTML / CSS / JavaScript |
| バックエンド | Google Apps Script |
| 文章生成 | Gemini API |
| 記録 | Googleスプレッドシート |
| 実行環境 | GAS Webアプリ |
UI側では3つのタブを用意しました。
- メール作成
- 要約・共有文面
- 送受信・共有管理
スプレッドシートの列設計
記録用のスプレッドシートには、以下の列を用意しました。
ID / 記録日時 / 種別 / 宛先 / 件名 / 本文 / 要約 / 共有先 / 共有日時 / ステータス / 備考
この設計にした理由は、あとから見返したときに、
- いつの話か
- 誰宛ての話か
- 何を送ったか
- 共有済みか
- 相談員さんに伝えたか
を確認しやすくするためです。
メールはGmail内を検索すれば見つかります。
ただ、行政・福祉・事業所などのやり取りは、細かい経緯が積み重なるので、毎回Gmail検索をするのが地味に大変です。
そのため、最終的には「本文すべて」よりも、
要約とステータスが一覧できることが重要だと感じました。
実装した主な機能
1. Gmail用メール文面の作成
最初の画面では、以下を入力します。
- 差出人の立場
- 宛先
- 目的
- 盛り込みたい内容
- トーン
入力するとGemini APIに送信し、件名と本文を作成します。
例えば、以下のような内容です。
目的:
退職手続きに関する確認
盛り込みたい内容:
3月に転居し、4月に相談員と面談後、事業所へメールで退職を伝えた。
受理の返信ももらっている。
しかし5月分の工賃明細が以前の住所に届き、現在の住所へ転送された。
来月から別のA型事業所に勤務予定なので、二重登録などがないか不安。
このような内容から、行政や事業所向けの丁寧なメールを作成します。
ハマりポイント1:Geminiが立場を取り違える
最初に困ったのが、差出人と宛先の立場が逆になる問題でした。
例えば、本来は「私が福祉課へ送るメール」を作りたいのに、
Geminiが「事業所側が利用者へ送る文章」のように書いてしまうことがありました。
これは、プロンプト内で「誰が誰に送るのか」を明示していなかったことが原因でした。
そのため、UIに以下の入力欄を追加しました。
差出人(あなた)の立場・所属
そして、プロンプトにも視点固定の指示を追加しました。
'【最重要・視点の固定】\n' +
'・このメールを書いて送るのは「差出人」です。文面は必ず差出人の一人称・立場で書いてください。\n' +
'・「宛先」は受け取る相手です。差出人と宛先の立場を絶対に入れ替えないでください。\n' +
'・差出人や宛先の役割を勝手に推測・変更しないこと。\n' +
'・入力に書かれていない事実を創作して追加しないこと。\n'
AIに文章作成を任せる場合、
「丁寧に書いて」だけでは足りません。
特に福祉・行政・契約・手続きのような文脈では、
誰が、誰に、どの立場で書いているかを固定することが大事でした。
ハマりポイント2:生成結果を編集できない
最初のUIでは、生成されたメール本文や要約文をdivで表示していました。
しかし、実際に使うとすぐに問題が出ました。
AIの文章は便利ですが、そのまま送るとは限りません。
- 少し柔らかくしたい
- 事実関係を補足したい
- 言い回しを自分の言葉にしたい
- SMS用にさらに短くしたい
という場面が多いです。
そのため、生成結果は読み取り専用ではなく、
inputやtextareaで編集できるように変更しました。
<textarea id="s_summary" style="min-height:90px"></textarea>
<textarea id="s_sms" style="min-height:70px"></textarea>
<textarea id="s_discord" style="min-height:90px"></textarea>
これにより、
- Geminiに下書きを作らせる
- 自分で直す
- 直した内容をコピー・保存する
という流れにできました。
AIに全部任せるというより、
AIにたたき台を作ってもらい、人間が最後に整える形です。
この方が安心して使えました。
ハマりポイント3:.textContentと.valueの違い
表示用のdivを編集可能なtextareaに変更したことで、
JavaScript側も修正が必要になりました。
divの場合は以下で取得できます。
element.textContent
しかし、inputやtextareaの場合は以下です。
element.value
この変更を忘れると、
- コピーできない
- 保存できない
- 次の画面に引き継げない
という問題が起きます。
そこで、コピー処理は共通関数にしました。
function getFieldText(id){
var el = document.getElementById(id);
return ('value' in el) ? el.value : el.textContent;
}
小さな変更ですが、
「表示だけのUI」から「編集できるUI」に変えたときに必要な修正でした。
ハマりポイント4:スプレッドシートに記録されない
スプレッドシート連携も一発ではうまくいきませんでした。
特に困ったのは、データがあるはずなのに管理画面側に表示されないことです。
原因確認のために、_debugCheck()という確認用関数を追加しました。
function _debugCheck() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
Logger.log('スプレッドシート名: ' + (ss ? ss.getName() : 'null'));
Logger.log('スプレッドシートID: ' + (ss ? ss.getId() : 'null'));
const sheet = ss.getSheetByName('メール管理');
if (!sheet) {
Logger.log('「メール管理」シートが存在しません');
return;
}
Logger.log('最終行: ' + sheet.getLastRow());
Logger.log('listRecords件数: ' + listRecords().length);
}
実行ログでは、スプレッドシート名、ID、最終行、件数は確認できました。
つまり、スプレッドシート側にはデータが存在していました。
ただ、再デプロイしてもWebアプリ側に反映されない部分があり、
今回は完全解決までは至りませんでした。
それでも運用は楽になった
最終的に、スプレッドシートへの完全自動転送はうまくいきませんでした。
ただし、そこで終わりにはしませんでした。
要約文や共有文面は生成できていたので、
シートへの記録だけ手動で行う運用に切り替えました。
結果として、かなり楽になりました。
具体的には、
- メール内容を短くまとめる負担が減った
- 支援相談員さん向けのショートメール文面に悩まなくなった
- Discord共有用の文章も作りやすくなった
- いつ何があったかをシートで追えるようになった
- Gmailを役所名や事業所名で毎回検索しなくてよくなった
という効果がありました。
ツールとしては未完成でも、
日々のストレスを減らすという意味では十分に役立ちました。
実際に便利だったポイント
1. 「文章を考える負担」が減る
行政や福祉関連のメールは、言い回しに気を使います。
強すぎてもよくない。
曖昧すぎても伝わらない。
感情的になりすぎても困る。
その中間の文面を毎回考えるのは、かなり疲れます。
Geminiに下書きを作ってもらうことで、
ゼロから文章を組み立てる必要がなくなりました。
2. 共有先ごとに文体を変えられる
同じ内容でも、共有先によって文体は変わります。
| 共有先 | 文体 |
|---|---|
| Gmail | 丁寧・正式 |
| ショートメール | 短く、要点のみ |
| Discord | 少し読みやすく、共有向け |
| スプレッドシート | 後から確認しやすい要約 |
この変換を毎回手作業でするのは大変です。
AIに任せることで、
「同じ内容を、別の場所に合わせて言い換える」作業がかなり楽になりました。
3. ログがあると安心する
福祉保健関連のやり取りでは、
- いつ連絡したか
- どこに伝えたか
- 返事が来ているか
- 相談員さんに共有済みか
が重要になります。
頭で覚えておくには細かすぎます。
スプレッドシートに残しておくことで、
「たしか送ったはず……」という不安が減りました。
今回の学び
AIツールは「文章生成」より「文脈整理」に効く
今回やってみて感じたのは、
AIは単に文章を作るだけでなく、文脈整理に向いているということです。
特に、
- 長いメールを短くする
- 要点を抜き出す
- 共有先に合わせて言い換える
- 記録用に整える
という作業に向いていました。
プロンプトでは「視点」を明示する
メール生成では、視点の取り違えが致命的です。
そのため、
このメールを書いて送るのは誰か
受け取るのは誰か
どの立場で書くのか
入力にない事実を足してよいのか
を明示する必要がありました。
特に「支援する側」「支援される側」、「依頼する側」「受ける側」がある文脈では、
AIが推測で補完すると危険です。
完成しなくても、運用改善にはなる
今回のツールは、最終的に完全自動化まではできませんでした。
それでも、
- 要約を作る
- SMS文面を作る
- Discord文面を作る
- シートに記録する
という一連の流れはかなり楽になりました。
完璧なシステムを作る前に、
「一番しんどい作業だけでも減らす」ことには大きな価値があります。
今後やりたいこと
今後改善するなら、以下をやってみたいです。
- スプレッドシートへの保存処理を安定させる
- Gmail本文を直接読み込めるようにする
- 共有先を自由に追加できるようにする
- ステータス管理をもう少し見やすくする
- 送信済み・返信待ち・完了などを色分けする
- 個人情報を扱うため、保存内容のルールを明確にする
特に個人情報を含む可能性があるため、
APIに送る内容やスプレッドシートに残す内容は、運用上の注意が必要です。
まとめ
今回は、GAS + HTML + Gemini API + スプレッドシートで、
メール作成・要約・共有文面作成・ログ管理を行う小さなツールを作ってみました。
完全な自動化には至りませんでしたが、
日々の連絡業務のストレスはかなり減りました。
特に、GmailではGeminiが使える一方で、
ショートメールやDiscordへの共有では別途要約・言い換えが必要になるという課題に対して、
「一度作った文章を、複数の共有先向けに変換する」仕組みはかなり便利でした。
業務改善というと大きなシステムを想像しがちですが、
実際にはこういう小さな不便を減らすツールこそ、日常では効きます。
完璧な完成品ではなくても、
「昨日より少し楽になる」ツールは作る価値がある。
今回の一番の学びは、そこでした。