👉āļŠāļĢ้āļēāļ‡āđāļ›้āļ™āļāļ” PIN āđāļšāļšāļ•ัāļ§āđ€āļĨāļ‚ 3D

👉āļŠāļĢ้āļēāļ‡āđāļ›้āļ™āļāļ” PIN āđāļšāļšāļ•ัāļ§āđ€āļĨāļ‚ 3D āļžāļĢ้āļ­āļĄāļ—āļģāđ€āļ›็āļ™ Google Apps Script Library āđƒāļŠ้āļ‹้āļģāđ„āļ”้āļ—ุāļāđ‚āļ›āļĢāđ€āļˆāļāļ•์




āļĢāļ°āļšāļš Web App āļ—ี่āļĄีāļŦāļ™้āļē Admin āļĄัāļāļ•้āļ­āļ‡āļĄีāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļŠิāļ—āļ˜ิ์āļ่āļ­āļ™āđ€āļ‚้āļēāđƒāļŠ้āļ‡āļēāļ™ āđāļ•่āļāļēāļĢāđƒāļŦ้āļœู้āđƒāļŠ้āļžิāļĄāļž์āļĢāļŦัāļŠāļœ่āļēāļ™āđƒāļ™āļŠ่āļ­āļ‡āļ‚้āļ­āļ„āļ§āļēāļĄāđāļšāļšāđ€āļ”ิāļĄāļ­āļēāļˆāđ„āļĄ่āļŠāļ°āļ”āļ§āļ āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āđ€āļĄื่āļ­āđ€āļ›ิāļ”āđƒāļŠ้āļ‡āļēāļ™āļœ่āļēāļ™āđ‚āļ—āļĢāļĻัāļžāļ—์āļĄืāļ­āļ–ืāļ­āļŦāļĢืāļ­āđāļ—็āļšāđ€āļĨ็āļ•

āļšāļ—āļ„āļ§āļēāļĄāļ™ี้āļˆāļ°āđāļ™āļ°āļ™āļģāļāļēāļĢāļŠāļĢ้āļēāļ‡ “āđāļ›้āļ™āļāļ” PIN āđāļšāļšāļ•ัāļ§āđ€āļĨāļ‚” āļ—ี่āļĄีāļ›ุ่āļĄāļ•ัāļ§āđ€āļĨāļ‚āļŠāđ„āļ•āļĨ์ 3D āđ€āļĄื่āļ­āļāļ”āđāļĨ้āļ§āđ€āļิāļ”āđāļŠāļ‡āļŠีāđ€āļ‚ีāļĒāļ§ āļžāļĢ้āļ­āļĄāđāļĒāļāļŠ่āļ§āļ™āļ•āļĢāļ§āļˆāļŠāļ­āļš PIN āđ€āļ›็āļ™ Google Apps Script Library āđ€āļžื่āļ­āđƒāļŦ้āļŠāļēāļĄāļēāļĢāļ–āļ™āļģāđ„āļ›āđƒāļŠ้āļ‹้āļģāļัāļšāļŦāļĨāļēāļĒāļĢāļ°āļšāļšāđ„āļ”้ āđ€āļŠ่āļ™

  • āļĢāļ°āļšāļšāđāļˆ้āļ‡āļāļēāļĢāļĨāļēāļ­āļ­āļ™āđ„āļĨāļ™์
  • āļĢāļ°āļšāļšāļšัāļ™āļ—ึāļāļ„āļ°āđāļ™āļ™
  • āļĢāļ°āļšāļšāļˆัāļ”āļāļēāļĢāđ€āļ­āļāļŠāļēāļĢ
  • āļĢāļ°āļšāļšāļĢāļēāļĒāļ‡āļēāļ™āļิāļˆāļāļĢāļĢāļĄ
  • āļĢāļ°āļšāļšāļˆāļ­āļ‡āļ­āļ­āļ™āđ„āļĨāļ™์
  • āļĢāļ°āļšāļšāļšāļĢิāļŦāļēāļĢāļˆัāļ”āļāļēāļĢāļ‚้āļ­āļĄูāļĨāđƒāļ™ Google Drive
  • āļĢāļ°āļšāļšāļŦāļĨัāļ‡āļš้āļēāļ™āļŠāļģāļŦāļĢัāļšāļœู้āļ”ูāđāļĨ

āļˆุāļ”āđ€āļ”่āļ™āļ‚āļ­āļ‡āļĢāļ°āļšāļšāđāļ›้āļ™āļāļ” PIN

  • āļāļ” PIN āļœ่āļēāļ™āļ›ุ่āļĄāļ•ัāļ§āđ€āļĨāļ‚ 0–9
  • āļĢāļ­āļ‡āļĢัāļš PIN āļ•ั้āļ‡āđāļ•่ 4–12 āļŦāļĨัāļ
  • āļĄีāļ›ุ่āļĄāļĨāļšāļ•ัāļ§āđ€āļĨāļ‚āļ—ีāļĨāļ°āļŦāļĨัāļ
  • āļĄีāļ›ุ่āļĄāļĨ้āļēāļ‡ PIN āļ—ั้āļ‡āļŦāļĄāļ”
  • āđāļŠāļ”āļ‡āļˆāļģāļ™āļ§āļ™ PIN āļ”้āļ§āļĒāļˆุāļ”āļ§āļ‡āļāļĨāļĄ
  • āđ„āļĄ่āđāļŠāļ”āļ‡āļ•ัāļ§āđ€āļĨāļ‚ PIN āļšāļ™āļŦāļ™้āļēāļˆāļ­
  • āļ›ุ่āļĄāļĄีāļĄิāļ•ิāđāļšāļš 3D
  • āđ€āļĄื่āļ­āļāļ”āļ›ุ่āļĄāļˆāļ°āđāļŠāļ”āļ‡āđāļŠāļ‡āļŠีāđ€āļ‚ีāļĒāļ§
  • āļĢāļ­āļ‡āļĢัāļšāļŦāļ™้āļēāļˆāļ­āļĄืāļ­āļ–ืāļ­āđāļĨāļ°āļ„āļ­āļĄāļžิāļ§āđ€āļ•āļ­āļĢ์
  • āļāļ”āļ•ัāļ§āđ€āļĨāļ‚āļˆāļēāļāđāļ›้āļ™āļžิāļĄāļž์āļ„āļ­āļĄāļžิāļ§āđ€āļ•āļ­āļĢ์āđ„āļ”้
  • āļ•āļĢāļ§āļˆāļŠāļ­āļš PIN āļ—ี่āļั่āļ‡ Code.gs
  • āđ„āļĄ่āđ€āļ›ิāļ”āđ€āļœāļĒ PIN āđƒāļ™ JavaScript āļั่āļ‡āļœู้āđƒāļŠ้
  • āļŠāļēāļĄāļēāļĢāļ–āļŠāļĢ้āļēāļ‡āđ€āļ›็āļ™ Library āđāļĨ้āļ§āļ™āļģāđ„āļ›āđƒāļŠ้āļ‹้āļģāđ„āļ”้


āđ‚āļ„āļĢāļ‡āļŠāļĢ้āļēāļ‡āļāļēāļĢāļ—āļģāļ‡āļēāļ™

āļĢāļ°āļšāļšāđāļš่āļ‡āļ­āļ­āļāđ€āļ›็āļ™ 2 āļŠ่āļ§āļ™āļŦāļĨัāļ

1. āđ‚āļ›āļĢāđ€āļˆāļāļ•์ Library    āļ—āļģāļŦāļ™้āļēāļ—ี่āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ§่āļē PIN āļ—ี่āļœู้āđƒāļŠ้āļāļ”āļ•āļĢāļ‡āļัāļš PIN āļ—ี่āļāļģāļŦāļ™āļ”āđ„āļ§้āļŦāļĢืāļ­āđ„āļĄ่

