Bấm "Tải danh sách cầu thủ" để xem và chỉnh sửa.
Chưa có dữ liệu. Nhập cài đặt bên trên và bấm "Tải dữ liệu".
SECRET_TOKEN thành chuỗi bí mật bất kỳ (ví dụ: 'trollfc_abc123')const SECRET_TOKEN = 'THAY_DOI_TOKEN_NAY';
const SPREADSHEET_ID = '1Gh8fwrRfxtYCsaFcF_pexf9q3z-Wzn2g1CKpT-OsNSM';
const FORM_ID = '1hUYeeIK7vSDOjthLEwyEOc9puE8T2Th3a1tbfYASyEU';
function doGet(e) {
try {
var p = e.parameter;
if (p.token !== SECRET_TOKEN) return out({ ok: false, error: 'Unauthorized' });
var action = p.action || 'read';
var sheet = SpreadsheetApp.openById(SPREADSHEET_ID).getSheets()[0];
var form = FormApp.openById(FORM_ID);
if (action === 'read') {
var raw = sheet.getDataRange().getValues();
var data = raw.map(function(row) {
return row.map(function(cell) {
if (cell instanceof Date)
return Utilities.formatDate(cell, 'Asia/Ho_Chi_Minh', 'dd/MM/yyyy HH:mm:ss');
return cell;
});
});
return out({ ok: true, data: data });
}
if (action === 'clear') {
var last = sheet.getLastRow();
if (last > 1) sheet.deleteRows(2, last - 1);
return out({ ok: true });
}
if (action === 'delete_row') {
var r = parseInt(p.row);
if (r >= 2) sheet.deleteRow(r);
return out({ ok: true });
}
if (action === 'update_cell') {
var r = parseInt(p.row), c = parseInt(p.col), v = p.value;
sheet.getRange(r, c).setValue(v !== '' && !isNaN(+v) ? +v : v);
return out({ ok: true });
}
if (action === 'add_row') {
var vals = JSON.parse(p.values);
vals.unshift(new Date());
sheet.appendRow(vals);
return out({ ok: true });
}
if (action === 'get_form') {
var items = form.getItems();
var result = [];
for (var i = 0; i < items.length; i++) {
result.push({ index: i, id: items[i].getId(), title: items[i].getTitle() });
}
return out({ ok: true, items: result });
}
if (action === 'update_question') {
var items = form.getItems();
var idx = parseInt(p.index);
if (idx >= 0 && idx < items.length) items[idx].setTitle(p.title);
return out({ ok: true });
}
if (action === 'ping') {
return out({ ok: true, version: 'v3' });
}
if (action === 'add_question') {
var newItem = form.addScaleItem();
newItem.setTitle(p.title);
newItem.setBounds(1, 10);
return out({ ok: true });
}
if (action === 'delete_questions') {
var indices = JSON.parse(p.indices).sort(function(a, b) { return b - a; });
for (var i = 0; i < indices.length; i++) {
var items = form.getItems();
var idx = indices[i];
if (idx >= 1 && idx < items.length) form.deleteItem(items[idx]);
}
return out({ ok: true });
}
return out({ ok: false, error: 'Unknown action: ' + action });
} catch(err) {
return out({ ok: false, error: err.toString() });
}
}
function out(obj) {
return ContentService
.createTextOutput(JSON.stringify(obj))
.setMimeType(ContentService.MimeType.JSON);
}
Timestamp sẽ được tự động ghi là thời điểm hiện tại.