- 前往 Google Sheets 新建空白試算表。
- 點擊選單「擴充功能」>「Apps Script」。
- 清空預設程式碼,貼上下方語法並點擊「儲存」。
- 點右上角「部署」>「新增部署」,類型選「網頁應用程式 (Web App)」。
- 執行身份選「我」,誰有存取權選「所有人 (Anyone)」,點擊「部署」。
- 複製生成的 Web App 網址並貼至上方輸入框!
Google Apps Script (Code.gs)
function formatGSDate(d) {
if (!d) return '';
var dateObj = (d instanceof Date) ? d : new Date(d);
if (isNaN(dateObj.getTime())) return String(d);
var y = dateObj.getFullYear();
var m = ('0' + (dateObj.getMonth() + 1)).slice(-2);
var day = ('0' + dateObj.getDate()).slice(-2);
return y + '-' + m + '-' + day;
}
function doGet(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var wSheet = ss.getSheetByName('WeightLogs') || ss.insertSheet('WeightLogs');
var dSheet = ss.getSheetByName('DoseLogs') || ss.insertSheet('DoseLogs');
var wRows = wSheet.getDataRange().getValues();
var dRows = dSheet.getDataRange().getValues();
var weightLogs = [];
if (wRows.length > 1) {
for (var i = 1; i < wRows.length; i++) {
if (wRows[i][0]) {
weightLogs.push({
id: wRows[i][0],
date: formatGSDate(wRows[i][1]),
weight: Number(wRows[i][2]),
bodyFat: wRows[i][3] !== '' ? Number(wRows[i][3]) : null,
bmi: wRows[i][4] !== '' ? Number(wRows[i][4]) : null,
note: wRows[i][5] || ''
});
}
}
}
var doseLogs = [];
if (dRows.length > 1) {
for (var j = 1; j < dRows.length; j++) {
if (dRows[j][0]) {
doseLogs.push({
id: dRows[j][0],
date: formatGSDate(dRows[j][1]),
dose: Number(dRows[j][2]),
site: dRows[j][3] || '',
appetite: Number(dRows[j][4]) || 3,
note: dRows[j][5] || ''
});
}
}
}
return ContentService.createTextOutput(JSON.stringify({
result: 'success',
weightLogs: weightLogs,
doseLogs: doseLogs
})).setMimeType(ContentService.MimeType.JSON);
}
function doPost(e) {
if (!e || !e.postData || !e.postData.contents) {
return ContentService.createTextOutput(JSON.stringify({
result: 'error',
message: 'No post data received. Please test from the web app.'
})).setMimeType(ContentService.MimeType.JSON);
}
var data = JSON.parse(e.postData.contents);
var ss = SpreadsheetApp.getActiveSpreadsheet();
var wSheet = ss.getSheetByName('WeightLogs') || ss.insertSheet('WeightLogs');
wSheet.clear();
wSheet.appendRow(['ID', 'Date', 'Weight(kg)', 'BodyFat(%)', 'BMI', 'Note']);
if (data.weightLogs && data.weightLogs.length > 0) {
data.weightLogs.forEach(function(w) {
wSheet.appendRow([w.id, formatGSDate(w.date), w.weight, w.bodyFat || '', w.bmi || '', w.note || '']);
});
}
var dSheet = ss.getSheetByName('DoseLogs') || ss.insertSheet('DoseLogs');
dSheet.clear();
dSheet.appendRow(['ID', 'Date', 'Dose(mg)', 'Site', 'Appetite', 'Note']);
if (data.doseLogs && data.doseLogs.length > 0) {
data.doseLogs.forEach(function(d) {
dSheet.appendRow([d.id, formatGSDate(d.date), d.dose, d.site || '', d.appetite || 3, d.note || '']);
});
}
return ContentService.createTextOutput(JSON.stringify({result: 'success'}))
.setMimeType(ContentService.MimeType.JSON);
}