2. āđ‚āļ›āļĢāđ€āļˆāļāļ•์ Web App āļŦāļĨัā   āļ›āļĢāļ°āļāļ­āļšāļ”้āļ§āļĒāđ„āļŸāļĨ์:

  • Code.gs
  • index.html
  • javascript.html
  • style.html

āļĨāļģāļ”ัāļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ„ืāļ­:

āļœู้āđƒāļŠ้āļāļ”āļ•ัāļ§āđ€āļĨāļ‚āļšāļ™āđāļ›้āļ™ PIN
          ↓
javascript.html āļĢัāļšāļ„่āļēāļ•ัāļ§āđ€āļĨāļ‚
          ↓
āļŠ่āļ‡ PIN āđ„āļ›āļĒัāļ‡ checkAdminPin() āđƒāļ™ Code.gs
          ↓
Code.gs āđ€āļĢีāļĒāļ PinPadLib.verifyPin()
          ↓
āđ„āļĨāļšāļĢāļēāļĢีāļ•āļĢāļ§āļˆāļŠāļ­āļšāļ„āļ§āļēāļĄāļ–ูāļāļ•้āļ­āļ‡
          ↓
āđ€āļ‚้āļēāļŠู่āļŦāļ™้āļē Admin āļŦāļĢืāļ­āđāļˆ้āļ‡āļ§่āļēāļĢāļŦัāļŠāđ„āļĄ่āļ–ูāļāļ•้āļ­āļ‡

āļ‚ั้āļ™āļ•āļ­āļ™āļ—ี่ 1 āļŠāļĢ้āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāļāļ•์ Google Apps Script Library

  1. āđ€āļ›ิāļ”āđ€āļ§็āļšāđ„āļ‹āļ•์ Google Apps Script
  2. āļāļ”āļ›ุ่āļĄ āđ‚āļ›āļĢāđ€āļˆāļāļ•์āđƒāļŦāļĄ่
  3. āļ•ั้āļ‡āļŠื่āļ­āđ‚āļ›āļĢāđ€āļˆāļāļ•์āļ§่āļē NumericPinLibrary
  4. āđ€āļ›ิāļ”āđ„āļŸāļĨ์ Code.gs
  5. āļĨāļšāđ‚āļ„้āļ”āđ€āļ”ิāļĄāļ­āļ­āļ
  6. āļ™āļģāđ‚āļ„้āļ”āļ•่āļ­āđ„āļ›āļ™ี้āđ„āļ›āļ§āļēāļ‡

/**
 * Numeric PIN Library
 * āđ„āļĨāļšāļĢāļēāļĢีāļŠāļģāļŦāļĢัāļšāļ•āļĢāļ§āļˆāļŠāļ­āļšāļĢāļŦัāļŠ PIN āđāļšāļšāļ•ัāļ§āđ€āļĨāļ‚
 * Version 1.0.0
 */

/**
 * āļ•āļĢāļ§āļˆāļŠāļ­āļšāļĢāļŦัāļŠ PIN
 *
 * @param {string} enteredPin PIN āļ—ี่āļœู้āđƒāļŠ้āļāļ”
 * @param {string} correctPin PIN āļ—ี่āļ–ูāļāļ•้āļ­āļ‡
 * @param {number} pinLength āļˆāļģāļ™āļ§āļ™āļŦāļĨัāļāļ‚āļ­āļ‡ PIN
 * @return {Object} āļœāļĨāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļš
 */
function verifyPin(enteredPin, correctPin, pinLength) {
  try {
    const requestedLength = Math.trunc(Number(pinLength) || 6);
    const length = Math.min(12, Math.max(4, requestedLength));

    const entered = String(
      enteredPin === null || enteredPin === undefined
        ? ''
        : enteredPin
    ).trim();

    const correct = String(
      correctPin === null || correctPin === undefined
        ? ''
        : correctPin
    ).trim();

    const pinPattern = new RegExp(
      '^\\d{' + length + '}$'
    );

    if (!pinPattern.test(entered)) {
      return {
        success: false,
        message: 'āļāļĢุāļ“āļēāļāļ”āļĢāļŦัāļŠ PIN āđƒāļŦ้āļ„āļĢāļš ' + length + ' āļŦāļĨัāļ'
      };
    }

    if (!pinPattern.test(correct)) {
      return {
        success: false,
        message: 'āļĒัāļ‡āđ„āļĄ่āđ„āļ”้āļ•ั้āļ‡āļ„่āļēāļĢāļŦัāļŠ PIN āļ‚āļ­āļ‡āļĢāļ°āļšāļš'
      };
    }

    const matched = constantTimeCompare_(entered, correct);

    if (!matched) {
      return {
        success: false,
        message: 'āļĢāļŦัāļŠ PIN āđ„āļĄ่āļ–ูāļāļ•้āļ­āļ‡ āļāļĢุāļ“āļēāļĨāļ­āļ‡āđƒāļŦāļĄ่'
      };
    }

    return {
      success: true,
      message: 'āđ€āļ‚้āļēāļŠู่āļĢāļ°āļšāļšāļŠāļģāđ€āļĢ็āļˆ',
      role: 'admin',
      version: getLibraryVersion()
    };

  } catch (error) {
    console.error('verifyPin error:', error);

    return {
      success: false,
      message: 'āđ€āļิāļ”āļ‚้āļ­āļœิāļ”āļžāļĨāļēāļ”āđƒāļ™āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļš PIN'
    };
  }
}

/**
 * āđ€āļ›āļĢีāļĒāļšāđ€āļ—ีāļĒāļšāļ‚้āļ­āļ„āļ§āļēāļĄāđ‚āļ”āļĒāļĨāļ”āļ„āļ§āļēāļĄāđāļ•āļāļ•่āļēāļ‡āļ‚āļ­āļ‡āđ€āļ§āļĨāļēāđƒāļ™āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨ
 *
 * āļŸัāļ‡āļ์āļŠัāļ™āļ—ี่āļĨāļ‡āļ—้āļēāļĒāļ”้āļ§āļĒāđ€āļ„āļĢื่āļ­āļ‡āļŦāļĄāļēāļĒ _
 * āļˆāļ°āđ„āļĄ่āđ€āļ›ิāļ”āđƒāļŦ้āđ‚āļ›āļĢāđ€āļˆāļāļ•์āļ—ี่āļ•ิāļ”āļ•ั้āļ‡ Library āđ€āļĢีāļĒāļāđƒāļŠ้āļ‡āļēāļ™āđ‚āļ”āļĒāļ•āļĢāļ‡
 *
 * @param {string} valueA
 * @param {string} valueB
 * @return {boolean}
 */
function constantTimeCompare_(valueA, valueB) {
  const a = String(valueA);
  const b = String(valueB);

  const maximumLength = Math.max(a.length, b.length);
  let difference = a.length ^ b.length;

  for (let index = 0; index < maximumLength; index++) {
    const codeA = index < a.length
      ? a.charCodeAt(index)
      : 0;

    const codeB = index < b.length
      ? b.charCodeAt(index)
      : 0;

    difference |= codeA ^ codeB;
  }

  return difference === 0;
}

/**
 * āļ„ืāļ™āļ„่āļēāđ€āļ§āļ­āļĢ์āļŠัāļ™āļ‚āļ­āļ‡āđ„āļĨāļšāļĢāļēāļĢี
 *
 * @return {string}
 */
function getLibraryVersion() {
  return '1.0.0';
}

āļŸัāļ‡āļ์āļŠัāļ™āļ—ี่āđ‚āļ›āļĢāđ€āļˆāļāļ•์āļ­ื่āļ™āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢีāļĒāļāđƒāļŠ้āđ„āļ”้āļ„ืāļ­:

verifyPin()

āđāļĨāļ°

getLibraryVersion()

āļŠ่āļ§āļ™āļŸัāļ‡āļ์āļŠัāļ™āļ—ี่āļĨāļ‡āļ—้āļēāļĒāļ”้āļ§āļĒ _ āđ€āļŠ่āļ™

