const SHEET_NAME = ''; // 留空=使用目前試算表的第一個工作表;若要指定可填入工作表名稱
function getSheet_() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
if (SHEET_NAME) {
const sheet = ss.getSheetByName(SHEET_NAME);
if (!sheet) throw new Error('找不到工作表:' + SHEET_NAME);
return sheet;
}
return ss.getSheets()[0];
}
function doGet(e) {
try {
const sheet = getSheet_();
const values = sheet.getDataRange().getValues();
const result = [];
if (values.length > 1) {
const headers = values[0].map(String);
for (let i = 1; i < values.length; i++) {
const row = values[i];
const obj = {};
headers.forEach((h, j) => obj[h] = row[j]);
result.push(obj);
}
}
// JSONP:讓 pages.dev / iPhone Safari 可以跨來源讀取
const callback = e && e.parameter && e.parameter.callback;
if (callback) {
if (!/^[A-Za-z_$][0-9A-Za-z_$]*$/.test(callback)) {
throw new Error('Invalid callback');
}
return ContentService
.createTextOutput(callback + '(' + JSON.stringify(result) + ')')
.setMimeType(ContentService.MimeType.JAVASCRIPT);
}
return json_({ status: 'success', data: result });
} catch (err) {
return json_({ status: 'error', message: String(err) });
}
}
function doPost(e) {
try {
// 同時支援 JSON POST 與手機 Safari 使用的表單 POST
let payload;
if (e && e.postData && e.postData.contents) {
try {
payload = JSON.parse(e.postData.contents);
} catch (jsonError) {
payload = JSON.parse((e.parameter && e.parameter.payload) || '{}');
}
} else if (e && e.parameter && e.parameter.payload) {
payload = JSON.parse(e.parameter.payload);
} else {
throw new Error('沒有收到 POST 資料');
}
const records = Array.isArray(payload)
? payload
: (Array.isArray(payload.records) ? payload.records : []);
const sheet = getSheet_();
const headers = ['id', 'brand', 'name', 'sweetness', 'temp', 'toppings', 'rating', 'comment', 'createdAt'];
// 一次寫入,比 appendRow 一筆一筆寫快很多,也比較不容易逾時。
sheet.clearContents();
sheet.getRange(1, 1, 1, headers.length).setValues([headers]);
if (records.length > 0) {
const rows = records.map(item => headers.map(h => item[h] ?? ''));
sheet.getRange(2, 1, rows.length, headers.length).setValues(rows);
}
SpreadsheetApp.flush();
return json_({ status: 'success', count: records.length });
} catch (err) {
return json_({ status: 'error', message: String(err) });
}
}
function json_(data) {
return ContentService
.createTextOutput(JSON.stringify(data))
.setMimeType(ContentService.MimeType.JSON);
}