試驗原始數據工作表
修改「檢體序號」時系統會自動辨識檢體類別。亦可手動在選單中微調。
Formaldehyde Quantitative Analysis System (Spectrophotometry & HPLC)
修改「檢體序號」時系統會自動辨識檢體類別。亦可手動在選單中微調。
| # | 分析日期 | 檢體序號 | 檢體類別 | 檢液理論濃度 (μg/mL) |
檢體理論含量 (mg/kg) |
取樣重量 M (g) |
定容體積 V (mL) |
分光吸光值 (550 nm) |
HPLC 積分面積 (425 nm) |
操作 |
|---|
依據檢驗方法與濃度範圍,自動套用 ICV 相對誤差、回收率及相對差異容許範圍。
| 分析儀器方法 | 容許範圍 |
|---|---|
| 分光光度法、原子吸收光譜法 | -10% ~ +10% |
| 氣相/液相/離子層析法、ICP-OES、ICP-MS | -15% ~ +15% |
| 氣相層析質譜及串聯質譜、液相層析串聯質譜 | -20% ~ +20% |
| 濃度範圍 | 回收率 |
|---|---|
| ≥ 100 | 85% ~ 110% |
| > 10 ~ 100 | 80% ~ 115% |
| > 1 ~ 10 | 75% ~ 120% |
| > 0.1 ~ 1 | 70% ~ 120% |
| > 0.01 ~ 0.1 | 70% ~ 120% |
| ≤ 0.01 | 60% ~ 125% |
| 濃度範圍 | 最大容許值 |
|---|---|
| ≥ 1 | 10% |
| > 0.1 ~ 1 | 15% |
| > 0.01 ~ 0.1 | 20% |
| > 0.001 ~ 0.01 | 25% |
| ≤ 0.001 | 30% |
所有標準曲線相關係數 r、ICV 相對誤差、QC/QCr 回收率與平行樣 SPL/SPLr RPD 均符合規範標準。
| 分析方法 | 空白試驗 (BLK) | ICV 檢液濃度 | ICV 相對誤差 | QC 回收率 | QCr 回收率 | QC/QCr 平均回收率 | QC/QCr RPD | SPL/SPLr RPD | 品管綜合判定 |
|---|
每個檢體均先扣除 H2O (ZERO) 吸收值後,以校正後吸光值進行線性擬合計算。
| 分析日期 | 檢體序號 | 檢體類別 | 原始吸光值 | 校正後吸光值 | 檢液濃度 (μg/mL) | 取樣量 (g) | 定容量 (mL) | 檢體含量 (mg/kg) | 最終報告結果 |
|---|
直接以訊號積分面積進行標準曲線擬合(不扣除 H2O 吸收值)。
| 分析日期 | 檢體序號 | 檢體類別 | 訊號積分面積 | 檢液濃度 (μg/mL) | 取樣量 (g) | 定容量 (mL) | 檢體含量 (mg/kg) | 最終報告結果 |
|---|
Formaldehyde Analysis & QA System - Version Log
HPLC ICV 與品管允收範圍動態判定修正。
iPhone Safari 改用原生列印預覽,避免 PDF 空白頁。
修正一般瀏覽器下載 PDF 時的空白頁問題。
新增可選日期與筆數的空白檢體重量紀錄表 PDF。
範例日期自動化,以及分光光度法與 HPLC 品管儀表板左右分欄顯示。
Cloudflare D1 資料儲存、Gemini OCR 修正、API Key 連線測試及錯誤提示。
基礎單一分光光度法數據線上計算、線性擬合與 CSV 輸入匯出功能。
上傳天平秤重、分光光度計或 HPLC 數據照片,系統自動擷取數據並帶入
Agnes 使用伺服器端 API Key;Gemini 維持原有瀏覽器 API Key 流程。
💡 API Key 預設隱藏,可選擇儲存在此瀏覽器,未送至 D1。請先按「測試連線」確認金鑰有效。
設定 Google Apps Script Web App URL 實現每日數據自動寫入歷史雲端庫
部署步驟:開啟 Google 試算表 → 點選選單「擴充功能」 → 「Apps Script」 → 清空原內容並貼上以下程式碼 → 點擊右上「部署」 → 「新增部署」 → 選擇「網頁應用程式 (Web App)」 → 將誰可以存取設為「所有人 (Anyone)」 → 複製獲得的 Web App 網址貼於上方!
function doPost(e) {
try {
var data = JSON.parse(e.postData.contents);
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("甲醛檢驗歷史紀錄") || ss.insertSheet("甲醛檢驗歷史紀錄");
// 建立表頭
if (sheet.getLastRow() === 0) {
sheet.appendRow([
"同步時間", "分析日期", "檢體序號", "檢體類別",
"理論濃度(μg/mL)", "理論含量(mg/kg)", "取樣重量(g)", "定容體積(mL)",
"分光吸光值", "HPLC面積", "分光計算濃度", "分光計算含量",
"分光結果", "HPLC計算濃度", "HPLC計算含量", "HPLC結果"
]);
sheet.getRange(1, 1, 1, 16).setFontWeight("bold").setBackground("#f1f5f9");
}
var timestamp = new Date().toLocaleString("zh-TW", {timeZone: "Asia/Taipei"});
data.rows.forEach(function(r) {
sheet.appendRow([
timestamp,
r.date || data.date,
r.id,
r.type,
r.conc_theory !== null && r.conc_theory !== undefined ? r.conc_theory : "",
r.content_theory !== null && r.content_theory !== undefined ? r.content_theory : "",
r.weight !== null && r.weight !== undefined ? r.weight : "",
r.volume !== null && r.volume !== undefined ? r.volume : "",
r.spectro_abs !== null && r.spectro_abs !== undefined ? r.spectro_abs : "",
r.hplc_area !== null && r.hplc_area !== undefined ? r.hplc_area : "",
r.conc_calc !== undefined && r.conc_calc !== null ? r.conc_calc : "",
r.content_calc !== undefined && r.content_calc !== null ? r.content_calc : "",
r.final_text || "",
r.hplc_conc_calc !== undefined && r.hplc_conc_calc !== null ? r.hplc_conc_calc : "",
r.hplc_content_calc !== undefined && r.hplc_content_calc !== null ? r.hplc_content_calc : "",
r.hplc_final_text || ""
]);
});
return ContentService.createTextOutput(JSON.stringify({result: "success"}))
.setMimeType(ContentService.MimeType.JSON);
} catch(err) {
return ContentService.createTextOutput(JSON.stringify({result: "error", error: err.toString()}))
.setMimeType(ContentService.MimeType.JSON);
}
}