constantTimeCompare_()

āļˆāļ°āļ–ูāļāđƒāļŠ้āđ€āļ›็āļ™āļŸัāļ‡āļ์āļŠัāļ™āļ āļēāļĒāđƒāļ™ Library āđ€āļ—่āļēāļ™ั้āļ™


āļ‚ั้āļ™āļ•āļ­āļ™āļ—ี่ 2 āļŠāļĢ้āļēāļ‡āđ€āļ§āļ­āļĢ์āļŠัāļ™āļ‚āļ­āļ‡ Library

āļŦāļĨัāļ‡āļˆāļēāļāđƒāļŠ่āđ‚āļ„้āļ”āđ€āļĢีāļĒāļšāļĢ้āļ­āļĒāđāļĨ้āļ§ āđƒāļŦ้āļ”āļģāđ€āļ™ิāļ™āļāļēāļĢāļ”ัāļ‡āļ™ี้

  1. āļāļ” āļšัāļ™āļ—ึāļāđ‚āļ„āļĢāļ‡āļāļēāļĢ
  2. āļāļ”āđ€āļĄāļ™ู āļ—āļģāđƒāļŦ้āđƒāļŠ้āļ‡āļēāļ™āđ„āļ”้
  3. āđ€āļĨืāļ­āļ āļāļēāļĢāļ—āļģāđƒāļŦ้āđƒāļŠ้āļ‡āļēāļ™āđ„āļ”้āļĢāļēāļĒāļāļēāļĢāđƒāļŦāļĄ่
  4. āļāļ”āđ„āļ­āļ„āļ­āļ™āļĢูāļ›āđ€āļŸืāļ­āļ‡
  5. āđ€āļĨืāļ­āļāļ›āļĢāļ°āđ€āļ āļ— āđ„āļĨāļšāļĢāļēāļĢี
  6. āđƒāļŠ่āļ„āļģāļ­āļ˜ิāļšāļēāļĒ āđ€āļŠ่āļ™ Numeric PIN Library Version 1.0.0
  7. āļāļ” āļ—āļģāđƒāļŦ้āđƒāļŠ้āļ‡āļēāļ™āđ„āļ”้
  8. āļĢāļ°āļšāļšāļˆāļ°āļŠāļĢ้āļēāļ‡āđ€āļ§āļ­āļĢ์āļŠัāļ™āđāļĢāļ āđ€āļŠ่āļ™ āđ€āļ§āļ­āļĢ์āļŠัāļ™ 1

āđ€āļĄื่āļ­āđāļ้āđ„āļ‚āđ‚āļ„้āļ”āđƒāļ™ Library āļ āļēāļĒāļŦāļĨัāļ‡ āļ•้āļ­āļ‡āļŠāļĢ้āļēāļ‡āđ€āļ§āļ­āļĢ์āļŠัāļ™āđƒāļŦāļĄ่ āđ€āļŠ่āļ™ āđ€āļ§āļ­āļĢ์āļŠัāļ™ 2, 3 āļŦāļĢืāļ­ 4 āđāļĨ้āļ§āļˆึāļ‡āļāļĨัāļšāđ„āļ›āđ€āļ›āļĨี่āļĒāļ™āđ€āļ§āļ­āļĢ์āļŠัāļ™āđƒāļ™āđ‚āļ›āļĢāđ€āļˆāļāļ•์āļ—ี่āļ™āļģ Library āđ„āļ›āđƒāļŠ้


āļ‚ั้āļ™āļ•āļ­āļ™āļ—ี่ 3 āļ„ัāļ”āļĨāļ­āļ Script ID

  1. āđ€āļ›ิāļ”āļŦāļ™้āļē āļāļēāļĢāļ•ั้āļ‡āļ„่āļēāđ‚āļ›āļĢāđ€āļˆāļāļ•์
  2. āđ€āļĨื่āļ­āļ™āđ„āļ›āļ—ี่āļŦัāļ§āļ‚้āļ­ āļĢāļŦัāļŠ
  3. āļ„ัāļ”āļĨāļ­āļāļ„่āļē āļĢāļŦัāļŠāļŠāļ„āļĢิāļ›āļ•์ āļŦāļĢืāļ­ Script ID

āļ•ัāļ§āļ­āļĒ่āļēāļ‡āļĢูāļ›āđāļšāļš Script ID:

1AbCdEfGhIjKlMnOpQrStUvWxYz1234567890

Script ID āđ€āļ›āļĢีāļĒāļšāđ€āļŠāļĄืāļ­āļ™āļĢāļŦัāļŠāļ›āļĢāļ°āļˆāļģāļ•ัāļ§āļ‚āļ­āļ‡ Library āļ‹ึ่āļ‡āļˆāļ°āđƒāļŠ้āļŠāļģāļŦāļĢัāļšāļ•ิāļ”āļ•ั้āļ‡ Library āđƒāļ™āđ‚āļ›āļĢāđ€āļˆāļāļ•์āļ­ื่āļ™

āļŦāļēāļāļ•้āļ­āļ‡āļāļēāļĢāđƒāļŦ้āļšัāļāļŠี Google āļ­ื่āļ™āđƒāļŠ้ Library āļ•้āļ­āļ‡āđāļŠāļĢ์āđ‚āļ›āļĢāđ€āļˆāļāļ•์ Library āđƒāļŦ้āļšัāļāļŠีāļ™ั้āļ™āļĄีāļŠิāļ—āļ˜ิ์āđ€āļ‚้āļēāļ–ึāļ‡āļ”้āļ§āļĒ


āļ‚ั้āļ™āļ•āļ­āļ™āļ—ี่ 4 āļ•ิāļ”āļ•ั้āļ‡ Library āđƒāļ™āđ‚āļ›āļĢāđ€āļˆāļāļ•์ Web App

āđ€āļ›ิāļ”āđ‚āļ›āļĢāđ€āļˆāļāļ•์ Google Apps Script āļ—ี่āļ•้āļ­āļ‡āļāļēāļĢāļ™āļģāđāļ›้āļ™ PIN āđ„āļ›āđƒāļŠ้ āļˆāļēāļāļ™ั้āļ™āļ”āļģāđ€āļ™ิāļ™āļāļēāļĢāļ”ัāļ‡āļ™ี้

  1. āļ”ูāđ€āļĄāļ™ูāļ”้āļēāļ™āļ‹้āļēāļĒ
  2. āđ„āļ›āļ—ี่āļŦัāļ§āļ‚้āļ­ āđ„āļĨāļšāļĢāļēāļĢี
  3. āļāļ”āđ€āļ„āļĢื่āļ­āļ‡āļŦāļĄāļēāļĒ +
  4. āļ§āļēāļ‡ Script ID āļ—ี่āļ„ัāļ”āļĨāļ­āļāļĄāļē
  5. āļāļ” āļ„้āļ™āļŦāļē
  6. āđ€āļĨืāļ­āļāđ€āļ§āļ­āļĢ์āļŠัāļ™āļ—ี่āļ•้āļ­āļ‡āļāļēāļĢ āđ€āļŠ่āļ™ āđ€āļ§āļ­āļĢ์āļŠัāļ™ 1
  7. āļāļģāļŦāļ™āļ”āļ•ัāļ§āļĢāļ°āļšุ Library āđ€āļ›็āļ™ PinPadLib
  8. āļāļ” āđ€āļžิ่āļĄ

āđ€āļĄื่āļ­āļ•ิāļ”āļ•ั้āļ‡āđ€āļĢีāļĒāļšāļĢ้āļ­āļĒāđāļĨ้āļ§ āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢีāļĒāļāđƒāļŠ้āļŸัāļ‡āļ์āļŠัāļ™āđƒāļ™ Library āđ„āļ”้āļ”้āļ§āļĒāļ„āļģāļŠั่āļ‡:

PinPadLib.verifyPin()

