- 建立一個全新的 Google 試算表 (Google Sheets)。
- 點擊上方選單「擴充功能」>「Apps Script」。
- 清空編輯器預設內容,貼上以下 Apps Script 程式碼。
- 點擊右上角「部署」>「新增部署作業」。
- 種類選擇「Web 應用程式」,「誰有存取權」請改為 「所有人 (Anyone)」,並點擊部署。
- 複製產生的 Web App URL 並貼至上方網址欄位。
function doGet(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var wSheet = ss.getSheetByName("WeightLogs") || ss.insertSheet("WeightLogs");
var dSheet = ss.getSheetByName("DoseLogs") || ss.insertSheet("DoseLogs");
var wData = getSheetData(wSheet);
var dData = getSheetData(dSheet);
return ContentService.createTextOutput(JSON.stringify({
result: "success",
weightLogs: wData,
doseLogs: dData
})).setMimeType(ContentService.MimeType.JSON);
}
function doPost(e) {
try {
if (!e || !e.postData || !e.postData.contents) {
return ContentService.createTextOutput(JSON.stringify({
result: "error", message: "No post data"
})).setMimeType(ContentService.MimeType.JSON);
}
var data = JSON.parse(e.postData.contents);
var ss = SpreadsheetApp.getActiveSpreadsheet();
if (data.weightLogs) {
var wSheet = ss.getSheetByName("WeightLogs") || ss.insertSheet("WeightLogs");
wSheet.clear();
wSheet.appendRow(["id", "date", "weight", "bodyFat", "bmi", "note"]);
data.weightLogs.forEach(function(r) {
wSheet.appendRow([r.id, formatGSDate(r.date), r.weight, r.bodyFat || "", r.bmi || "", r.note || ""]);
});
}
if (data.doseLogs) {
var dSheet = ss.getSheetByName("DoseLogs") || ss.insertSheet("DoseLogs");
dSheet.clear();
dSheet.appendRow(["id", "date", "dose", "site", "appetite", "note"]);
data.doseLogs.forEach(function(r) {
dSheet.appendRow([r.id, formatGSDate(r.date), r.dose, r.site || "", r.appetite || "", r.note || ""]);
});
}
return ContentService.createTextOutput(JSON.stringify({ result: "success" }))
.setMimeType(ContentService.MimeType.JSON);
} catch(err) {
return ContentService.createTextOutput(JSON.stringify({ result: "error", message: err.toString() }))
.setMimeType(ContentService.MimeType.JSON);
}
}
function getSheetData(sheet) {
var data = sheet.getDataRange().getValues();
if (data.length <= 1) return [];
var headers = data[0];
var result = [];
for (var i = 1; i < data.length; i++) {
var row = data[i];
var obj = {};
for (var j = 0; j < headers.length; j++) {
if (headers[j] === "date") {
obj[headers[j]] = formatGSDate(row[j]);
} else {
obj[headers[j]] = row[j];
}
}
result.push(obj);
}
return result;
}
function formatGSDate(dVal) {
if (!dVal) return "";
var d = new Date(dVal);
if (isNaN(d.getTime())) return String(dVal);
var y = d.getFullYear();
var m = String(d.getMonth() + 1).padStart(2, "0");
var day = String(d.getDate()).padStart(2, "0");
return y + "-" + m + "-" + day;
}