πŸ“±
CLEAR SGHT
Opticians
Computerized Eye testing & Contact Lens Clinic
+91 630 366 29 29
+91 98490 346 55
Connected to Google Sheets
Stored locally in your browser. See setup at the bottom of the page.
Order No.
#
01 Customer
02 Prescription Rx β€” Right Eye / Left Eye
β„ž SPHCYLAXISADD
RE
LE
03 Frame Measurements in mm
04 Frame & Lens
05 Billing & Delivery
Note
β€’ Spectacles repairing and fitting at customer's risk   β€’ Delivery should be taken within one month from the date of the order   β€’ Goods once sold will not be exchanged and return   β€’ No brakage guarantee

Business Overview

Loading…
⏳
Loading dashboard data…

Customers & Orders

Loading…
⏳
Loading orders…
πŸ“‹ One-time setup guide
  1. Upload the pre-formatted sheet: Open Google Drive, drag the file ClearSight_Orders.xlsx into it. Right-click β†’ Open with β†’ Google Sheets β†’ File β†’ Save as Google Sheets.
  2. Open Apps Script: In the Sheet, click Extensions β†’ Apps Script.
  3. Paste this code (replace any default code, then πŸ’Ύ save):
    const SHEET_NAME = 'Orders';
    
    // Normalize phone to digits-only for consistent matching
    function normPhone(p) {
      if (!p) return '';
      return String(p).replace(/\D/g, '').replace(/^91(\d{10})$/, '$1');
    }
    
    function doPost(e) {
      const lock = LockService.getScriptLock();
      try {
        lock.waitLock(10000); // wait up to 10s for concurrent writes
      } catch (err) {
        return json({ ok: false, error: 'Server busy, please retry' });
      }
      try {
        const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);
        if (!sheet) throw new Error('Sheet "Orders" not found');
        const d = JSON.parse(e.postData.contents);
    
        if (d.action === 'update_status') {
          const data = sheet.getDataRange().getValues();
          for (let i = 1; i < data.length; i++) {
            if (String(data[i][1]) === String(d.orderNo)) {
              sheet.getRange(i + 1, 30).setValue(d.status);
              if (d.pickup_date) sheet.getRange(i + 1, 29).setValue(d.pickup_date);
              SpreadsheetApp.flush();
              return json({ ok: true, updated: true });
            }
          }
          return json({ ok: false, error: 'Order not found' });
        }
    
        // Check for duplicate Order No (atomic under lock)
        const lastRow = sheet.getLastRow();
        if (lastRow >= 2 && d.orderNo) {
          const existing = sheet.getRange(2, 2, lastRow - 1, 1).getValues();
          for (let i = 0; i < existing.length; i++) {
            if (String(existing[i][0]) === String(d.orderNo)) {
              return json({ ok: false, error: 'Duplicate order number: ' + d.orderNo });
            }
          }
        }
    
        sheet.appendRow([
          new Date(),
          d.orderNo, d.date, d.name, normPhone(d.phone),
          d.re_sph, d.re_cyl, d.re_axis, d.re_add,
          d.le_sph, d.le_cyl, d.le_axis, d.le_add,
          d.a_size, d.b_size, d.dbl,
          d.rpd, d.lpd, d.fh,
          d.pt_vd, d.wa, d.ed,
          d.frame, d.lens,
          Number(d.total_amount) || 0,
          Number(d.advance) || 0,
          Number(d.balance) || 0,
          d.delivery_date, d.pickup_date,
          d.status || 'Pending',
          d.signature, d.order_notes
        ]);
        SpreadsheetApp.flush();
        return json({ ok: true, orderNo: d.orderNo });
      } catch (err) {
        return json({ ok: false, error: String(err) });
      } finally {
        lock.releaseLock();
      }
    }
    
    function doGet(e) {
      try {
        const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);
        if (!sheet) throw new Error('Sheet "Orders" not found');
        const data = sheet.getDataRange().getValues();
        if (data.length < 2) return json({ ok: true, headers: data[0] || [], rows: [] });
        return json({ ok: true, headers: data[0], rows: data.slice(1).filter(r => r[1]) });
      } catch (err) {
        return json({ ok: false, error: String(err) });
      }
    }
    
    function json(obj) {
      return ContentService.createTextOutput(JSON.stringify(obj))
        .setMimeType(ContentService.MimeType.JSON);
    }
  4. Deploy: Click Deploy β†’ New deployment β†’ βš™ β†’ Web app.
    • Execute as: Me
    • Who has access: Anyone
    Click Deploy β†’ Authorize β†’ copy the Web app URL.
  5. Paste the URL into βš™ Configure at the top of this page. Done!

πŸ’‘ If you ever change the Apps Script, you must deploy a new version (Deploy β†’ Manage deployments β†’ ✏️ Edit β†’ Version: New version β†’ Deploy). The URL stays the same.