āļ•ัāļ§āļĢāļ°āļšุ PinPadLib āļ•้āļ­āļ‡āļ•āļĢāļ‡āļัāļšāļŠื่āļ­āļ—ี่āļāļģāļŦāļ™āļ”āđƒāļ™āļŦāļ™้āļēāļ•ิāļ”āļ•ั้āļ‡ Library āļŦāļēāļāļāļģāļŦāļ™āļ”āđ€āļ›็āļ™āļŠื่āļ­āļ­ื่āļ™ āļ•้āļ­āļ‡āđ€āļ›āļĨี่āļĒāļ™āļŠื่āļ­āđƒāļ™āđ‚āļ„้āļ”āđƒāļŦ้āļ•āļĢāļ‡āļัāļ™āļ”้āļ§āļĒ


āļ‚ั้āļ™āļ•āļ­āļ™āļ—ี่ 5 āļāļģāļŦāļ™āļ” PIN āđƒāļ™ Script Properties

āđ„āļĄ่āļ„āļ§āļĢāđ€āļ‚ีāļĒāļ™ PIN āđ„āļ§้āđƒāļ™ javascript.html āđ€āļžāļĢāļēāļ°āļœู้āđƒāļŠ้āļŠāļēāļĄāļēāļĢāļ–āđ€āļ›ิāļ”āđ€āļ„āļĢื่āļ­āļ‡āļĄืāļ­āļ™ัāļāļžัāļ’āļ™āļēāđāļĨāļ°āļ•āļĢāļ§āļˆāļŠāļ­āļšāđ‚āļ„้āļ”āļั่āļ‡āļŦāļ™้āļēāđ€āļ§็āļšāđ„āļ”้

āđāļ™āļ°āļ™āļģāđƒāļŦ้āđ€āļ็āļš PIN āđ„āļ§้āđƒāļ™ Script Properties āļ‚āļ­āļ‡āđāļ•่āļĨāļ°āđ‚āļ›āļĢāđ€āļˆāļāļ•์

āļ§ิāļ˜ีāļ•ั้āļ‡āļ„่āļē:

  1. āđ€āļ›ิāļ” āļāļēāļĢāļ•ั้āļ‡āļ„่āļēāđ‚āļ›āļĢāđ€āļˆāļāļ•์
  2. āđ„āļ›āļ—ี่āļŦัāļ§āļ‚้āļ­ āļžāļĢ็āļ­āļžāđ€āļžāļ­āļĢ์āļ•ี้āļ‚āļ­āļ‡āļŠāļ„āļĢิāļ›āļ•์
  3. āļāļ” āđ€āļžิ่āļĄāļžāļĢ็āļ­āļžāđ€āļžāļ­āļĢ์āļ•ี้āļ‚āļ­āļ‡āļŠāļ„āļĢิāļ›āļ•์
  4. āļāļģāļŦāļ™āļ”āļ„่āļēāļ”ัāļ‡āļ™ี้

āļžāļĢ็āļ­āļžāđ€āļžāļ­āļĢ์āļ•ี้: ADMIN_PIN
āļ„่āļē: 123456

āļŠāļēāļĄāļēāļĢāļ–āđ€āļ›āļĨี่āļĒāļ™ 123456 āđ€āļ›็āļ™ PIN āļ—ี่āļ•้āļ­āļ‡āļāļēāļĢāđ„āļ”้

āļŦāļēāļ PIN āđ€āļĢิ่āļĄāļ•้āļ™āļ”้āļ§āļĒāđ€āļĨāļ‚āļĻูāļ™āļĒ์ āđ€āļŠ่āļ™ 012345 āđƒāļŦ้āļšัāļ™āļ—ึāļāđ€āļ›็āļ™āļ‚้āļ­āļ„āļ§āļēāļĄāļ„āļĢāļšāļ—ุāļāļŦāļĨัāļ āļŦ้āļēāļĄāđāļ›āļĨāļ‡āđ€āļ›็āļ™āļ•ัāļ§āđ€āļĨāļ‚ āđ€āļžāļĢāļēāļ°āđ€āļĨāļ‚āļĻูāļ™āļĒ์āļ•ัāļ§āđāļĢāļāļ­āļēāļˆāļŦāļēāļĒāđ„āļ”้

āđāļ•่āļĨāļ°āļĢāļ°āļšāļšāļŠāļēāļĄāļēāļĢāļ–āļāļģāļŦāļ™āļ” PIN āļ‚āļ­āļ‡āļ•ัāļ§āđ€āļ­āļ‡āđ„āļ”้ āđāļĄ้āļ§่āļēāļˆāļ°āđƒāļŠ้ Library āļ•ัāļ§āđ€āļ”ีāļĒāļ§āļัāļ™āļ็āļ•āļēāļĄ


āļ‚ั้āļ™āļ•āļ­āļ™āļ—ี่ 6 āđ€āļžิ่āļĄāļŸัāļ‡āļ์āļŠัāļ™āđƒāļ™ Code.gs

āđ€āļ›ิāļ”āđ„āļŸāļĨ์ Code.gs āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļˆāļāļ•์āļŦāļĨัāļ āđāļĨ้āļ§āđ€āļžิ่āļĄāļŸัāļ‡āļ์āļŠัāļ™āļ•่āļ­āđ„āļ›āļ™ี้

/**
 * āļĢัāļš PIN āļˆāļēāļāļŦāļ™้āļēāđ€āļ§็āļšāđāļĨāļ°āļŠ่āļ‡āđƒāļŦ้ Library āļ•āļĢāļ§āļˆāļŠāļ­āļš
 *
 * @param {string} pin PIN āļ—ี่āļœู้āđƒāļŠ้āļāļ”
 * @return {Object} āļœāļĨāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļš
 */
function checkAdminPin(pin) {
  try {
    const properties =
      PropertiesService.getScriptProperties();

    const correctPin =
      properties.getProperty('ADMIN_PIN');

    if (!correctPin) {
      return {
        success: false,
        message: 'āļĒัāļ‡āđ„āļĄ่āđ„āļ”้āļāļģāļŦāļ™āļ” ADMIN_PIN āđƒāļ™āļāļēāļĢāļ•ั้āļ‡āļ„่āļēāđ‚āļ›āļĢāđ€āļˆāļāļ•์'
      };
    }

    return PinPadLib.verifyPin(
      pin,
      correctPin,
      6
    );

  } catch (error) {
    console.error('checkAdminPin error:', error);

    return {
      success: false,
      message: 'āđ„āļĄ่āļŠāļēāļĄāļēāļĢāļ–āđ€āļĢีāļĒāļāđƒāļŠ้āđ„āļĨāļšāļĢāļēāļĢีāļ•āļĢāļ§āļˆāļŠāļ­āļš PIN āđ„āļ”้'
    };
  }
}

āļ•ัāļ§āđ€āļĨāļ‚ 6 āđƒāļ™āļ„āļģāļŠั่āļ‡āļ•่āļ­āđ„āļ›āļ™ี้ āļ„ืāļ­āļˆāļģāļ™āļ§āļ™āļŦāļĨัāļāļ‚āļ­āļ‡ PIN

return PinPadLib.verifyPin(
  pin,
  correctPin,
  6
);

āļŦāļēāļāļ•้āļ­āļ‡āļāļēāļĢāđƒāļŠ้ PIN 4 āļŦāļĨัāļ āđƒāļŦ้āđ€āļ›āļĨี่āļĒāļ™āđ€āļ›็āļ™:

return PinPadLib.verifyPin(
  pin,
  correctPin,
  4
);

āļŦāļēāļāļ•้āļ­āļ‡āļāļēāļĢāđƒāļŠ้ PIN 8 āļŦāļĨัāļ āđƒāļŦ้āđ€āļ›āļĨี่āļĒāļ™āđ€āļ›็āļ™:

return PinPadLib.verifyPin(
  pin,
  correctPin,
  8
);

