試驗原始數據工作表
修改「檢體序號」時系統會自動辨識檢體類別。亦可手動在選單中微調。
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
Agnes OCR 初次整合、OCR 預覽確認、D1 分析結果保存、品管規則及平行樣 RPD 修正。
目前工作目錄及 Git 歷史沒有可完整驗證的逐版本紀錄,暫不補寫推測內容。
HPLC ICV 與品管允收範圍動態判定修正。
iPhone Safari 改用原生列印預覽,避免 PDF 空白頁。
修正一般瀏覽器下載 PDF 時的空白頁問題。
新增可選日期與筆數的空白檢體重量紀錄表 PDF。
範例日期自動化,以及分光光度法與 HPLC 品管儀表板左右分欄顯示。
Cloudflare D1 資料儲存、Gemini OCR 修正、API Key 連線測試及錯誤提示。
基礎單一分光光度法數據線上計算、線性擬合與 CSV 輸入匯出功能。
上傳天平秤重、分光光度計或 HPLC 數據照片,系統自動擷取數據並帶入
Agnes 與 Gemini 都使用伺服器端 API Key;模型選項由後端 whitelist 控制。
設定 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);
}
}