讓 AI 將一段非結構化的會議文字稿,轉換為包含 標題、類型、摘要、待辦事項 的結構化 JSON,並精確寫入 Notion 資料庫的對應欄位。
在開始 n8n 流程前,先建立一個 Notion 資料庫作為 AI 寫入的目標。
| 欄位名稱 (Notion Property Name) | 欄位類型 (Property Type) | 備註 |
|---|---|---|
| 標題 | Title (標題) | 必備的主欄位 |
| 會議類型 | Select (選擇) | 新增幾個選項,例如:專案討論、行政會議、技術決策 |
| 重點摘要 | Text (文字) | |
| 待辦事項 | Text (文字) |

Share (分享) -> Copy Link (複製連結)。https://www.notion.so/你的工作區/資料庫名稱-**[DATABASE_ID]**?v=...
Internal Integration Token: secret_xxxxxxxxxxxxxxxxx
在 Dify 應用中,我們必須用一個系統指令 (System Prompt) 來強制 AI 輸出 JSON。
你是一位專業的會議記錄分析師,你的任務是將提供的會議文字稿轉換成精確的結構化資料。
請嚴格輸出以下 JSON 格式,且不得包含額外的說明或文字:
{
"meeting_title": "從會議記錄中總結一個簡短標題",
"type": "請從 '專案討論', '行政會議', '技術決策' 中選取最符合的類型",
"summary": "以兩到三句話總結會議的核心內容和決議。",
"action_items": "以條列或用分號 (;) 隔開所有待辦事項和負責人。"
}

目的: 用於模擬接收外部的原始會議記錄文字。
操作:
+ 新增節點,搜尋 Manual Trigger。set mock data -> Add JSON。{
"meeting_text": "今天的專案討論會議主要討論了n8n鐵人賽的進度,決定明天完成Notion串接,負責人是小王。"
}

目的: 將會議文字和 Dify Prompt 結合,送出請求。
操作:
POST
chat-messages API 端點 (例如:https://api.dify.ai/v1/chat-messages){
"inputs": {
"meeting_transcript": "{{ $json.meeting_text }}"
},
"query": "請根據上方會議內容輸出符合格式的 JSON 結構。",
"response_mode": "blocking",
"user": "api-user"
}

// 處理所有傳入的資料項
for (const item of $input.all()) {
// 檢查 Dify 的答案是否存在
if (item.json && item.json.answer) {
let rawAnswer = item.json.answer;
// --- 核心 JSON 清理邏輯 ---
let cleanedString = rawAnswer;
// 1. 移除開頭和結尾的 Markdown 標籤 (```json 和 ```)
// 使用正則表達式來尋找 JSON 物件的邊界
const jsonMatch = cleanedString.match(/\{[\s\S]*\}/);
if (jsonMatch && jsonMatch[0]) {
// 如果找到 { 開頭和 } 結尾的區塊,我們只取那個區塊
cleanedString = jsonMatch[0];
} else {
// 如果找不到,則將整個字串 trim() 後嘗試解析
cleanedString = cleanedString.trim();
}
// 2. 移除所有不必要的換行符(雖然 JSON.parse 應該能處理,但保險起見)
// 注意:這裡不移除所有的 \n,因為 \n 在字串值內是合法的。
try {
// 嘗試解析最終清理過的字串
let parsedData = JSON.parse(cleanedString);
// 成功:輸出解析後的物件
return [{ json: parsedData }];
} catch (e) {
// 失敗:輸出錯誤資訊,並將清理過的字串一起輸出,方便您確認
console.error("JSON Parsing failed:", e);
// 這是讓流程中斷並顯示錯誤的原因
return [{ json: {
error: "JSON_PARSE_ERROR",
raw_output: rawAnswer,
cleaned_attempt: cleanedString,
parse_error: e.toString()
} }];
}
}
}
// 如果沒有找到答案,返回錯誤
return [{ json: { error: "No answer found in the previous node." } }];
```

JSON 節點解析後的資料,並寫入 Notion。Database
Create
Properties:
| Notion Property Name | Value (Expression) | 引用資料來源 |
|---|---|---|
| 標題 | {{ $json.meeting_title }} |
JSON 節點的輸出 |
| 會議類型 | {{ $json.type }} |
JSON 節點的輸出 |
| 重點摘要 | {{ $json.summary }} |
JSON 節點的輸出 |
| 待辦事項 | {{ $json.action_items }} |
JSON 節點的輸出 |


Manual Trigger 節點的 Execute Workflow。