āļˆāļģāļ™āļ§āļ™āļŦāļĨัāļāđƒāļ™āļŦāļ™้āļēāđāļ›้āļ™ PIN āđāļĨāļ°āļˆāļģāļ™āļ§āļ™āļŦāļĨัāļāļ—ี่āļŠ่āļ‡āđƒāļŦ้ Library āļ•้āļ­āļ‡āļ•āļĢāļ‡āļัāļ™


āļ‚ั้āļ™āļ•āļ­āļ™āļ—ี่ 7 āđ€āļĢีāļĒāļāļ•āļĢāļ§āļˆāļŠāļ­āļšāļˆāļēāļ javascript.html

āđƒāļ™āđ„āļŸāļĨ์ javascript.html āđƒāļŦ้āļŠ่āļ‡ PIN āđ„āļ›āļĒัāļ‡āļŸัāļ‡āļ์āļŠัāļ™ checkAdminPin() āļ”้āļ§āļĒ google.script.run

<script>
  function submitPin() {
    if (enteredPin.length !== 6) {
      showPinError('āļāļĢุāļ“āļēāļāļ”āļĢāļŦัāļŠ PIN āđƒāļŦ้āļ„āļĢāļš 6 āļŦāļĨัāļ');
      return;
    }

    google.script.run
      .withSuccessHandler(function(result) {
        if (result && result.success === true) {
          closePinPadForce();

          Swal.fire({
            icon: 'success',
            title: 'āđ€āļ‚้āļēāļŠู่āļĢāļ°āļšāļšāļŠāļģāđ€āļĢ็āļˆ',
            text: result.message || 'āļĒิāļ™āļ”ีāļ•้āļ­āļ™āļĢัāļšāļœู้āļ”ูāđāļĨāļĢāļ°āļšāļš',
            timer: 1200,
            showConfirmButton: false
          }).then(function() {
            openAdminPage(result);
          });

        } else {
          clearPin();

          showPinError(
            result && result.message
              ? result.message
              : 'āļĢāļŦัāļŠ PIN āđ„āļĄ่āļ–ูāļāļ•้āļ­āļ‡'
          );
        }
      })
      .withFailureHandler(function(error) {
        clearPin();

        showPinError(
          error && error.message
            ? error.message
            : 'āđ„āļĄ่āļŠāļēāļĄāļēāļĢāļ–āđ€āļŠื่āļ­āļĄāļ•่āļ­āļĢāļ°āļšāļšāđ„āļ”้'
        );
      })
      .checkAdminPin(enteredPin);
  }
</script>

āđ„āļŸāļĨ์ javascript.html āļŠāļģāļŦāļĢัāļš Google Apps Script āļ•้āļ­āļ‡āļĄีāđāļ—็āļ:

<script>

āļ„āļĢāļ­āļšāđ‚āļ„้āļ” JavaScript āđāļĨāļ°āļ›ิāļ”āļ—้āļēāļĒāļ”้āļ§āļĒ:

</script>

āđ€āļžื่āļ­āđƒāļŦ้āļŠāļēāļĄāļēāļĢāļ–āļ™āļģāđ„āļ›āđ€āļĢีāļĒāļāļœ่āļēāļ™āļ„āļģāļŠั่āļ‡ include('javascript') āđ„āļ”้āļ­āļĒ่āļēāļ‡āļ–ูāļāļ•้āļ­āļ‡


āļ‚ั้āļ™āļ•āļ­āļ™āļ—ี่ 8 āđ€āļ›ิāļ”āļŦāļ™้āļē Admin āļŦāļĨัāļ‡āļ•āļĢāļ§āļˆāļŠāļ­āļšāļŠāļģāđ€āļĢ็āļˆ

āđ€āļĄื่āļ­ PIN āļ–ูāļāļ•้āļ­āļ‡ āļĢāļ°āļšāļšāļˆāļ°āđ€āļĢีāļĒāļāļŸัāļ‡āļ์āļŠัāļ™:

openAdminPage(result);

āļ•ัāļ§āļ­āļĒ่āļēāļ‡āļāļĢāļ“ีāļĢāļ°āļšāļšāđƒāļŠ้āļŸัāļ‡āļ์āļŠัāļ™ showPage() āļŠāļģāļŦāļĢัāļšāļŠāļĨัāļšāļŦāļ™้āļē:

<script>
  function openAdminPage(result) {
    showPage('admin');
  }
</script>

āļ•ัāļ§āļ­āļĒ่āļēāļ‡āļāļĢāļ“ีāļ•้āļ­āļ‡āļāļēāļĢāđāļŠāļ”āļ‡āļŠ่āļ§āļ™ Admin āđ‚āļ”āļĒāļ•āļĢāļ‡:

<script>
  function openAdminPage(result) {
    const adminPage = document.getElementById('adminPage');

    if (adminPage) {
      adminPage.style.display = 'block';
    }
  }
</script>

āļ•ัāļ§āļ­āļĒ่āļēāļ‡āđ‚āļ„āļĢāļ‡āļŠāļĢ้āļēāļ‡āļŦāļ™้āļē Admin:

<section id="adminPage" style="display: none;">
  <h2>āļŦāļ™้āļēāļœู้āļ”ูāđāļĨāļĢāļ°āļšāļš</h2>
  <p>āļĒิāļ™āļ”ีāļ•้āļ­āļ™āļĢัāļšāđ€āļ‚้āļēāļŠู่āļŦāļ™้āļēāļˆัāļ”āļāļēāļĢāļ‚้āļ­āļĄูāļĨ</p>
</section>

āļ‚ั้āļ™āļ•āļ­āļ™āļ—ี่ 9 āđ€āļĢีāļĒāļāđ€āļ›ิāļ”āđāļ›้āļ™ PIN

āļŠāļĢ้āļēāļ‡āļ›ุ่āļĄāđ€āļ‚้āļēāļŠู่āļĢāļ°āļšāļšāđƒāļ™ index.html

<button
  type="button"
  class="btn btn-success"
  onclick="openPinPad()">
  <i class="fa-solid fa-lock"></i>
  āđ€āļ‚้āļēāļŠู่āļĢāļ°āļšāļšāļœู้āļ”ูāđāļĨ
</button>

āđ€āļĄื่āļ­āļœู้āđƒāļŠ้āļāļ”āļ›ุ่āļĄ āļĢāļ°āļšāļšāļˆāļ°āđ€āļĢีāļĒāļ:

openPinPad();

āļˆāļēāļāļ™ั้āļ™āđāļ›้āļ™āļ•ัāļ§āđ€āļĨāļ‚āļˆāļ°āļ›āļĢāļēāļāļāļ‚ึ้āļ™ āļœู้āđƒāļŠ้āļŠāļēāļĄāļēāļĢāļ–āļāļ” PIN āđāļĨ้āļ§āđ€āļ‚้āļēāļŠู่āļŦāļ™้āļē Admin āđ„āļ”้


āļ§ิāļ˜ีāļ—āļ”āļŠāļ­āļšāļĢāļ°āļšāļš

