把Google sheet變成JSON Api伺服器2(進階)
上一篇中製作了一個會把Google sheet變成JSON Api伺服器的簡單小程式,今天在稍微改變一下,讓它會以物件陣列的方式回傳。
之後我們會將這個小程式應用在datatables上頭。
目標
我們的目標是類似把回傳的json變成下面的兩種樣式
- [{"f1":1,"f2":2,"f3":3},{"f1":"aa","f2":"sss","f3":"aa"}]
- {"data":[{"f1":1,"f2":2,"f3":3},{"f1":"aa","f2":"sss","f3":"aa"}]}
想法
為了方便修改,我們假定sheet裡頭的第一列寫上標頭f1, f2, f3,就會自動的變成物件的屬性名稱,另外為了避免json的錯誤,如果沒有寫上標頭的欄位就會直接跳過不處理。
程式碼
function doGet(req) {
//參數群
const sheetName = req.parameter.sheet || '';
const fieldName = req.parameter.field || '';
let jsonText;
try {
const book = SpreadsheetApp.getActiveSpreadsheet();
let sheet = book.getSheetByName(sheetName);
if (null == sheet) {
sheet = book.getSheets()[0];
}
let values = sheet.getDataRange().getValues();
const header = values[0]; // 取出第一列(ROW)
// 使用第一列上的名稱作為物件的屬性名稱,如果屬性是falsy則不會加入輸出
// 若有相同的名稱,最後的數值會覆蓋掉前面的數值
values = values.slice(1).map(row =>
row.reduce((pre, val, idx) => {
const attr = header[idx];
if (attr) pre[attr] = val;
return pre;
}, {})
);
jsonText = JSON.stringify(fieldName ? { [fieldName]: values } : values);
}
catch (e) {
jsonText = JSON.stringify({
status: 500,
message: `error:${e.stack || e}`,
});
}
return ContentService.createTextOutput()
.setContent(jsonText)
.setMimeType(ContentService.MimeType.JSON);
}
留言