跳到主要內容區

URL

const GAS_URL = "https://script.google.com/macros/s/AKfycbyWt57WKfyOH23wRmafcx-_r37C7wr2C3cAW_Hr6w_LsBo0nW8ddX_nC9aBaR5EbiecxA/exec"; let items = []; let isAdmin = false; // 1. 從 Google Sheets 讀取資料 async function fetchItems() { try { const response = await fetch(GAS_URL); const data = await response.json(); // 將陣列格式轉回物件格式供網頁顯示 items = data.map((row, index) => ({ id: index, date: row[0], loc: row[1], desc: row[2], counter: row[3], officer: row[4], photos: [row[5], row[6], row[7]].filter(p => p !== "") })); renderTable(); } catch (e) { console.error("讀取失敗", e); } } // 2. 新增資料到 Google Sheets async function addItem() { const btn = document.querySelector('.btn-add'); btn.disabled = true; btn.innerText = "上傳中..."; const photoFiles = document.getElementById('input-photos').files; const photoBase64 = []; for (let i = 0; i < Math.min(photoFiles.length, 3); i++) { const base64 = await toBase64(photoFiles[i]); photoBase64.push(base64); } const payload = { date: document.getElementById('input-date').value, loc: document.getElementById('input-location').value, desc: document.getElementById('input-desc').value, counter: document.getElementById('input-counter').value, officer: document.getElementById('input-officer').value, photos: photoBase64 }; try { await fetch(GAS_URL, { method: "POST", body: JSON.stringify(payload) }); alert("資料已同步至 Google Sheets!"); location.reload(); // 重新整理讀取新資料 } catch (e) { alert("上傳失敗"); } } // 轉 Base64 工具 (同上) const toBase64 = file => new Promise((resolve, reject) => { const reader = new FileReader(); reader.readAsDataURL(file); reader.onload = () => resolve(reader.result); reader.onerror = error => reject(error); }); // 初始化 fetchItems();