| 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); |
| } |
|
|