āļŦāļĨัāļ‡āļˆāļēāļāļ•ิāļ”āļ•ั้āļ‡āļ—ุāļāļŠ่āļ§āļ™āđāļĨ้āļ§ āđƒāļŦ้āļ—āļ”āļŠāļ­āļšāļ•āļēāļĄāļĨāļģāļ”ัāļšāļ”ัāļ‡āļ™ี้

  1. āļšัāļ™āļ—ึāļāđ‚āļ›āļĢāđ€āļˆāļāļ•์āļ—ั้āļ‡āļŦāļĄāļ”
  2. āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ§่āļēāļ•ิāļ”āļ•ั้āļ‡ Library āđāļĨ้āļ§
  3. āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ•ัāļ§āļĢāļ°āļšุ Library āļ§่āļēāđ€āļ›็āļ™ PinPadLib
  4. āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ§่āļēāđ€āļĨืāļ­āļāđ€āļ§āļ­āļĢ์āļŠัāļ™āļ–ูāļāļ•้āļ­āļ‡
  5. āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ§่āļēāļĄี Script Property āļŠื่āļ­ ADMIN_PIN
  6. āļ•āļĢāļ§āļˆāļŠāļ­āļšāļˆāļģāļ™āļ§āļ™āļŦāļĨัāļāļ‚āļ­āļ‡ PIN
  7. āļ—āļģāđƒāļŦ้ Web App āđƒāļŠ้āļ‡āļēāļ™āđ„āļ”้āļ­ีāļāļ„āļĢั้āļ‡
  8. āđ€āļ›ิāļ”āļĨิāļ‡āļ์ Web App
  9. āļāļ”āļ›ุ่āļĄāđ€āļ‚้āļēāļŠู่āļĢāļ°āļšāļšāļœู้āļ”ูāđāļĨ
  10. āļ—āļ”āļĨāļ­āļ‡āļāļ” PIN āđ„āļĄ่āļ„āļĢāļš
  11. āļ—āļ”āļĨāļ­āļ‡āļāļ” PIN āļœิāļ”
  12. āļ—āļ”āļĨāļ­āļ‡āļāļ” PIN āļ—ี่āļ–ูāļāļ•้āļ­āļ‡
  13. āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ§่āļēāļĢāļ°āļšāļšāđ€āļ›ิāļ”āļŦāļ™้āļē Admin āđ„āļ”้


āļāļēāļĢāļ­ัāļ›āđ€āļ”āļ• Library

āđ€āļĄื่āļ­āđāļ้āđ„āļ‚āđ‚āļ„้āļ”āđƒāļ™ NumericPinLibrary āļāļēāļĢāđāļ้āđ„āļ‚āļˆāļ°āļĒัāļ‡āđ„āļĄ่āļŠ่āļ‡āļœāļĨāļ•่āļ­āđ‚āļ›āļĢāđ€āļˆāļāļ•์āļ—ี่āđ€āļĨืāļ­āļāđƒāļŠ้āđ€āļ§āļ­āļĢ์āļŠัāļ™āđ€āļ”ิāļĄāļ—ัāļ™āļ—ี

āļ‚ั้āļ™āļ•āļ­āļ™āļāļēāļĢāļ­ัāļ›āđ€āļ”āļ•āļ„ืāļ­:

  1. āđāļ้āđ„āļ‚āđ‚āļ„้āļ”āđƒāļ™āđ‚āļ›āļĢāđ€āļˆāļāļ•์ Library
  2. āđ€āļ›āļĨี่āļĒāļ™āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđƒāļ™ getLibraryVersion()
  3. āļšัāļ™āļ—ึāļāđ‚āļ„āļĢāļ‡āļāļēāļĢ
  4. āļŠāļĢ้āļēāļ‡āđ€āļ§āļ­āļĢ์āļŠัāļ™āđƒāļŦāļĄ่
  5. āđ€āļ›ิāļ”āđ‚āļ›āļĢāđ€āļˆāļāļ•์ Web App āļŦāļĨัāļ
  6. āđ„āļ›āļ—ี่āļŦัāļ§āļ‚้āļ­ Library
  7. āđ€āļ›āļĨี่āļĒāļ™āđ€āļ›็āļ™āđ€āļ§āļ­āļĢ์āļŠัāļ™āļĨ่āļēāļŠุāļ”
  8. āļāļ”āļšัāļ™āļ—ึāļ
  9. āļ—āļ”āļŠāļ­āļšāļĢāļ°āļšāļšāļ­ีāļāļ„āļĢั้āļ‡
  10. āļ—āļģāđƒāļŦ้ Web App āđƒāļŠ้āļ‡āļēāļ™āđ„āļ”้āđ€āļ›็āļ™āđ€āļ§āļ­āļĢ์āļŠัāļ™āđƒāļŦāļĄ่

āļŠāļģāļŦāļĢัāļšāļĢāļ°āļšāļšāļ—ี่āđ€āļ›ิāļ”āđƒāļŠ้āļ‡āļēāļ™āļˆāļĢิāļ‡ āļ„āļ§āļĢāđ€āļĨืāļ­āļāđ€āļ§āļ­āļĢ์āļŠัāļ™āļ—ี่āļĢāļ°āļšุāļŠัāļ”āđ€āļˆāļ™ āđ„āļĄ่āļ„āļ§āļĢāđƒāļŠ้āđ€āļ§āļ­āļĢ์āļŠัāļ™āļŠāļģāļŦāļĢัāļšāļžัāļ’āļ™āļē āđ€āļžāļĢāļēāļ°āđ‚āļ„้āļ”āļ­āļēāļˆāđ€āļ›āļĨี่āļĒāļ™āđ‚āļ”āļĒāđ„āļĄ่āļ•ั้āļ‡āđƒāļˆ


āļ›ัāļāļŦāļēāļ—ี่āļžāļšāļš่āļ­āļĒāđāļĨāļ°āļ§ิāļ˜ีāđāļ้āđ„āļ‚

1. āļ‚ึ้āļ™āļ‚้āļ­āļ„āļ§āļēāļĄ PinPadLib is not defined

āļŠāļēāđ€āļŦāļ•ุ:

  • āļĒัāļ‡āđ„āļĄ่āđ„āļ”้āđ€āļžิ่āļĄ Library
  • āļ•ัāļ§āļĢāļ°āļšุ Library āđ„āļĄ่āļ•āļĢāļ‡āļัāļšāļŠื่āļ­āđƒāļ™āđ‚āļ„้āļ”
  • āļĒัāļ‡āđ„āļĄ่āđ„āļ”้āļšัāļ™āļ—ึāļāđ‚āļ›āļĢāđ€āļˆāļāļ•์

āļ§ิāļ˜ีāđāļ้:

  • āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ§่āļēāļ•ิāļ”āļ•ั้āļ‡ Library āđāļĨ้āļ§
  • āļ•ั้āļ‡āļ•ัāļ§āļĢāļ°āļšุāđ€āļ›็āļ™ PinPadLib
  • āļšัāļ™āļ—ึāļāđāļĨāļ°āđ€āļ›ิāļ”āđ‚āļ›āļĢāđ€āļˆāļāļ•์āđƒāļŦāļĄ่

2. āļ‚ึ้āļ™āļ‚้āļ­āļ„āļ§āļēāļĄāļ§่āļēāđ„āļĄ่āļžāļšāļŸัāļ‡āļ์āļŠัāļ™ verifyPin

āļŠāļēāđ€āļŦāļ•ุ:

  • āđ€āļĨืāļ­āļāđ€āļ§āļ­āļĢ์āļŠัāļ™ Library āđ€āļ่āļē
  • āđ€āļ§āļ­āļĢ์āļŠัāļ™āļ™ั้āļ™āļĒัāļ‡āđ„āļĄ่āļĄีāļŸัāļ‡āļ์āļŠัāļ™ verifyPin
  • āļ•ั้āļ‡āļŠื่āļ­āļŸัāļ‡āļ์āļŠัāļ™āđ„āļĄ่āļ•āļĢāļ‡āļัāļ™

āļ§ิāļ˜ีāđāļ้:

  • āļŠāļĢ้āļēāļ‡āđ€āļ§āļ­āļĢ์āļŠัāļ™āđƒāļŦāļĄ่āļ‚āļ­āļ‡ Library
  • āđ€āļ›āļĨี่āļĒāļ™āđ€āļ§āļ­āļĢ์āļŠัāļ™āđƒāļ™āđ‚āļ›āļĢāđ€āļˆāļāļ•์āļŦāļĨัāļ
  • āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ•ัāļ§āļžิāļĄāļž์āđ€āļĨ็āļāđāļĨāļ°āļ•ัāļ§āļžิāļĄāļž์āđƒāļŦāļ่

3. āļāļ” PIN āļ–ูāļāļ•้āļ­āļ‡āđāļ•่āļĢāļ°āļšāļšāđāļˆ้āļ‡āļ§่āļēāļœิāļ”

