跳到主要內容跳到頁尾
案例
  • 減錯
  • 省時

內容審核團隊:規範、檢核與歷史紀錄放進同一個工作台

把內容、檢核與參考資料放進同一個工作台,自動標記風險,保留人工最終審核。

2026/02
內容平台、每日處理量 300 → 500 件
案例閱讀約 10 分鐘
背景與使用技術(3 項)

為內容平台打造 Google 試算表半自動化審核系統,把規範、關鍵字檢核與歷史紀錄放進同一個工作台,保留人工最終判斷。審核錯誤率 15% → 12%(實測)。

Google 試算表Google Apps ScriptQUERY

誰在用

內容平台的產品營運團隊:審核員負責逐篇審核,主管負責品質與培訓。

原本怎麼做

團隊每天要審核數百篇使用者提交的內容,確保符合平台規範與法規。審核時要切換 5 到 7 個視窗:先看內容,再查違規關鍵字清單、審核規範文件(60 頁以上)、使用者的歷史紀錄,最後回到審核系統填結果。單篇平均約 10 分鐘,遇到棘手案件還要多花 2 分鐘以上調閱紀錄。長時間重複性工作也容易漏看違規內容,或誤判合規內容。

前後對比

平均審核時間改造前10 分鐘改造後6 分鐘實測
每日團隊處理量改造前300 件改造後500 件實測
審核錯誤率改造前15%改造後12%實測
使用者申訴案件改造前每月 45 件改造後每月 29 件實測
不同審核員的判斷差異改造前35%改造後12%實測
新人達到獨立作業改造前3 週改造後1.5 週實測

量測:實測=有計時或有紀錄;估計=喜特先生推估;客戶自述=客戶回報;規格=設計上的固定條件;待補=尚未取得數字。

流程一眼看懂

改造前
  1. 開啟待審內容

  2. 切換規範、關鍵字、歷史紀錄

  3. 回審核系統填結果

  4. 拒絕時再查規範找理由

  5. 提交

改造後
  1. 待審內容進同一個工作台

  2. 公式自動檢核並標風險

  3. 自動帶出規範與歷史

  4. 審核員判斷(下拉選單)

  5. 通知與日報

流程示意:依本案既有做法整理,非客戶實際畫面。

做了什麼

  1. 半自動而不是全自動:機器擋掉重複性檢查,最終決定仍由審核員下。
  2. 所有資訊集中在一個工作台,不必再切換視窗查資料。
  3. 結論與拒絕理由都用下拉選單標準化,讓不同人的判斷一致。
  4. 用顏色把風險高的案件、慣性違規的使用者排到最前面。
  5. 品質儀表板讓主管追蹤處理量、平均時間與申訴率。

程式碼與實作細節收在頁面下方,需要時再展開。

你的情況像這樣嗎?

  • 審核或比對要同時翻好幾份文件、清單與歷史紀錄。
  • 不同人對同一種內容的判斷常不一致。
  • 你想自動擋掉明顯的問題,但最終決定仍要由人下。

更多成果與運作條件

  • 平均審核時間 10 分鐘 → 6 分鐘(實測)

    單案審核時間;每日團隊處理量由 300 件增加到 500 件

  • 審核錯誤率 15% → 12%(實測)

    自動檢核減少漏看與誤判;使用者申訴案件由每月 45 件降到 29 件

  • 不同審核員的判斷差異 35% → 12%(實測)

    結論與拒絕理由改用下拉選單標準化

  • 新人達到獨立作業 3 週 → 1.5 週(實測):系統內建提示、參考資料與練習模式

以上為本案既有成果與運作條件;估計值依原始資料標示,其他專案需另行評估,並非通用成效保證。

挑戰:原本遇到的困難

產品營運團隊每日需要審核數百篇使用者提交的內容,確保符合平台規範與法規要求。審核團隊面臨效率與品質兩方面的挑戰:

  • 審核速度緩慢:每位審核員需要逐一檢查內容是否包含違規關鍵字、主旨是否不符規範,單篇內容平均審核約 10 分鐘,面對日益增長的內容量稍顯吃力
  • 資料查找耗時:審核過程中需要頻繁切換視窗查閱內容規範文件(60 頁以上的 Google 文件),遇到較為棘手的案件還需要調閱更多過往紀錄與文件,要多花 2 分鐘以上
  • 人為疏失風險:長時間重複性工作容易導致注意力不集中,審核員可能漏看關鍵違規內容或誤判合規內容,造成平台風險或使用者糾紛

這些問題導致審核團隊需要不斷擴編應對內容增長,人力成本攀升,審核品質也難以保證。

完整解決方案與設計取捨

設計了一套半自動化內容審核系統,運用 Google 試算表的進階功能與 Google Apps Script,在保留人工最終判斷的前提下,把重複性的檢查交給系統。

核心設計

  1. 審核工作台:單一介面整合所有審核所需資訊,審核員不需切換視窗即可完成檢查
  2. 自動關鍵字檢核:用 REGEXMATCH、SEARCH 等函式掃描違規關鍵字、敏感詞彙與格式問題,並標示警示
  3. 參考資料自動帶出:用 VLOOKUP、QUERY 依檢核結果顯示相關規範、判例與處理建議,並查詢該使用者的過往紀錄
  4. 條件格式引導:用顏色標出違規內容與慣性違規使用者,引導審核員優先關注
  5. 標準化輸入:審核結論、拒絕理由、風險分級都用下拉選單,讓不同人的判斷一致
  6. Apps Script 自動化:自動計算審核時間、寄出審核結果通知、產生每日報表、標記需要二審的案件
  7. 品質儀表板:追蹤每位審核員的處理量、平均時間、通過率與申訴率,協助主管管理品質

