
- インタビュー業務
- n8nとは?
- 従来の日程確定後の手動プロセスと課題
- n8nを使った自動化ワークフローの設計
- 実装の詳細とコードサンプル
- ワークフロー接続の構成
- Human in the loopアプローチを組み込むと効果的
- 最後に
こんにちは!スマートバンクでUXリサーチャーをしている、Harokaです。
現在、リサーチ業務でAI活用を進めており、各種ツールを使いながら、業務全体のワークフローや、進め方を見直しています。
今回、ユーザーインタビューで日程が決まってから書記シートの準備、予定表の登録等チームに連携する業務をn8nで自動化に挑戦しました!
本記事では、具体的な実装手順とコードサンプルを交えてご紹介します。
インタビュー業務
リサーチチームでは、インタビュー対象者とのやり取りにおいて、日程確定後に以下のような業務を行っています。
- 日程確定メールの内容確認と情報抽出
- Notionでの書記シート作成と基本情報入力
- Google Calendarへの予定登録と参加者招待
- チームメンバーへのSlack通知
これらの作業はすべてリサーチOps(オペレーション)のメンバーが実施しているのですが、1件あたり約15分(月間換算すると5時間以上!)程度かかります。
特に日程確定メールから必要な情報を正確に抽出し、複数のツールに転記する作業は、注意力を要します。
そこで、オープンソースのワークフロー自動化ツール「n8n」を活用して、日程確定後の業務を大幅に自動化することにしました。
n8nとは?
n8nは、ノーコード・ローコードでカスタムワークフローを作成できる自動化ツールです、SlackやNotion、Gmai、OpenAIなど200以上のサービスとの連携が可能です。ほか、JavaScriptでカスタムロジックを実装可能なので、何かしらワークフローを作りたい!と思ったら実現しやすいような印象です。
なんといっても、ビジュアルインターフェースなので非エンジニアの私でも直感的に使いやすいと感じています。
従来の日程確定後の手動プロセスと課題
従来の手動プロセス
日程確定後の業務フローは以下のような流れでした:
- 日程確定メール確認:Gmailで日程確定メールを受信
- 情報抽出:メール本文から対象者名、日時、場所等の情報を手動で確認
- Notion書記シート作成:手動でページ作成、基本情報入力
- カレンダー登録:Google Calendarに手動で予定追加、参加者招待
- Slack通知:チームメンバーに手動で実施予定を共有
これらを、n8nを中心とした進め方にガラッと変えられるか検証しました。
n8nを使った自動化ワークフローの設計
n8nを中心とした進め方として、以下を検討しました。インタビューメールが届いたことをトリガーに、書記シート、予定表を同時に作成・登録できるようにしています。
Gmail監視 → AIでメール情報抽出 → Notion書記シート作成 → Slack通知 →
カレンダー登録 → データ記録 → 完了通知
ワークフロー全体像
実装の詳細とコードサンプル
1. ワークフロー全体の設定
まず、ワークフロー全体の構成を定義します:
{ "name": "1.インタビュー予約→書記シート、予定表作成", "nodes": [ // 各ノードの設定(詳細は後述) ], "connections": { // ノード間の接続設定 }, "active": true, "settings": { "executionOrder": "v1" } }
2. Gmail監視の設定
日程確定メールを自動検知するGmailトリガーノードの設定:
{ "parameters": { "pollTimes": { "item": [ { "mode": "custom", "cronExpression": "0 6-22 * * *" } ] }, "simple": false, "filters": { "q": "インタビュー決定" }, "options": {} }, "type": "n8n-nodes-base.gmailTrigger", "typeVersion": 1.2, "name": "Gmail Trigger" }
3. OpenAIによる情報抽出
メール内容からインタビュー情報を自動抽出するOpenAIノードの設定:
{ "parameters": { "modelId": { "__rl": true, "value": "gpt-3.5-turbo", "mode": "list" }, "messages": { "values": [ { "content": "件名: {{ $json.subject }}\n```\n\n## 抽出情報\n\n・タイトル(タイトルの見出しの下にある部分を抽出)\n・開始日時(dateのタイムスタンプから、JSTに変換して表示、年はメールの受信日時から割り出してください。日程と時間を書いてください。)\n・終了日時(dateのタイムスタンプから、JSTに変換して表示、年はメールの受信日時から割り出してください。日程と時間を書いてください。)\n・開始日(日付のみ、曜日含めてフォーマット化)\n・開催時間(開始時間から終了時間まで)\n・場所\n・インタビュアー(名前、メールアドレス)\n・インタビュイー(名前、メールアドレス)\n・会議室\n・メモ\n\n## output sample\n\n```json\n{\n \"title\": \"TITLE\",\n \"start_datetime\": \"2025-11-10T00:00:00.000+09:00\",\n \"end_datetime\": \"2025-11-10T01:00:00.000+09:00\",\n \"date\": \"1月10日(月)\",\n \"time\": \"00:00~01:00\",\n \"place\": \"https://example.com\",\n \"interviewer\": {\n \"name\": \"インタビュアー名\",\n \"email\": \"interviewer@your-company.com\"\n },\n \"interviewee\": {\n \"name\": \"インタビュイー名\",\n \"email\": \"interviewee@example.com\"\n },\n \"room\": \"https://meet.google.com/xxx-yyyy-zzz\",\n \"memo\": \"備考欄\"\n}\n```\n\n{{ $json.text }}" } ] }, "jsonOutput": true, "options": {} }, "type": "@n8n/n8n-nodes-langchain.openAi", "name": "OpenAI" }
4. Notion書記シート自動作成
抽出した情報を基にNotionページを自動作成:
{ "parameters": { "resource": "databasePage", "databaseId": { "__rl": true, // 実際のNotionデータベースURLに置き換えてください "value": "https://www.notion.so/your-workspace/YOUR_DATABASE_ID?v=YOUR_VIEW_ID", "mode": "url" }, "title": "={{ $json.message.content.interviewee.name }}様書記シート", "simple": false, "propertiesUi": { "propertyValues": [ { // Notionデータベースのプロパティ名に合わせて調整してください "key": "実施日|date", "date": "={{ $json.message.content.start_datetime }}" } ] }, "options": {} }, "type": "n8n-nodes-base.notion", "name": "CreatePage" }
5. Slack承認ワークフロー
書記シート作成後、リサーチOpsメンバーに通知し、承認を待つ仕組み
{ "parameters": { "operation": "sendAndWait", "select": "channel", "channelId": { "__rl": true, // 実際のSlackチャンネル名に置き換えてください "value": "#your-research-channel", "mode": "name" }, // メンション先やメッセージ内容は組織に合わせて調整してください "message": "@research-team\nNotionに書記シートが作成されました。\n必要情報を入力し、入力を終えたらApprovalボタンを押してください。\n\n{{ $json.url }}", "options": {} }, "type": "n8n-nodes-base.slack", "name": "NotifyCreatedPage" }
6. Google Calendar自動登録
承認後、カレンダーへの予定登録を自動実行:
{ "parameters": { "calendar": { "__rl": true, // 実際のGoogleカレンダーのメールアドレスに置き換えてください "value": "your-email@your-company.com", "mode": "list" }, "start": "={{ $('FetchPage').item.json.properties['実施日'].date.start }}", "end": "={{ $json.interviewEndDateTime }}", "additionalFields": { "attendees": [ // Notionの参加者プロパティ名は実際の設定に合わせて調整してください "={{ $('FetchPage').item.json.properties['参加者'].people.map(item => item.person.email).join(',') }}" ], // 説明文の内容は組織に合わせて調整してください "description": "書記シート: {{ $('FetchPage').item.json.url }}\n\n会議室URL: {{ $('OpenAI').item.json.message.content.place }}", "summary": "={{ $('OpenAI').item.json.message.content.title }}" } }, "type": "n8n-nodes-base.googleCalendar", "name": "Google Calendar" }
7. 日時フォーマット処理
Slack通知用に日時を適切にフォーマット:
{ "parameters": { "operation": "formatDate", "date": "={{ $('Google Calendar').item.json.start.dateTime }}", "format": "custom", "customFormat": "yyyy/MM/dd (EEE) T", "outputFieldName": "formattedStartDate", "options": {} }, "type": "n8n-nodes-base.dateTime", "name": "FormatStartDate" }
8. 最終完了通知
全ての処理完了後、チームに結果を通知:
{ "parameters": { "select": "channel", "channelId": { "__rl": true, // 完了通知用のSlackチャンネル名に置き換えてください "value": "#your-research-report-channel", "mode": "name" }, "messageType": "block", // Slack Block Kitの構成は組織の通知フォーマットに合わせて調整してください "blocksUi": "{\n\t\"blocks\": [\n\t\t{\n\t\t\t\"type\": \"section\",\n\t\t\t\"text\": {\n\t\t\t\t\"type\": \"plain_text\",\n\t\t\t\t\"emoji\": true,\n\t\t\t\t\"text\": \"インタビューが予約されました\"\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"type\": \"divider\"\n\t\t},\n\t\t{\n\t\t\t\"type\": \"section\",\n\t\t\t\"text\": {\n\t\t\t\t\"type\": \"mrkdwn\",\n\t\t\t\t\"text\": \"*<{{ $('Google Calendar').item.json.htmlLink }}|{{ $('Google Calendar').item.json.summary }}>*\\n{{ $('FormatStartDate').item.json.formattedStartDate }}-{{ $json.formattedEndDate }}\\n<{{ $('FetchPage').item.json.url }}|書記シート>\"\n\t\t\t},\n\t\t\t\"accessory\": {\n\t\t\t\t\"type\": \"image\",\n\t\t\t\t\"image_url\": \"https://api.slack.com/img/blocks/bkb_template_images/notifications.png\",\n\t\t\t\t\"alt_text\": \"calendar thumbnail\"\n\t\t\t}\n\t\t}\n\t]\n}", "text": "インタビューが予約されました" }, "type": "n8n-nodes-base.slack", "name": "Slack1" }
ワークフロー接続の構成
各ノード間の接続関係は以下のように設定します。
{ "connections": { "Gmail Trigger": { "main": [ [{"node": "OpenAI", "type": "main", "index": 0}] ] }, "OpenAI": { "main": [ [ {"node": "CreatePage", "type": "main", "index": 0}, {"node": "Google Sheets", "type": "main", "index": 0} ] ] }, "CreatePage": { "main": [ [{"node": "NotifyCreatedPage", "type": "main", "index": 0}] ] }, "NotifyCreatedPage": { "main": [ [{"node": "FetchPage", "type": "main", "index": 0}] ] }, "FetchPage": { "main": [ [{"node": "FormatInterviewDate", "type": "main", "index": 0}] ] }, "FormatInterviewDate": { "main": [ [{"node": "Google Calendar", "type": "main", "index": 0}] ] } } }
Human in the loopアプローチを組み込むと効果的
今回、完全自動化ではなく、重要な判断ポイントでは人間が介入できる設計にしました。Human in the loopという考え方なのですが、これはAIや自動化システムの処理に人間の判断を適切なタイミングで組み込むことで、効率性と品質の両方を確保する手法です。
例えば、以下のようなアプローチです。
- 書記シート作成後の承認:Slack通知で内容確認を促し、承認後に次の処理へ
- 品質保証:AI抽出結果を目で見て確認
対象者へメールを送る等、最終的な責任は人間が持つ必要があります。
今回はチームメンバーが主な対象でしたが、目の届く範囲でAIを活用し、人間がミスをしやすい転記などは安心して任せられるような構造にしています。
この仕組みによって、定型対応で問題ないケースでは80%の作業が自動化される一方、インタビューに関するご質問がある等、例外的なケースでも柔軟に対応できる体制を作ることができました。
最後に
この取り組みを通じて特に重要だと感じたのは、AIを主語としたワークフロー設計の考え方です。従来の「人間がAIを使う」から「AIが主体となって人間がサポートする」発想に転換するのが大事だなと感じました。
今後もこのアプローチを踏まえ、UXリサーチ業務全体の自動化を進めていきたいと考えています!皆様のお取り組みもぜひお聞かせください。
書籍『UXリサーチの活かし方』も発売中です
記事執筆者

瀧本 はろか
株式会社スマートバンク
UXリサーチ部 部長
校正・校閲担当者を経て、ベンチャー企業で新規事業の立ち上げやインタビューの企画執筆を経験。その経験からUXリサーチャーに転身、人材会社の新規事業のUXリサーチやリサーチ組織立ち上げ、リサーチャー育成に携わる。2022年4月より株式会社スマートバンクに1人目のUXリサーチャーとして入社。N1インタビューの文化を受け継ぎ、年間100件を超えるインタビューを担当。メンバー全員が「Think N1」を身近に感じられるような働きや経営・事業に伴走するリサーチを推進。著作『UXリサーチの活かし方 ユーザーの声を意思決定につなげるためにできること(翔泳社)』。