āļŠāļēāđ€āļŦāļ•ุ:

  • āļˆāļģāļ™āļ§āļ™āļŦāļĨัāļāđƒāļ™āļŦāļ™้āļēāđ€āļ§็āļšāđ„āļĄ่āļ•āļĢāļ‡āļัāļš Library
  • āļ„่āļē ADMIN_PIN āļĄีāļŠ่āļ­āļ‡āļ§่āļēāļ‡
  • āļ•ั้āļ‡āļŠื่āļ­ Script Property āļœิāļ”
  • PIN āļ—ี่āļ‚ึ้āļ™āļ•้āļ™āļ”้āļ§āļĒāļĻูāļ™āļĒ์āļ–ูāļāļšัāļ™āļ—ึāļāđ„āļĄ่āļ„āļĢāļš

āļ§ิāļ˜ีāđāļ้:

  • āļ•āļĢāļ§āļˆāļŠāļ­āļš PIN_LENGTH
  • āļ•āļĢāļ§āļˆāļŠāļ­āļšāļˆāļģāļ™āļ§āļ™āļŦāļĨัāļāđƒāļ™ verifyPin()
  • āļ•āļĢāļ§āļˆāļŠāļ­āļšāļŠื่āļ­ ADMIN_PIN
  • āļĨāļšāļ„่āļēāđ€āļ”ิāļĄāđāļĨ้āļ§āļšัāļ™āļ—ึāļ PIN āđƒāļŦāļĄ่āđ€āļ›็āļ™āļ‚้āļ­āļ„āļ§āļēāļĄ

4. āļĢāļ°āļšāļšāđāļˆ้āļ‡āļ§่āļēāļĒัāļ‡āđ„āļĄ่āđ„āļ”้āļ•ั้āļ‡āļ„่āļē ADMIN_PIN

āļŠāļēāđ€āļŦāļ•ุ:    āļĒัāļ‡āđ„āļĄ่āļĄี Script Property āļŠื่āļ­ ADMIN_PIN

āļ§ิāļ˜ีāđāļ้:    āđ€āļ‚้āļēāđ„āļ›āļ—ี่āļāļēāļĢāļ•ั้āļ‡āļ„่āļēāđ‚āļ›āļĢāđ€āļˆāļāļ•์ āđāļĨ้āļ§āđ€āļžิ่āļĄ:

ADMIN_PIN = 123456

5. āđāļ้ Library āđāļĨ้āļ§āđ‚āļ›āļĢāđ€āļˆāļāļ•์āļŦāļĨัāļāđ„āļĄ่āđ€āļ›āļĨี่āļĒāļ™

āļŠāļēāđ€āļŦāļ•ุ:    āđ‚āļ›āļĢāđ€āļˆāļāļ•์āļŦāļĨัāļāļĒัāļ‡āđƒāļŠ้ Library āđ€āļ§āļ­āļĢ์āļŠัāļ™āđ€āļ”ิāļĄ

āļ§ิāļ˜ีāđāļ้:    āļŠāļĢ้āļēāļ‡ Library āđ€āļ§āļ­āļĢ์āļŠัāļ™āđƒāļŦāļĄ่ āđāļĨ้āļ§āļāļĨัāļšāđ„āļ›āđ€āļ›āļĨี่āļĒāļ™āđ€āļ§āļ­āļĢ์āļŠัāļ™āđƒāļ™āđ‚āļ›āļĢāđ€āļˆāļāļ•์āļŦāļĨัāļ


āļ‚้āļ­āđāļ™āļ°āļ™āļģāļ”้āļēāļ™āļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ ัāļĒ

āđāļĄ้āļ§่āļēāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļš PIN āļ—ี่ Code.gs āļˆāļ°āļ›āļĨāļ­āļ”āļ ัāļĒāļāļ§่āļēāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāđƒāļ™ JavaScript āđāļ•่āļ„āļ§āļĢāļ›āļิāļšัāļ•ิāļ•āļēāļĄāļ„āļģāđāļ™āļ°āļ™āļģāđ€āļžิ่āļĄāđ€āļ•ิāļĄāļ”ัāļ‡āļ™ี้

  • āđ€āļ›āļĨี่āļĒāļ™ PIN āđ€āļĢิ่āļĄāļ•้āļ™ 123456 āļ่āļ­āļ™āđƒāļŠ้āļ‡āļēāļ™āļˆāļĢิāļ‡
  • āđ„āļĄ่āđ€āļ‚ีāļĒāļ™ PIN āđ„āļ§้āđƒāļ™ index.html āļŦāļĢืāļ­ javascript.html
  • āđ„āļĄ่āļŠ่āļ‡ PIN āļ—ี่āļ–ูāļāļ•้āļ­āļ‡āļāļĨัāļšāđ„āļ›āļĒัāļ‡āļŦāļ™้āļēāđ€āļ§็āļš
  • āđ„āļĄ่āđāļŠāļ”āļ‡ PIN āđƒāļ™āļ‚้āļ­āļ„āļ§āļēāļĄāđāļˆ้āļ‡āļ‚้āļ­āļœิāļ”āļžāļĨāļēāļ”
  • āļˆāļģāļัāļ”āļˆāļģāļ™āļ§āļ™āļ„āļĢั้āļ‡āļ—ี่āļœู้āđƒāļŠ้āļŠāļēāļĄāļēāļĢāļ–āļĨāļ­āļ‡ PIN
  • āđ€āļžิ่āļĄāļāļēāļĢāļŦāļ™่āļ§āļ‡āđ€āļ§āļĨāļēāļŠั่āļ§āļ„āļĢāļēāļ§āđ€āļĄื่āļ­āļāļ”āļœิāļ”āļŦāļĨāļēāļĒāļ„āļĢั้āļ‡
  • āđ€āļ›āļĨี่āļĒāļ™ PIN āđ€āļ›็āļ™āļĢāļ°āļĒāļ°
  • āļˆāļģāļัāļ”āļŠิāļ—āļ˜ิ์āļœู้āļ—ี่āļŠāļēāļĄāļēāļĢāļ–āđāļ้āđ„āļ‚āđ‚āļ›āļĢāđ€āļˆāļāļ•์ Apps Script
  • āļ•āļĢāļ§āļˆāļŠāļ­āļšāļŠิāļ—āļ˜ิ์āļ‹้āļģāđƒāļ™āļŸัāļ‡āļ์āļŠัāļ™āļŠāļģāļ„ัāļāļ‚āļ­āļ‡āļั่āļ‡āđ€āļ‹ิāļĢ์āļŸāđ€āļ§āļ­āļĢ์
  • āđ„āļĄ่āļ„āļ§āļĢāđƒāļŠ้āļāļēāļĢāļ‹่āļ­āļ™āļŦāļ™้āļē Admin āđ€āļžีāļĒāļ‡āļ­āļĒ่āļēāļ‡āđ€āļ”ีāļĒāļ§āđ€āļ›็āļ™āļĢāļ°āļšāļšāļĢัāļāļĐāļēāļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ ัāļĒ

āļĢāļ°āļšāļš PIN āđ€āļŦāļĄāļēāļ°āļŠāļģāļŦāļĢัāļšāļāļēāļĢāļ„āļ§āļšāļ„ุāļĄāļāļēāļĢāđ€āļ‚้āļēāļ–ึāļ‡āđƒāļ™ Web App āļ āļēāļĒāđƒāļ™āļŦāļĢืāļ­āļĢāļ°āļšāļšāļ—ั่āļ§āđ„āļ› āļŦāļēāļāđ€āļ›็āļ™āļĢāļ°āļšāļšāļ—ี่āļĄีāļ‚้āļ­āļĄูāļĨāļŠāļģāļ„ัāļāļĄāļēāļ āđ€āļŠ่āļ™ āļ‚้āļ­āļĄูāļĨāļŠ่āļ§āļ™āļšุāļ„āļ„āļĨ āļ‚้āļ­āļĄูāļĨāļāļēāļĢāđ€āļ‡ิāļ™ āļŦāļĢืāļ­āļ‚้āļ­āļĄูāļĨāļŠุāļ‚āļ āļēāļž āļ„āļ§āļĢāđƒāļŠ้āļĢāļ°āļšāļšāļĒืāļ™āļĒัāļ™āļ•ัāļ§āļ•āļ™āļ”้āļ§āļĒāļšัāļāļŠี Google āļŦāļĢืāļ­āļĢāļ°āļšāļšāļŠิāļ—āļ˜ิ์āļœู้āđƒāļŠ้āļ‡āļēāļ™āđ€āļžิ่āļĄāđ€āļ•ิāļĄ


