- 減錯
- 省時
內容審核團隊:規範、檢核與歷史紀錄放進同一個工作台
把內容、檢核與參考資料放進同一個工作台,自動標記風險,保留人工最終審核。
背景與使用技術(3 項)
為內容平台打造 Google 試算表半自動化審核系統,把規範、關鍵字檢核與歷史紀錄放進同一個工作台,保留人工最終判斷。審核錯誤率 15% → 12%(實測)。
誰在用
內容平台的產品營運團隊:審核員負責逐篇審核,主管負責品質與培訓。
原本怎麼做
團隊每天要審核數百篇使用者提交的內容,確保符合平台規範與法規。審核時要切換 5 到 7 個視窗:先看內容,再查違規關鍵字清單、審核規範文件(60 頁以上)、使用者的歷史紀錄,最後回到審核系統填結果。單篇平均約 10 分鐘,遇到棘手案件還要多花 2 分鐘以上調閱紀錄。長時間重複性工作也容易漏看違規內容,或誤判合規內容。
前後對比
量測:實測=有計時或有紀錄;估計=喜特先生推估;客戶自述=客戶回報;規格=設計上的固定條件;待補=尚未取得數字。
流程一眼看懂
開啟待審內容
切換規範、關鍵字、歷史紀錄
回審核系統填結果
拒絕時再查規範找理由
提交
待審內容進同一個工作台
公式自動檢核並標風險
自動帶出規範與歷史
審核員判斷(下拉選單)
通知與日報
流程示意:依本案既有做法整理,非客戶實際畫面。
做了什麼
- 半自動而不是全自動:機器擋掉重複性檢查,最終決定仍由審核員下。
- 所有資訊集中在一個工作台,不必再切換視窗查資料。
- 結論與拒絕理由都用下拉選單標準化,讓不同人的判斷一致。
- 用顏色把風險高的案件、慣性違規的使用者排到最前面。
- 品質儀表板讓主管追蹤處理量、平均時間與申訴率。
程式碼與實作細節收在頁面下方,需要時再展開。
你的情況像這樣嗎?
- 審核或比對要同時翻好幾份文件、清單與歷史紀錄。
- 不同人對同一種內容的判斷常不一致。
- 你想自動擋掉明顯的問題,但最終決定仍要由人下。
更多成果與運作條件
平均審核時間 10 分鐘 → 6 分鐘(實測)
單案審核時間;每日團隊處理量由 300 件增加到 500 件
審核錯誤率 15% → 12%(實測)
自動檢核減少漏看與誤判;使用者申訴案件由每月 45 件降到 29 件
不同審核員的判斷差異 35% → 12%(實測)
結論與拒絕理由改用下拉選單標準化
- 新人達到獨立作業 3 週 → 1.5 週(實測):系統內建提示、參考資料與練習模式
以上為本案既有成果與運作條件;估計值依原始資料標示,其他專案需另行評估,並非通用成效保證。
挑戰:原本遇到的困難
產品營運團隊每日需要審核數百篇使用者提交的內容,確保符合平台規範與法規要求。審核團隊面臨效率與品質兩方面的挑戰:
- 審核速度緩慢:每位審核員需要逐一檢查內容是否包含違規關鍵字、主旨是否不符規範,單篇內容平均審核約 10 分鐘,面對日益增長的內容量稍顯吃力
- 資料查找耗時:審核過程中需要頻繁切換視窗查閱內容規範文件(60 頁以上的 Google 文件),遇到較為棘手的案件還需要調閱更多過往紀錄與文件,要多花 2 分鐘以上
- 人為疏失風險:長時間重複性工作容易導致注意力不集中,審核員可能漏看關鍵違規內容或誤判合規內容,造成平台風險或使用者糾紛
這些問題導致審核團隊需要不斷擴編應對內容增長,人力成本攀升,審核品質也難以保證。
完整解決方案與設計取捨
設計了一套半自動化內容審核系統,運用 Google 試算表的進階功能與 Google Apps Script,在保留人工最終判斷的前提下,把重複性的檢查交給系統。
核心設計
- 審核工作台:單一介面整合所有審核所需資訊,審核員不需切換視窗即可完成檢查
- 自動關鍵字檢核:用
REGEXMATCH、SEARCH等函式掃描違規關鍵字、敏感詞彙與格式問題,並標示警示 - 參考資料自動帶出:用
VLOOKUP、QUERY依檢核結果顯示相關規範、判例與處理建議,並查詢該使用者的過往紀錄 - 條件格式引導:用顏色標出違規內容與慣性違規使用者,引導審核員優先關注
- 標準化輸入:審核結論、拒絕理由、風險分級都用下拉選單,讓不同人的判斷一致
- Apps Script 自動化:自動計算審核時間、寄出審核結果通知、產生每日報表、標記需要二審的案件
- 品質儀表板:追蹤每位審核員的處理量、平均時間、通過率與申訴率,協助主管管理品質
技術與實作細節
展開完整實作說明
先觀察現有流程
先與審核團隊進行為期一週的實地觀察,記錄實際工作流程。典型的審核步驟如下:
- 開啟待審核內容(文章、圖片、影片)
- 瀏覽內容,初步判斷類型與風險
- 切換到「違規關鍵字清單」檢查是否包含敏感詞
- 切換到「審核規範文件」確認處理標準
- 切換到「歷史記錄系統」查詢該使用者過往記錄
- 切換回審核系統填寫審核結果
- 如需拒絕,再次查閱規範找出合適的拒絕理由
- 提交審核結果
整個流程需要切換 5 到 7 個視窗,大量時間花在查找資料上。據此定義了系統需求:
- 單一工作介面:所有資訊集中在一個試算表中
- 自動化檢核:機器能做的檢查交給系統自動完成
- 提示:根據內容特徵顯示相關參考資料
- 標準化輸入:確保審核標準一致
- 完整記錄:所有審核過程可追溯
審核工作台
設計了一個整合式的審核工作表,包含以下欄位:
| 欄位名稱 | 功能說明 | 技術實作 |
|---|---|---|
| 案件編號 | 自動產生唯一識別碼 | |
| 提交時間 | 記錄內容提交時間 | 由系統自動填入 |
| 使用者 ID | 內容提交者識別碼 | 由系統自動填入 |
| 內容類型 | 文章/圖片/影片 | 下拉選單 |
| 內容摘要 | 前 200 字預覽 | 由系統自動填入 |
| 內容連結 | 點擊查看完整內容 | 超連結 |
| 自動檢核結果 | 系統自動掃描結果 | 複合函數(見下方說明) |
| 使用者歷史 | 過往審核記錄摘要 | QUERY 函數 |
| 參考規範 | 相關審核規範自動顯示 | VLOOKUP 函數 |
| 審核員 | 負責審核的員工 | 自動記錄登入帳號 |
| 審核結論 | 通過/拒絕/標記二審 | 下拉選單 |
| 拒絕理由 | 選擇標準化理由 | 下拉選單(多選) |
| 詳細說明 | 補充說明(選填) | 自由文字 |
| 審核時間 | 處理耗時(分鐘) | 自動計算 |
| 風險等級 | 低/中/高 | 條件格式自動標示 |
自動關鍵字檢核
這是系統的核心功能。建立了一個「違規關鍵字資料庫」工作表,包含:
- 嚴重違規詞(如暴力、色情、仇恨言論)
- 可疑詞彙(如誇大宣傳、未經證實的醫療聲稱)
- 格式違規模式(如過多符號、全大寫標題)
在審核工作台的「自動檢核結果」欄位,使用複合公式:
=LET(內容, F2, 嚴重違規, SUMPRODUCT(--ISNUMBER(SEARCH(違規關鍵字!A:A, 內容))), 可疑詞彙, SUMPRODUCT(--ISNUMBER(SEARCH(違規關鍵字!B:B, 內容))), 格式問題, IF(LEN(內容)-LEN(SUBSTITUTE(內容,"!",""))>10, 1, 0), IF(嚴重違規>0, "⛔ 發現 " & 嚴重違規 & " 個嚴重違規詞:" & TEXTJOIN(", ", TRUE, FILTER(違規關鍵字!A:A, ISNUMBER(SEARCH(違規關鍵字!A:A, 內容)))), IF(可疑詞彙>0, "⚠️ 發現 " & 可疑詞彙 & " 個可疑詞彙:" & TEXTJOIN(", ", TRUE, FILTER(違規關鍵字!B:B, ISNUMBER(SEARCH(違規關鍵字!B:B, 內容)))), IF(格式問題>0, "⚠️ 格式異常:過多驚嘆號", "✅ 初步檢查通過"))))這個公式會掃描內容是否包含違規關鍵字、統計數量、列出具體詞彙,並用不同圖示標示風險等級。輸出範例:
- ⛔ 發現 2 個嚴重違規詞:賭博, 色情
- ⚠️ 發現 1 個可疑詞彙:保證獲利
- ✅ 初步檢查通過
審核員一眼就能看出內容是否有明顯問題,不需手動逐字檢查。
使用者歷史比對
在「使用者歷史」欄位,用 QUERY 自動查詢該使用者的過往記錄:
=QUERY(歷史審核記錄!A:J, "SELECT COUNT(A), SUM(H='拒絕')/COUNT(A), MAX(B) WHERE C='" & C2 & "' LABEL COUNT(A) '總提交數', SUM(H='拒絕')/COUNT(A) '拒絕率', MAX(B) '最後提交日期'", 0)這個公式會顯示該使用者的歷史總提交數、拒絕率(識別累犯)與最後一次提交日期(識別洗版行為)。條件格式規則如下:
- 拒絕率 > 50%:紅色(高風險使用者)
- 拒絕率 20–50%:橙色(需注意)
- 拒絕率 < 20%:綠色(良好記錄)
參考規範自動顯示
在「參考規範」欄位,依自動檢核結果顯示相關的審核規範:
=IF(G2="✅ 初步檢查通過", "無特殊注意事項", VLOOKUP(REGEXEXTRACT(G2, "[^:]+"), 審核規範資料庫!A:B, 2, FALSE))審核規範資料庫的結構如下(範例資料):
| 違規類型 | 處理規範 |
|---|---|
| 賭博 | 依據《平台使用條款》第 3.2 條,任何涉及賭博、博弈的內容一律拒絕。建議拒絕理由選擇「違反平台規範-賭博內容」 |
| 色情 | 依據《平台使用條款》第 3.1 條及相關法規,任何色情、裸露內容一律拒絕。需同時通報法務部門。建議拒絕理由選擇「違反平台規範-成人內容」 |
| 保證獲利 | 依據《廣告規範》,任何保證投資報酬的內容需提供合法金融執照證明,否則拒絕。建議拒絕理由選擇「誇大不實宣傳」 |
這樣審核員不需記憶所有規範,系統會提示正確的處理方式與依據。
標準化輸入
為確保審核判斷一致,把所有主觀判斷轉換成標準化選項。
審核結論下拉選單:
- 通過
- 拒絕
- 標記二審(灰色地帶案件,需資深審核員覆核)
- 暫時擱置(需補充資料)
拒絕理由下拉選單支援多選,並分兩層:
- 第一層分類:違反平台規範、違反法律法規、格式不符、內容品質問題、重複提交
- 第二層細項(以「違反平台規範」為例):賭博內容、成人內容、暴力血腥、仇恨言論、誇大不實、侵害智慧財產權
理由清單統一維護在「參數設定」工作表,用數據驗證的「清單來自範圍」功能引用,日後調整只需改一處。多選下拉選單用 Apps Script 做到。以下程式為簡化示意:欄號以實際工作表為準,而且同一個專案只能有一個 onEdit,實際使用時要把下面兩段 onEdit 的邏輯合併成同一個函式。
function onEdit(e) {
var sheet = e.source.getActiveSheet();
var range = e.range;
if (range.getColumn() === 11 && range.getRow() > 1) {
var oldValue = e.oldValue || '';
var newValue = e.value;
if (oldValue.indexOf(newValue) > -1) {
range.setValue(oldValue.replace(newValue + ', ', '').replace(newValue, ''));
} else {
range.setValue(oldValue ? oldValue + ', ' + newValue : newValue);
}
}
}這讓審核員可以選擇多個拒絕理由,例如「違反平台規範 - 賭博內容, 誇大不實宣傳」。
條件格式引導
用條件格式讓審核員快速識別需要優先處理的案件。
整列規則:
- 嚴重違規案件(紅色底):
$G2開頭為「⛔」,優先處理高風險內容 - 可疑案件(橙色底):
$G2開頭為「⚠️」,需要仔細審查 - 累犯使用者(紫色左側粗邊框):使用者歷史拒絕率 > 50%,提高警覺
- 已完成審核(灰色底):
$K2不為空,區分待辦與已完成
欄位規則:
- 「審核時間」欄位:> 15 分鐘紅色(處理過慢,可能需要協助)、8–15 分鐘橙色、< 8 分鐘綠色
- 「風險等級」欄位:高為紅色底白字、中為橙色底、低為綠色底
這些設計讓審核員能在數百筆待審案件中,聚焦在最需要關注的內容。
Apps Script 自動化
開發了一系列 Apps Script 自動化功能。
自動計算審核時間
function onEdit(e) {
var sheet = e.source.getActiveSheet();
var range = e.range;
if (range.getColumn() === 11 && range.getRow() > 1) {
var row = range.getRow();
var startTime = sheet.getRange(row, 2).getValue();
var endTime = new Date();
var duration = (endTime - startTime) / 60000;
sheet.getRange(row, 13).setValue(Math.round(duration));
}
}自動發送審核結果通知
function sendReviewNotification() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('審核工作台');
var data = sheet.getDataRange().getValues();
for (var i = 1; i < data.length; i++) {
var 案件編號 = data[i][0];
var 使用者ID = data[i][2];
var 審核結論 = data[i][10];
var 拒絕理由 = data[i][11];
var 已通知 = data[i][14];
if (審核結論 && !已通知) {
if (審核結論 === '通過') {
sendApprovalEmail(使用者ID, 案件編號);
} else if (審核結論 === '拒絕') {
sendRejectionEmail(使用者ID, 案件編號, 拒絕理由);
}
sheet.getRange(i + 1, 15).setValue('已通知 ' + new Date());
}
}
}function sendRejectionEmail(userId, caseId, reason) {
var userEmail = getUserEmail(userId);
MailApp.sendEmail({
to: userEmail,
subject: '內容審核結果通知 - ' + caseId,
htmlBody: "<p>您好,</p><p>您提交的內容(案件編號:" + caseId + ")經審核後未能通過,原因如下:</p><p><strong>" + reason + "</strong></p><p>請修正後重新提交。如有疑問,歡迎聯繫客服。</p><p>感謝您的配合。</p>"
});
}觸發條件設定為每 5 分鐘執行一次。
自動產生每日審核報表
function generateDailyReport() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('審核工作台');
var data = sheet.getDataRange().getValues();
var today = new Date().toDateString();
var 總案件數 = 0, 通過數 = 0, 拒絕數 = 0, 總審核時間 = 0;
var 審核員統計 = {};
for (var i = 1; i < data.length; i++) {
var 提交時間 = new Date(data[i][1]).toDateString();
if (提交時間 === today && data[i][10]) {
總案件數++;
if (data[i][10] === '通過') 通過數++;
if (data[i][10] === '拒絕') 拒絕數++;
總審核時間 += data[i][12];
var 審核員 = data[i][9];
if (!審核員統計[審核員]) { 審核員統計[審核員] = {數量: 0, 時間: 0}; }
審核員統計[審核員].數量++;
審核員統計[審核員].時間 += data[i][12];
}
}
var 平均審核時間 = 總審核時間 / 總案件數;
var 通過率 = (通過數 / 總案件數 * 100).toFixed(1);
var reportBody = "<h2>" + today + " 審核日報</h2><p>總處理案件:" + 總案件數 + "</p><p>通過:" + 通過數 + " | 拒絕:" + 拒絕數 + " | 通過率:" + 通過率 + "%</p><p>平均審核時間:" + 平均審核時間.toFixed(1) + " 分鐘</p><h3>審核員績效</h3>";
for (var reviewer in 審核員統計) {
var 數量 = 審核員統計[reviewer].數量;
var 平均 = (審核員統計[reviewer].時間 / 數量).toFixed(1);
reportBody += "<p>" + reviewer + ":處理 " + 數量 + " 件,平均 " + 平均 + " 分鐘/件</p>";
}
MailApp.sendEmail({ to: '主管@company.com', subject: '內容審核日報 - ' + today, htmlBody: reportBody });
}設定每日晚上 6:00 自動執行,主管下班前就能收到當日審核摘要。
二審案件自動標記
function flagSecondReview() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('審核工作台');
var data = sheet.getDataRange().getValues();
for (var i = 1; i < data.length; i++) {
if (data[i][10] === '標記二審' && !data[i][15]) {
notifySeniorReviewer(data[i][0], data[i][5]);
sheet.getRange(i + 1, 16).setValue('已通知資深審核員 ' + new Date());
}
}
}品質儀表板
為了協助主管進行團隊管理與品質監控,建立了專門的「品質儀表板」工作表。
整體績效指標
使用 QUERY 與 AVERAGE 函數計算:
- 本日、本週、本月總處理案件數
- 平均審核時間趨勢
- 通過率與拒絕率
- 申訴案件數與申訴率
申訴分析表
追蹤哪些類型的審核決定最容易被申訴:
=QUERY(申訴記錄!A:F, "SELECT B, COUNT(A), COUNT(A)/總案件數 GROUP BY B ORDER BY COUNT(A) DESC LABEL B '拒絕理由', COUNT(A) '申訴次數', COUNT(A)/總案件數 '申訴率'", 1)這能幫助主管識別哪些審核標準需要調整或加強培訓。
視覺化圖表
- 審核時間趨勢折線圖:觀察團隊效率是否持續改善
- 各審核員處理量長條圖:確保工作負荷均衡
- 拒絕理由分佈圓餅圖:了解主要違規類型
- 每日處理量堆疊圖:識別尖峰時段,調整人力配置
新人培訓與持續改善
系統內建「練習模式」,讓新人在不影響正式資料的環境中學習:
- 建立「培訓案例庫」工作表,包含 50+ 個典型審核案例(含正確答案)
- 新人在「練習工作台」進行模擬審核
- Apps Script 自動比對新人的審核結論與標準答案
- 產生練習成績報告,指出需要加強的部分
function gradePractice() {
var practiceSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('練習工作台');
var answerSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('培訓案例庫');
var practiceData = practiceSheet.getDataRange().getValues();
var answers = answerSheet.getDataRange().getValues();
var correct = 0;
var total = practiceData.length - 1;
for (var i = 1; i < practiceData.length; i++) {
var 學員答案 = practiceData[i][10];
var 正確答案 = answers[i][10];
if (學員答案 === 正確答案) {
correct++;
practiceSheet.getRange(i + 1, 16).setValue('✅ 正確');
} else {
practiceSheet.getRange(i + 1, 16).setValue('❌ 錯誤,正確答案:' + 正確答案);
}
}
var score = (correct / total * 100).toFixed(1);
Browser.msgBox('練習成績:' + score + '分(' + correct + '/' + total + ')');
}新人練習達到 90 分以上,才開始正式審核工作。
持續優化機制:
- 每月審核規範更新:根據申訴分析與新法規,調整違規關鍵字清單與審核規範
- 季度系統檢討會議:審核團隊與主管共同討論改善建議
- 使用者回饋收集:在試算表中設定「問題回報」按鈕,審核員可快速提交系統 bug 或改善建議
- A/B 測試新規則:對有爭議的審核標準,隨機分配給不同審核員測試,收集數據後再決定是否全面實施