const SPREADSHEET_ID = "18vKc9qAKo8htCipBXxr2Uy3zgYS_k3qlUdlAWkKMeIA"; const SHEET_NAME = "الورقة1"; const EDITABLE_HEADERS = ["الاسم", "المسمى الوظفي", "المسمى الوظيفي", "البريد الإلكتروني", "رقم التواصل"]; function doGet(e) { return handleRequest_(e); } function doPost(e) { return handleRequest_(e); } function handleRequest_(e) { try { const payload = parsePayload_(e); const action = String(payload.action || e.parameter.action || "read").toLowerCase(); if (action === "read" || action === "getdata" || action === "list") { return json_({ ok: true, ...readSheet_() }); } if (action === "update" || action === "save") { return json_(updateRow_(payload)); } return json_({ ok: false, message: "إجراء غير معروف." }); } catch (error) { return json_({ ok: false, message: error.message || String(error) }); } } function parsePayload_(e) { if (!e) return {}; if (e.postData && e.postData.contents) { try { return JSON.parse(e.postData.contents); } catch (error) { if (e.parameter && e.parameter.payload) { return JSON.parse(e.parameter.payload); } } } if (e.parameter && e.parameter.payload) { return JSON.parse(e.parameter.payload); } return e.parameter || {}; } function getSheet_() { const spreadsheet = SpreadsheetApp.openById(SPREADSHEET_ID); const sheet = spreadsheet.getSheetByName(SHEET_NAME) || spreadsheet.getSheets()[0]; if (!sheet) throw new Error("لم يتم العثور على ورقة بيانات داخل Google Sheet."); return sheet; } function readSheet_() { const sheet = getSheet_(); const lastRow = sheet.getLastRow(); const lastColumn = sheet.getLastColumn(); if (lastRow < 1 || lastColumn < 1) { return { sheetName: sheet.getName(), headers: [], rows: [] }; } const values = sheet.getRange(1, 1, lastRow, lastColumn).getDisplayValues(); const headers = values[0].map((header) => String(header || "").trim()); const rows = values.slice(1) .map((row, index) => { const item = { rowNumber: index + 2 }; headers.forEach((header, columnIndex) => { if (header) item[header] = row[columnIndex] || ""; }); return item; }) .filter((row) => headers.some((header) => header && String(row[header] || "").trim())); return { sheetName: sheet.getName(), headers, rows }; } function updateRow_(payload) { const sheet = getSheet_(); const data = readSheet_(); const headers = data.headers; const headerIndex = {}; headers.forEach((header, index) => { headerIndex[header] = index + 1; }); const rowNumber = Number(payload.rowNumber || payload.rowIndex); if (!rowNumber || rowNumber < 2 || rowNumber > sheet.getLastRow()) { throw new Error("رقم الصف غير صحيح، ولن يتم إنشاء صف جديد."); } const updates = typeof payload.updates === "string" ? JSON.parse(payload.updates) : (payload.updates || {}); const allowedColumns = Object.keys(updates).filter((header) => { return EDITABLE_HEADERS.indexOf(header) !== -1 && headerIndex[header]; }); if (!allowedColumns.length) { throw new Error("لا توجد أعمدة مسموح بتحديثها في الطلب."); } allowedColumns.forEach((header) => { sheet.getRange(rowNumber, headerIndex[header]).setValue(updates[header] || ""); }); return { ok: true, success: true, rowNumber, updatedHeaders: allowedColumns, message: "تم تحديث الصف نفسه بنجاح.", }; } function json_(payload) { return ContentService .createTextOutput(JSON.stringify(payload)) .setMimeType(ContentService.MimeType.JSON); }