2025年7月 – Gmail Compose アドオン開発体験記
はじめに
Gmail アドオンでメール本文にテキストを挿入する機能を開発中に、興味深い技術的矛盾を発見しました。Gmail は「署名の挿入」を提供しているのに、サードパーティアドオンからの任意テキスト挿入は制限されています。この記事では、実際の開発体験を通じて明らかになった技術的制約と、その背景にある設計思想を分析します。
なお、このアドオンは下記の制限事項で作れないことがわかったので断念しました。
Gmail アドオン開発で直面した問題
目標:メール作成時の日付挿入機能
「ひづけくん」という Gmail アドオンを開発していました。目的は、メール作成時にカレンダーから選択した日付を正確な曜日とともに挿入することです(例:「7月15日(月)」)。
なぜこれを作ろうかと思ったのかというと、過去webミーティングの日付を提案してくるお客さんの中に、日付と曜日がズレていることが結構あることに気付いたためです。いちいち、メール一往復してどっちが正しいか確認しないといけない。で、僕はこれ結構重宝する機能じゃないの? と思ったので作り始めました。
期待していた実装
公式ドキュメントによると、UpdateDraftBodyAction を使用すればテキスト挿入が可能とされています。
function insertDate() {
var updateAction = CardService.newUpdateDraftActionResponseBuilder()
.setUpdateDraftBodyAction(
CardService.newUpdateDraftBodyAction()
.addUpdateContent('7月15日(月)', CardService.ContentType.PLAIN_TEXT)
.setUpdateType(CardService.UpdateDraftBodyType.IN_PLACE_INSERT)
)
.build();
return updateAction;
}
実際に発生したエラー
しかし、実装すると以下のエラーが発生しました:
InternalError: Cannot find method setUpdateType((class))
InternalError: Cannot find method addUpdateContent(string,(class))
公式ドキュメントに記載されているメソッドが存在しないという状況でした。
動作する代替案の発見
ComposeActionResponse による解決
最終的に動作したのは、ドラフト作成方式でした:
function insertDate() {
try {
// GmailApp でドラフトを作成
var draft = GmailApp.createDraft('', '', '7月15日(月)');
// ComposeActionResponse で画面に表示
var response = CardService.newComposeActionResponseBuilder()
.setGmailDraft(draft)
.build();
return response;
} catch (error) {
console.error('Error:', error);
}
}
この方法では、新しいドラフトが作成されて既存の作成画面に置き換わります。
Gmail の既存機能との矛盾
Gmail で可能な挿入機能
ここで重要な気づきがありました。Gmail は様々なテキスト挿入機能を標準提供しています:
1. 署名の挿入
- ユーザー設定の署名を手動/自動で挿入
- 複数の署名から選択可能
- カーソル位置への正確な挿入
2. 定型文(Canned Responses)
- 保存したテンプレートをワンクリックで挿入
- 本文全体の置換または追加
3. スマート作成機能
- AI による文章補完
- 文脈に応じた提案の挿入
4. その他の挿入機能
- 絵文字ピッカーからの挿入
- リンクの自動変換・挿入
- Google Drive ファイルの添付・挿入
アドオンで不可能な操作
一方、サードパーティアドオンでは以下が制限されています:
- 任意のテキスト挿入: UpdateDraftBodyAction が機能しない
- カーソル位置への挿入: 正確な位置指定ができない
- 既存文章の編集: 部分的な修正が不可能
技術的矛盾の分析
署名挿入の仕組み(推測)
Gmail の内部実装では、おそらく以下のような処理が行われています:
// Gmail内部(推測)
function insertSignature() {
const editor = getComposeEditor();
const signature = getUserSignature();
editor.insertAtCursor(signature); // DOM操作で直接挿入
}
アドオンとの技術的差異
| 機能 | 実装場所 | DOM アクセス | 制限 |
|---|---|---|---|
| 署名挿入 | Gmail 内部 | 直接アクセス | なし |
| 定型文 | Gmail 内部 | 直接アクセス | なし |
| アドオン | サンドボックス | API経由のみ | 厳格 |
セキュリティ vs 利便性のジレンマ
Google の公式見解
Google Workspace アドオンの制限について、公式ドキュメントでは以下のように説明されています:
“アドオンフレームワークは Google Workspace アプリケーションを拡張するために設計されており、既存機能を変更したり制限を加えるものではありません”
実際のセキュリティモデル
しかし、Gmail API を使用すれば同じ開発者が以下を実行できます:
// Gmail API(完全に可能)
await gmail.users.drafts.update({
userId: 'me',
id: draftId,
resource: {
message: {
raw: base64EncodedMimeMessage // 任意のコンテンツ
}
}
});
矛盾の構造
同一開発者による操作:
├── アドオン経由: "セキュリティのため禁止"
└── API 経由: "開発者責任で自由"
Gmail API との比較
権限モデルの違い
| 項目 | Gmail アドオン | Gmail API |
|---|---|---|
| 認証 | 簡略化された権限 | 詳細な権限説明 |
| 実行環境 | Google サンドボックス | 開発者環境 |
| ユーザー同意 | ワンクリック承認 | 明示的な同意 |
| 機能制限 | 意図的に制限 | ほぼ制限なし |
API での実現可能性
Gmail API では以下が可能です:
- ドラフトの完全制御: 作成・更新・削除
- 本文の自由編集: 任意の位置への挿入・削除
- リアルタイム操作: WebSocket 等による即座の反映
- 高度な機能: 添付ファイル操作、ラベル管理等
設計思想の推察
市場セグメンテーション戦略
Googleの真意を推測すると、以下の戦略が見えてきます:
簡単な拡張 → アドオン(制限あり、導入簡単)
本格的な開発 → API(自由、技術的複雑)
段階的学習曲線
Step 1: アドオン開発(入門者向け)
↓(物足りなくなる)
Step 2: API 開発(上級者向け)
責任の分散
- アドオン: Google が一定の品質を保証
- API: 開発者が全責任を負う
代替アプローチの検討
1. Chrome拡張機能 + Gmail API
// Chrome拡張機能のコンテンツスクリプト
function insertDateToGmail(dateText) {
// Gmail API でドラフト更新
chrome.runtime.sendMessage({
action: 'updateDraft',
content: dateText
});
}
メリット:
- Gmail 画面から直接実行可能
- リアルタイムでの挿入
- 高度なUI統合
2. Webアプリケーション
// PWA として独立したアプリ
async function createDateInsertApp() {
// Gmail API で認証
const auth = await authorize();
// ドラフト操作
await insertDateToDraft(auth, selectedDate);
}
3. ブックマークレット
javascript:(function(){
const date = prompt('挿入する日付:');
insertToComposer(date);
})();
開発者への実践的アドバイス
短期的解決策
- 現実を受け入れる: アドオンの制限は仕様
- ユーザー体験を重視: コピー&ペースト方式でも価値提供
- 段階的開発: アドオン → Chrome拡張 → PWA
長期的戦略
Phase 1: Gmail アドオン(コピペ版)
↓ ユーザーフィードバック取得
Phase 2: Chrome拡張機能開発
↓ 理想的なUX実現
Phase 3: PWA 化
↓ モバイル対応・オフライン機能
技術選択の指針
| 要件 | 推奨技術 | 理由 |
|---|---|---|
| 導入の簡単さ | Gmail アドオン | Google Workspace Marketplace |
| 機能の豊富さ | Gmail API | 制限が少ない |
| UX の良さ | Chrome拡張 | Gmail UI との統合 |
| クロスプラットフォーム | PWA | モバイル・デスクトップ対応 |
まとめ
Gmail アドオン開発を通じて、以下の重要な発見がありました:
技術的事実
- アドオンの制限は人為的: 技術的には可能だが意図的に制限
- 既存機能との矛盾: 署名挿入は可能、アドオン挿入は不可
- API なら制限なし: セキュリティ制限は同レベルなのに機能制限なし
設計思想の理解
Google の制限は技術的必然性ではなく、以下の戦略的判断です:
- エコシステムの階層化: アドオン vs API
- 責任の分散: 簡単 vs 自由
- 市場セグメンテーション: 初心者 vs 上級者
開発者への示唆
- 制限を理解する: アドオンは「拡張」であり「改変」ではない
- 適切な技術選択: 要件に応じてアドオン/API/拡張機能を選択
- ユーザー価値を重視: 技術的制約があってもユーザーに価値を提供
最終的な気づき
「署名は挿入できるのに、なぜアドオンからは文字を挿入できないのか?」
この素朴な疑問から始まった調査により、Google の複雑な設計思想と市場戦略が見えてきました。技術者として重要なのは、制約を理解した上で、それでもユーザーに価値を提供する方法を見つけることです。
この記事は実際の Gmail アドオン開発体験に基づいています。技術的な詳細や推測は 2025年7月時点の情報に基づいており、将来的に変更される可能性があります。
参考資料
- Google Workspace Add-ons – Gmail
- Gmail API Documentation
- CardService Reference
- Gmail Add-ons Restrictions
著者について
Gmail アドオン開発での試行錯誤を通じて、Google の設計思想と技術的制約について深く考察することになりました。この経験が他の開発者の参考になれば幸いです。


コメント