技術與實作細節

展開完整實作說明

先觀察現有流程

先與審核團隊進行為期一週的實地觀察,記錄實際工作流程。典型的審核步驟如下:

  1. 開啟待審核內容(文章、圖片、影片)
  2. 瀏覽內容,初步判斷類型與風險
  3. 切換到「違規關鍵字清單」檢查是否包含敏感詞
  4. 切換到「審核規範文件」確認處理標準
  5. 切換到「歷史記錄系統」查詢該使用者過往記錄
  6. 切換回審核系統填寫審核結果
  7. 如需拒絕,再次查閱規範找出合適的拒絕理由
  8. 提交審核結果

整個流程需要切換 5 到 7 個視窗,大量時間花在查找資料上。據此定義了系統需求:

  • 單一工作介面:所有資訊集中在一個試算表中
  • 自動化檢核:機器能做的檢查交給系統自動完成
  • 提示:根據內容特徵顯示相關參考資料
  • 標準化輸入:確保審核標準一致
  • 完整記錄:所有審核過程可追溯

審核工作台

設計了一個整合式的審核工作表,包含以下欄位:

欄位名稱功能說明技術實作
案件編號自動產生唯一識別碼
提交時間記錄內容提交時間由系統自動填入
使用者 ID內容提交者識別碼由系統自動填入
內容類型文章/圖片/影片下拉選單
內容摘要前 200 字預覽由系統自動填入
內容連結點擊查看完整內容超連結
自動檢核結果系統自動掃描結果複合函數(見下方說明)
使用者歷史過往審核記錄摘要QUERY 函數
參考規範相關審核規範自動顯示VLOOKUP 函數
審核員負責審核的員工自動記錄登入帳號
審核結論通過/拒絕/標記二審下拉選單
拒絕理由選擇標準化理由下拉選單(多選)
詳細說明補充說明(選填)自由文字
審核時間處理耗時(分鐘)自動計算
風險等級低/中/高條件格式自動標示

自動關鍵字檢核

這是系統的核心功能。建立了一個「違規關鍵字資料庫」工作表,包含:

  • 嚴重違規詞(如暴力、色情、仇恨言論)
  • 可疑詞彙(如誇大宣傳、未經證實的醫療聲稱)
  • 格式違規模式(如過多符號、全大寫標題)

在審核工作台的「自動檢核結果」欄位,使用複合公式:

Google 試算表公式
fx
=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 自動查詢該使用者的過往記錄:

Google 試算表公式
fx
=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%:綠色(良好記錄)

參考規範自動顯示

在「參考規範」欄位,依自動檢核結果顯示相關的審核規範:

Google 試算表公式
fx
=IF(G2="✅ 初步檢查通過", "無特殊注意事項", VLOOKUP(REGEXEXTRACT(G2, "[^:]+"), 審核規範資料庫!A:B, 2, FALSE))

審核規範資料庫的結構如下(範例資料):

違規類型處理規範
賭博依據《平台使用條款》第 3.2 條,任何涉及賭博、博弈的內容一律拒絕。建議拒絕理由選擇「違反平台規範-賭博內容」
色情依據《平台使用條款》第 3.1 條及相關法規,任何色情、裸露內容一律拒絕。需同時通報法務部門。建議拒絕理由選擇「違反平台規範-成人內容」
保證獲利依據《廣告規範》,任何保證投資報酬的內容需提供合法金融執照證明,否則拒絕。建議拒絕理由選擇「誇大不實宣傳」

這樣審核員不需記憶所有規範,系統會提示正確的處理方式與依據。

標準化輸入

為確保審核判斷一致,把所有主觀判斷轉換成標準化選項。

審核結論下拉選單:

  • 通過
  • 拒絕
  • 標記二審(灰色地帶案件,需資深審核員覆核)
  • 暫時擱置(需補充資料)

拒絕理由下拉選單支援多選,並分兩層:

  • 第一層分類:違反平台規範、違反法律法規、格式不符、內容品質問題、重複提交
  • 第二層細項(以「違反平台規範」為例):賭博內容、成人內容、暴力血腥、仇恨言論、誇大不實、侵害智慧財產權

理由清單統一維護在「參數設定」工作表,用數據驗證的「清單來自範圍」功能引用,日後調整只需改一處。多選下拉選單用 Apps Script 做到。以下程式為簡化示意:欄號以實際工作表為準,而且同一個專案只能有一個 onEdit,實際使用時要把下面兩段 onEdit 的邏輯合併成同一個函式。

Code.gs
Apps Script
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 自動化功能。

自動計算審核時間

Code.gs
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));
}
}

自動發送審核結果通知

Code.gs
Apps Script
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());
  }
}
}
Code.gs
Apps Script
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 分鐘執行一次。

自動產生每日審核報表

Code.gs
Apps Script
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 自動執行,主管下班前就能收到當日審核摘要。

二審案件自動標記

Code.gs
Apps Script
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 函數計算:

  • 本日、本週、本月總處理案件數
  • 平均審核時間趨勢
  • 通過率與拒絕率
  • 申訴案件數與申訴率

申訴分析表

追蹤哪些類型的審核決定最容易被申訴:

Google 試算表公式
fx
=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 自動比對新人的審核結論與標準答案
  • 產生練習成績報告,指出需要加強的部分
Code.gs
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 測試新規則:對有爭議的審核標準,隨機分配給不同審核員測試,收集數據後再決定是否全面實施

延伸閱讀

有類似的情境想討論

帶著現有流程與去識別範例,討論適合的做法。