āļ›āļĢāļ°āđ‚āļĒāļŠāļ™์āļ‚āļ­āļ‡āļāļēāļĢāļŠāļĢ้āļēāļ‡āđ€āļ›็āļ™ Library

āļāļēāļĢāđāļĒāļāļŸัāļ‡āļ์āļŠัāļ™āļ•āļĢāļ§āļˆāļŠāļ­āļš PIN āđ€āļ›็āļ™ Library āļŠ่āļ§āļĒāđƒāļŦ้:

  • āđ„āļĄ่āļ•้āļ­āļ‡āđ€āļ‚ีāļĒāļ™āđ‚āļ„้āļ”āļ•āļĢāļ§āļˆāļŠāļ­āļš PIN āļ‹้āļģāļ—ุāļāđ‚āļ›āļĢāđ€āļˆāļāļ•์
  • āđāļ้āđ„āļ‚āļĢāļ°āļšāļšāļ•āļĢāļ§āļˆāļŠāļ­āļšāļˆāļēāļāļˆุāļ”āđ€āļ”ีāļĒāļ§
  • āļāļģāļŦāļ™āļ” PIN āđāļĒāļāļŠāļģāļŦāļĢัāļšāđāļ•่āļĨāļ°āļĢāļ°āļšāļšāđ„āļ”้
  • āļ„āļ§āļšāļ„ุāļĄāđ€āļ§āļ­āļĢ์āļŠัāļ™āļ‚āļ­āļ‡āđ‚āļ„้āļ”āđ„āļ”้
  • āļĨāļ”āļ„āļ§āļēāļĄāļœิāļ”āļžāļĨāļēāļ”āļˆāļēāļāļāļēāļĢāļ„ัāļ”āļĨāļ­āļāđ‚āļ„้āļ”
  • āļ™āļģāđ„āļ›āđƒāļŠ้āļัāļšāļĢāļ°āļšāļšāđƒāļŦāļĄ่āđ„āļ”้āļĢāļ§āļ”āđ€āļĢ็āļ§
  • āļ—āļģāđƒāļŦ้āđ‚āļ„āļĢāļ‡āļŠāļĢ้āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāļāļ•์āđ€āļ›็āļ™āļĢāļ°āđ€āļšีāļĒāļš
  • āđ€āļŦāļĄāļēāļ°āļŠāļģāļŦāļĢัāļšāļœู้āļžัāļ’āļ™āļēāļ—ี่āļĄี Web App āļŦāļĨāļēāļĒāļĢāļ°āļšāļš

āļ•ัāļ§āļ­āļĒ่āļēāļ‡āđ€āļŠ่āļ™ āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠ้ PinPadLib āļ•ัāļ§āđ€āļ”ีāļĒāļ§āļัāļšāļĢāļ°āļšāļšāđāļˆ้āļ‡āļāļēāļĢāļĨāļē āļĢāļ°āļšāļšāļšัāļ™āļ—ึāļāļ„āļ°āđāļ™āļ™ āļĢāļ°āļšāļšāļĢāļēāļĒāļ‡āļēāļ™āđ€āļ§āļĢ āđāļĨāļ°āļĢāļ°āļšāļšāļˆัāļ”āļāļēāļĢāđ€āļ­āļāļŠāļēāļĢ āđāļ•่āļāļģāļŦāļ™āļ” ADMIN_PIN āļ‚āļ­āļ‡āđāļ•่āļĨāļ°āļĢāļ°āļšāļšāđāļ•āļāļ•่āļēāļ‡āļัāļ™āđ„āļ”้


āļŠāļĢุāļ›

āđāļ›้āļ™āļāļ” PIN āđāļšāļšāļ•ัāļ§āđ€āļĨāļ‚āļŠ่āļ§āļĒāđƒāļŦ้āļāļēāļĢāđ€āļ‚้āļēāļŠู่āļĢāļ°āļšāļšāļœู้āļ”ูāđāļĨāđƒāļŠ้āļ‡āļēāļ™āļ‡่āļēāļĒāļ‚ึ้āļ™ āđ‚āļ”āļĒāđ€āļ‰āļžāļēāļ°āļšāļ™āđ‚āļ—āļĢāļĻัāļžāļ—์āļĄืāļ­āļ–ืāļ­ āđ€āļĄื่āļ­āļ™āļģāļŠ่āļ§āļ™āļ•āļĢāļ§āļˆāļŠāļ­āļš PIN āļĄāļēāļŠāļĢ้āļēāļ‡āđ€āļ›็āļ™ Google Apps Script Library āļ็āļˆāļ°āļŠāļēāļĄāļēāļĢāļ–āļ™āļģāđ„āļ›āđƒāļŠ้āļ‹้āļģāļัāļš Web App āļŦāļĨāļēāļĒāļĢāļ°āļšāļšāđ„āļ”้āļ­āļĒ่āļēāļ‡āļŠāļ°āļ”āļ§āļ

āđ‚āļ„āļĢāļ‡āļŠāļĢ้āļēāļ‡āļŠāļģāļ„ัāļāļĄีāđ€āļžีāļĒāļ‡ 3 āļ‚ั้āļ™āļ•āļ­āļ™:

āļŦāļ™้āļēāđ€āļ§็āļšāļĢัāļš PIN
       ↓
Code.gs āļĢัāļšāļ„āļģāļ‚āļ­
       ↓
Library āļ•āļĢāļ§āļˆāļŠāļ­āļš PIN

āļ§ิāļ˜ีāļ™ี้āļŠ่āļ§āļĒāđāļĒāļāļŦāļ™้āļēāļ•āļē āļāļēāļĢāļĢัāļšāļ‚้āļ­āļĄูāļĨ āđāļĨāļ°āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļ­āļ­āļāļˆāļēāļāļัāļ™āļ­āļĒ่āļēāļ‡āļŠัāļ”āđ€āļˆāļ™ āļ—āļģāđƒāļŦ้āļĢāļ°āļšāļšāļ”ูāđāļĨāļĢัāļāļĐāļēāļ‡่āļēāļĒāđāļĨāļ°āļžāļĢ้āļ­āļĄāļ•่āļ­āļĒāļ­āļ”āđƒāļ™āļ­āļ™āļēāļ„āļ•

āđ€āļ­āļāļŠāļēāļĢāļ›āļĢāļ°āļāļ­āļšāđ€āļžิ่āļĄāđ€āļ•ิāļĄ:

#GoogleAppsScript #GAS #GoogleSheet #WebApp #AppsScriptLibrary #NumericPIN #PINLogin #āđāļ›้āļ™āļāļ”PIN #āļŠāļ­āļ™āđ€āļ‚ีāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ #āļĢāļ°āļšāļšāļŦāļĨัāļ‡āļš้āļēāļ™ #āļĢāļ°āļšāļšāļœู้āļ”ูāđāļĨ #āļ„āļĢูāļāļĪāļ•ัāļŠāļ์AI

āđāļŠāļ”āļ‡āļ„āļ§āļēāļĄāļ„ิāļ”āđ€āļŦ็āļ™ (0)
āđƒāļŦāļĄ่āļāļ§่āļē āđ€āļ่āļēāļāļ§่āļē