Contents
1. Notion AI カスタムエージェントとは
1.1 基本機能とメリット
- データベース単位でプロンプトを保存:各データベースに対して固有の指示(=カスタムエージェント)を設定でき、同じワークフローでも部門やプロジェクトごとに出力内容を変えることが可能です。
- 自動化範囲の拡大:テキスト要約・ラベル付与・次アクション提案など、従来は手作業で行っていた「情報整理」を AI がリアルタイムに実行します。
- 業務フローへの直結:エージェントが生成した結果は Notion のプロパティとして保存されるため、他のビューやレポートとシームレスに連携できます。
1.2 主な活用シーン
| シナリオ | カスタムエージェントの設定例 |
|---|---|
| 営業案件管理 | 「新規リードが追加されたら顧客属性を抽出し、次回フォローアップ日(+3 日)と提案内容を自動生成」 |
| 開発タスクトリアージ | 「タイトル・説明文から 5 キーワードを抽出し、バグ/機能追加/改善 のいずれかに分類」 |
| 人事評価集計 | 「面談メモを要約し、評価ポイント(コミュニケーション・リーダーシップ)を自動でスコア化」 |
2. カスタムエージェントの有効化と設定手順(最新 UI)
※2024 年 3 月時点の Notion バージョン
設定画面は随時デザインが変更されるため、左サイドバーや設定メニューの表記が若干異なる場合があります。公式ドキュメント(Notion AI Settings)を併せてご確認ください。
- Settings & Members を開く
-
左サイドバー最下部にある 「Settings & members」(⚙︎ アイコン)をクリック。
-
AI Settings タブへ移動
-
上部タブから 「AI settings」 を選択し、画面右上の “Custom agents” スイッチを ON にします。
-
対象データベースでエージェントを作成
-
任意のデータベースを開き、右上メニュー(…)から 「Add custom agent」 を選択。
-
エージェント情報を入力
| 項目 | 設定例 |
|---|---|
| Agent name | 「営業リード自動要約」 |
| Prompt (指示文) |新規リードが追加されたら、顧客名・業種・予算を抽出し、次回フォローアップ日(今日から3日後)と提案内容のサマリーを作成してください。|
| Target property | 必要に応じて「要約」「次アクション」など、結果を書き込むプロパティを選択 | -
保存して有効化
- “Save” ボタンで確定すると、以降そのデータベースに新規アイテムが作成されるたびにエージェントが自動実行されます。
ポイント:指示文は 「具体的」かつ 「制約条件(文字数・フォーマット)」* を必ず添えると、期待通りの出力が得られやすくなります。
3. AI 自動入力プロパティで要約・分類を実装
3.1 機能概要
Notion の AI‑generated プロパティは、対象フィールド(タイトル・本文など)から自動的にテキスト生成やラベリングを行うことができます。コード不要で「要約」や「カテゴリ」の自動入力が実現します。
3.2 設定手順
| 手順 | 操作内容 |
|---|---|
| 1 | データベース上部の “+ Add a property” をクリック。 |
| 2 | プロパティタイプで 「AI‑generated」 → 「Auto‑fill」 を選択。 |
| 3 | プロパティ名を設定(例:要約、カテゴリ)。 |
| 4 | 各プロパティの “Prompt” 欄に指示文を入力。 |
| 5 | “Save” を押すと、以降新規アイテム作成時に AI が自動で値を埋めます。 |
プロンプト例
-
要約(50 文字以内)
このタスクの概要を 50 文字以内で簡潔に要約してください。 -
カテゴリ分類
本文中に含まれるキーワードから、次のいずれかのカテゴリを選んでください。: 開発, デザイン, 営業, カスタマーサポート
注意点:プロンプトは日本語でも英語でも構いませんが、日本語の場合は「文体・敬称」まで明示すると出力のブレが減ります。
4. Google Apps Script と Notion API の連携で期限通知・ステータス自動更新
4.1 前提条件と認証設定(最新 API バージョン)
| 項目 | 内容 |
|---|---|
| Notion API バージョン | 2023-10-03(執筆時点での最新版)※ヘッダー "Notion-Version" に指定 |
| Integration 作成 | Notion の Settings → Integrations → Develop your own integrations から「Internal integration」を作成し、Read content と Update content 権限を付与。 |
| データベース共有 | 作成した Integration を対象データベースの Share メニューから招待し、アクセス権を付与。 |
| トークン管理 | GAS の PropertiesService.getScriptProperties() に保存し、コード上にハードコーディングしない。 |
|
1 2 3 4 5 |
// 例: スクリプトプロパティから取得 const SCRIPT_PROP = PropertiesService.getScriptProperties(); const NOTION_TOKEN = SCRIPT_PROP.getProperty('NOTION_TOKEN'); const DATABASE_ID = SCRIPT_PROP.getProperty('DATABASE_ID'); |
4.2 サンプルコード(改善版)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
/** * Notion API バージョンは最新 (2023-10-03) を使用 */ const NOTION_VERSION = '2023-10-03'; const HEADERS = { Authorization: `Bearer ${NOTION_TOKEN}`, 'Notion-Version': NOTION_VERSION, 'Content-Type': 'application/json', }; /** * 毎朝 09:00 に実行されるトリガー関数 */ function checkDeadlines() { const tasks = queryOpenTasks(); const today = new Date(); tasks.forEach(task => { const dueDateStr = task.properties['期限'].date?.start; if (!dueDateStr) return; // 期限未設定はスキップ const dueDate = new Date(dueDateStr); const diffDays = (dueDate - today) / (1000 * 60 * 60 * 24); // 3 日以内のリマインダー if (diffDays >= 0 && diffDays <= 3) { sendReminderMail(task, Math.ceil(diffDays)); } // 遅延タスクのステータス更新 if (diffDays < 0 && task.properties['ステータス'].select?.name !== '遅延') { updateStatusToLate(task.id); } }); } /** * Notion データベースから期限が設定された未完了タスクを取得 */ function queryOpenTasks() { const url = `https://api.notion.com/v1/databases/${DATABASE_ID}/query`; const payload = { filter: { and: [ { property: '期限', date: { is_not_empty: true } }, { property: 'ステータス', select: { does_not_equal: '完了' } }, ], }, }; const options = { method: 'post', headers: HEADERS, payload: JSON.stringify(payload), muteHttpExceptions: true, }; const response = UrlFetchApp.fetch(url, options); if (response.getResponseCode() !== 200) { Logger.log('Notion API error: %s', response.getContentText()); return []; } return JSON.parse(response.getContentText()).results; } /** * リマインダーメール送信 */ function sendReminderMail(task, daysLeft) { const title = task.properties['名前'].title[0]?.plain_text ?? '(タイトルなし)'; const due = task.properties['期限'].date.start; const body = ` タスク名: ${title} 期限: ${due} (残り ${daysLeft} 日) 要約: ${task.properties['要約']?.rich_text[0]?.plain_text ?? '未設定'} `; MailApp.sendEmail({ to: Session.getActiveUser().getEmail(), subject: `【期限迫る】${title}`, body, }); } /** * ステータスを「遅延」に更新 */ function updateStatusToLate(pageId) { const url = `https://api.notion.com/v1/pages/${pageId}`; const payload = { properties: { ステータス: { select: { name: '遅延' } }, }, }; const options = { method: 'patch', headers: HEADERS, payload: JSON.stringify(payload), muteHttpExceptions: true, }; const response = UrlFetchApp.fetch(url, options); if (response.getResponseCode() !== 200) { Logger.log('ステータス更新失敗(%s): %s', pageId, response.getContentText()); } } |
主な改善点
- API バージョンを最新に更新
- エラーハンドリング & ロギング を追加し、デバッグが容易に。
muteHttpExceptions: trueにより、ステータスコード取得後に独自処理が可能。- プロパティ名の安全な参照(
?.)で例外防止。
4.3 デプロイとトリガー設定
| 手順 | 操作 |
|---|---|
| 1 | Google Cloud Console → プロジェクト作成(または既存プロジェクト使用)。 |
| 2 | Apps Script エディタで上記コードを貼り付け、File > Project properties > Script properties に NOTION_TOKEN と DATABASE_ID を登録。 |
| 3 | メニューの時計アイコン → 「トリガー」 → checkDeadlines を選び、時間主導型(毎日 09:00) のトリガーを作成。 |
| 4 | 初回実行時に認可画面が表示されるので、必要な権限(Gmail, スプレッドシート等)を付与。 |
5. 実践ワークフロー例:メール → タスク自動作成 → リマインダー → 完了要約
5.1 フローチャート(テキスト版)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Gmail (ラベル #task-request) ──► GAS が未処理メール取得 │ ▼ 抽出した件名・本文を Notion API に POST → タスクページ作成 │ ▼ AI 自動入力プロパティが要約 & カテゴリを即時生成 │ ▼ 期限通知スクリプト (checkDeadlines) がリマインダー送信 │ ▼ ユーザーがステータス「完了」に変更 → カスタムエージェントが「完了要約」プロパティへ自動記入 |
5.2 詳細手順
| ステップ | 実装内容 | 主なツール |
|---|---|---|
| 1 | Gmail フィルタで #task-request ラベル付与(対象メールのみ) | Gmail |
| 2 | GAS の GmailApp.search('label:#task-request') で取得、本文・件名を抽出 | Google Apps Script |
| 3 | Notion API (POST /v1/pages) に送信し、タスクデータベースへ作成。自動入力プロパティが要約・カテゴリを生成 | Notion API + GAS |
| 4 | checkDeadlines が毎朝実行され、期限が近いタスクにメール通知 | GAS 時間主導トリガー |
| 5 | ユーザーがステータス「完了」へ変更 → カスタムエージェントのプロンプト(例:完了したら作業内容を 100 文字以内で要約し、成果指標を列挙してください。)が自動実行 | Notion AI カスタムエージェント |
ポイント:全工程はノーコード/ローコードで構築でき、GAS のスクリプトだけで完結するため、IT 部門の介入が最小限です。
6. プロンプト設計ベストプラクティスと運用上の注意点
6.1 効果的なプロンプト作成術
| 項目 | 推奨方法 |
|---|---|
| 具体性 | 「何を」「どのように」書くか明記。例)タイトルから 5 キーワードを抽出し、カンマ区切りで出力してください。 |
| 制約条件 | 文字数・フォーマットを必ず付与。例)JSON 形式で { "key": "...", "value": "..." } を返すこと。 |
| 文体統一 | 出力の敬称や語尾(ですます調/である調)を指示すると、後続処理が楽になります。 |
| テストとチューニング | 同一プロンプトでもデータにより出力が変わるため、サンプルデータで 3〜5 回実行し、期待結果に近づくまで微調整。 |
| テンプレート化 | よく使う指示は Notion の「テンプレート」ページに保存し、エージェント設定時にコピペするだけで再利用可能。 |
6.2 権限・セキュリティ
- 最小権限の原則
- Integration に付与する権限は対象データベースのみ
readとupdate(必要ならinsert)に限定。全体へのフルアクセスは避ける。 | - 機密情報の取り扱い
- Notion のシークレットトークンは GAS の Properties Service に暗号化せず保存し、スクリプトエディタ上で閲覧できないようにする。 |
- ログ管理
UrlFetchApp.fetchのレスポンスコードと本文を Google スプレッドシートに書き出す仕組み(例:logApiCall(response))を導入し、エラー時のトラブルシューティングを容易に。 |
6.3 コスト・利用上限のモニタリング
| 項目 | 対策 |
|---|---|
| AI トークン消費量 | Notion の Usage Dashboard(設定 > AI usage)で月間トークン数を定期確認。自動入力やエージェントが頻繁に呼び出されている場合は、プロンプトの実行回数を抑える工夫(例:バッチ処理)を検討。 |
| API リクエスト上限 | Notion API のレートリミットは 3 req/秒 (パブリック) です。大量更新が必要な場合は、setTimeout 等で間隔を調整し、429 エラー対策を実装。 |
| GAS 実行時間 | 無料枠では 6 分/日 が上限。長時間処理が必要なら、スクリプトを分割して複数関数に分けるか、有料版へ移行。 |
7. トラブルシューティング Q&A
| 質問 | 回答 |
|---|---|
| カスタムエージェントが実行されない | 1️⃣ データベースの「Share」設定で Integration が招待済みか確認。 2️⃣ エージェントのプロンプトに誤字・不正な JSON 文字列が混入していないかチェック。 |
| AI 自動入力プロパティが空になる | プロンプトが「空」または「無効」になっている可能性。Prompt 欄を再編集し、必ず指示文(例:要約)を含める。 |
| GAS から Notion API が 401 エラー | トークンが正しく取得できていない。Script Properties に NOTION_TOKEN が設定されているか、スペースや改行が混入していないか確認。 |
| 期限通知メールが届かない | GAS の時間主導型トリガーが無効化されていないか、実行ログでエラーが出ていないか確認。また、Gmail の送信上限(100 件/日)を超えていないかチェック。 |
| コストが予想以上に増える | AI の呼び出し回数が多すぎるケースが典型的。自動入力プロパティの対象フィールドを絞り、不要なエージェントは無効化する。 |
8. まとめと次のアクション
- カスタムエージェント
-
データベース単位で指示(プロンプト)を保存し、業務フローに合わせた AI 自動化基盤を構築。
-
AI 自動入力プロパティ
-
タスクの要約・カテゴリ付与をコード不要でリアルタイム生成。
-
GAS × Notion API 連携
-
期限通知やステータス自動変更など、時間主導型トリガーで実現できる自動化パターンを提供。
-
実践ワークフロー例
-
メール受信 → タスク作成 → リマインダー → 完了要約までの一連流れをノーコードで構築可能。
-
プロンプト設計・運用のベストプラクティス
- 具体的かつ制約付きの指示、最小権限での Integration 設定、利用コストのモニタリングが成功の鍵です。
今すぐ始めるステップ
| 手順 | 内容 |
|---|---|
| ① | Notion の Settings → AI settings で Custom agents をオンにする(最新 UI に従う)。 |
| ② | 目的別に 1〜2 個のカスタムエージェントを作成し、プロンプトは「具体的」かつ「文字数制限」を入れる。 |
| ③ | データベースに AI‑generated プロパティ(要約・カテゴリ)を追加し、サンプルデータでテスト。 |
| ④ | Google Apps Script に上記サンプルコードを貼り付け、トークンと DB ID を設定後、時間主導型トリガーを作成。 |
| ⑤ | 1 週間運用しながら Usage Dashboard と GAS のログシートで利用状況・エラーをチェックし、必要に応じてプロンプトやフィルタ条件を調整。 |
これらの手順を踏めば、Notion AI と Google Apps Script を組み合わせた タスク管理自動化 がすぐに体感できるはずです。ぜひ本記事をリファレンスに、業務効率化への第一歩を踏み出してください。