ðāļŠāļĢ้āļēāļāđāļ้āļāļāļ 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
- āđāļิāļāđāļ§็āļāđāļāļ์ Google Apps Script
- āļāļāļุ่āļĄ āđāļāļĢāđāļāļāļ์āđāļŦāļĄ่
- āļั้āļāļื่āļāđāļāļĢāđāļāļāļ์āļ§่āļē NumericPinLibrary
- āđāļิāļāđāļāļĨ์
Code.gs - āļĨāļāđāļ้āļāđāļิāļĄāļāļāļ
- āļāļģāđāļ้āļāļ่āļāđāļāļี้āđāļāļ§āļēāļ
/**
* 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
āļŦāļĨัāļāļāļēāļāđāļŠ่āđāļ้āļāđāļĢีāļĒāļāļĢ้āļāļĒāđāļĨ้āļ§ āđāļŦ้āļāļģāđāļิāļāļāļēāļĢāļัāļāļี้
- āļāļ āļัāļāļึāļāđāļāļĢāļāļāļēāļĢ
- āļāļāđāļĄāļู āļāļģāđāļŦ้āđāļ้āļāļēāļāđāļ้
- āđāļĨืāļāļ āļāļēāļĢāļāļģāđāļŦ้āđāļ้āļāļēāļāđāļ้āļĢāļēāļĒāļāļēāļĢāđāļŦāļĄ่
- āļāļāđāļāļāļāļāļĢูāļāđāļืāļāļ
- āđāļĨืāļāļāļāļĢāļ°āđāļ āļ āđāļĨāļāļĢāļēāļĢี
- āđāļŠ่āļāļģāļāļิāļāļēāļĒ āđāļ่āļ Numeric PIN Library Version 1.0.0
- āļāļ āļāļģāđāļŦ้āđāļ้āļāļēāļāđāļ้
- āļĢāļ°āļāļāļāļ°āļŠāļĢ้āļēāļāđāļ§āļāļĢ์āļัāļāđāļĢāļ āđāļ่āļ āđāļ§āļāļĢ์āļัāļ
1
āđāļĄื่āļāđāļ้āđāļāđāļ้āļāđāļ Library āļ āļēāļĒāļŦāļĨัāļ āļ้āļāļāļŠāļĢ้āļēāļāđāļ§āļāļĢ์āļัāļāđāļŦāļĄ่ āđāļ่āļ āđāļ§āļāļĢ์āļัāļ 2, 3 āļŦāļĢืāļ 4 āđāļĨ้āļ§āļึāļāļāļĨัāļāđāļāđāļāļĨี่āļĒāļāđāļ§āļāļĢ์āļัāļāđāļāđāļāļĢāđāļāļāļ์āļี่āļāļģ Library āđāļāđāļ้
āļั้āļāļāļāļāļี่ 3 āļัāļāļĨāļāļ Script ID
- āđāļิāļāļŦāļ้āļē āļāļēāļĢāļั้āļāļ่āļēāđāļāļĢāđāļāļāļ์
- āđāļĨื่āļāļāđāļāļี่āļŦัāļ§āļ้āļ āļĢāļŦัāļŠ
- āļัāļāļĨāļāļāļ่āļē āļĢāļŦัāļŠāļŠāļāļĢิāļāļ์ āļŦāļĢืāļ Script ID
āļัāļ§āļāļĒ่āļēāļāļĢูāļāđāļāļ Script ID:
1AbCdEfGhIjKlMnOpQrStUvWxYz1234567890Script ID āđāļāļĢีāļĒāļāđāļŠāļĄืāļāļāļĢāļŦัāļŠāļāļĢāļ°āļāļģāļัāļ§āļāļāļ Library āļึ่āļāļāļ°āđāļ้āļŠāļģāļŦāļĢัāļāļิāļāļั้āļ Library āđāļāđāļāļĢāđāļāļāļ์āļื่āļ
āļŦāļēāļāļ้āļāļāļāļēāļĢāđāļŦ้āļัāļāļี Google āļื่āļāđāļ้ Library āļ้āļāļāđāļāļĢ์āđāļāļĢāđāļāļāļ์ Library āđāļŦ้āļัāļāļีāļั้āļāļĄีāļŠิāļāļิ์āđāļ้āļēāļึāļāļ้āļ§āļĒ
āļั้āļāļāļāļāļี่ 4 āļิāļāļั้āļ Library āđāļāđāļāļĢāđāļāļāļ์ Web App
āđāļิāļāđāļāļĢāđāļāļāļ์ Google Apps Script āļี่āļ้āļāļāļāļēāļĢāļāļģāđāļ้āļ PIN āđāļāđāļ้ āļāļēāļāļั้āļāļāļģāđāļิāļāļāļēāļĢāļัāļāļี้
- āļูāđāļĄāļูāļ้āļēāļāļ้āļēāļĒ
- āđāļāļี่āļŦัāļ§āļ้āļ āđāļĨāļāļĢāļēāļĢี
- āļāļāđāļāļĢื่āļāļāļŦāļĄāļēāļĒ
+ - āļ§āļēāļ Script ID āļี่āļัāļāļĨāļāļāļĄāļē
- āļāļ āļ้āļāļŦāļē
- āđāļĨืāļāļāđāļ§āļāļĢ์āļัāļāļี่āļ้āļāļāļāļēāļĢ āđāļ่āļ āđāļ§āļāļĢ์āļัāļ
1 - āļāļģāļŦāļāļāļัāļ§āļĢāļ°āļุ Library āđāļ็āļ PinPadLib
- āļāļ āđāļิ่āļĄ
āđāļĄื่āļāļิāļāļั้āļāđāļĢีāļĒāļāļĢ้āļāļĒāđāļĨ้āļ§ āļāļ°āļŠāļēāļĄāļēāļĢāļāđāļĢีāļĒāļāđāļ้āļัāļāļ์āļัāļāđāļ Library āđāļ้āļ้āļ§āļĒāļāļģāļŠั่āļ:
PinPadLib.verifyPin()āļัāļ§āļĢāļ°āļุ PinPadLib āļ้āļāļāļāļĢāļāļัāļāļื่āļāļี่āļāļģāļŦāļāļāđāļāļŦāļ้āļēāļิāļāļั้āļ Library āļŦāļēāļāļāļģāļŦāļāļāđāļ็āļāļื่āļāļื่āļ āļ้āļāļāđāļāļĨี่āļĒāļāļื่āļāđāļāđāļ้āļāđāļŦ้āļāļĢāļāļัāļāļ้āļ§āļĒ
āļั้āļāļāļāļāļี่ 5 āļāļģāļŦāļāļ PIN āđāļ Script Properties
āđāļĄ่āļāļ§āļĢāđāļีāļĒāļ PIN āđāļ§้āđāļ javascript.html āđāļāļĢāļēāļ°āļู้āđāļ้āļŠāļēāļĄāļēāļĢāļāđāļิāļāđāļāļĢื่āļāļāļĄืāļāļัāļāļัāļāļāļēāđāļĨāļ°āļāļĢāļ§āļāļŠāļāļāđāļ้āļāļั่āļāļŦāļ้āļēāđāļ§็āļāđāļ้
āđāļāļ°āļāļģāđāļŦ้āđāļ็āļ PIN āđāļ§้āđāļ Script Properties āļāļāļāđāļ่āļĨāļ°āđāļāļĢāđāļāļāļ์
āļ§ิāļีāļั้āļāļ่āļē:
- āđāļิāļ āļāļēāļĢāļั้āļāļ่āļēāđāļāļĢāđāļāļāļ์
- āđāļāļี่āļŦัāļ§āļ้āļ āļāļĢ็āļāļāđāļāļāļĢ์āļี้āļāļāļāļŠāļāļĢิāļāļ์
- āļāļ āđāļิ่āļĄāļāļĢ็āļāļāđāļāļāļĢ์āļี้āļāļāļāļŠāļāļĢิāļāļ์
- āļāļģāļŦāļāļāļ่āļēāļัāļāļี้
āļāļĢ็āļāļāđāļāļāļĢ์āļี้: 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 āđāļ้
āļ§ิāļีāļāļāļŠāļāļāļĢāļ°āļāļ
āļŦāļĨัāļāļāļēāļāļิāļāļั้āļāļุāļāļŠ่āļ§āļāđāļĨ้āļ§ āđāļŦ้āļāļāļŠāļāļāļāļēāļĄāļĨāļģāļัāļāļัāļāļี้
- āļัāļāļึāļāđāļāļĢāđāļāļāļ์āļั้āļāļŦāļĄāļ
- āļāļĢāļ§āļāļŠāļāļāļ§่āļēāļิāļāļั้āļ Library āđāļĨ้āļ§
- āļāļĢāļ§āļāļŠāļāļāļัāļ§āļĢāļ°āļุ Library āļ§่āļēāđāļ็āļ
PinPadLib - āļāļĢāļ§āļāļŠāļāļāļ§่āļēāđāļĨืāļāļāđāļ§āļāļĢ์āļัāļāļูāļāļ้āļāļ
- āļāļĢāļ§āļāļŠāļāļāļ§่āļēāļĄี Script Property āļื่āļ
ADMIN_PIN - āļāļĢāļ§āļāļŠāļāļāļāļģāļāļ§āļāļŦāļĨัāļāļāļāļ PIN
- āļāļģāđāļŦ้ Web App āđāļ้āļāļēāļāđāļ้āļีāļāļāļĢั้āļ
- āđāļิāļāļĨิāļāļ์ Web App
- āļāļāļุ่āļĄāđāļ้āļēāļŠู่āļĢāļ°āļāļāļู้āļูāđāļĨ
- āļāļāļĨāļāļāļāļ PIN āđāļĄ่āļāļĢāļ
- āļāļāļĨāļāļāļāļ PIN āļิāļ
- āļāļāļĨāļāļāļāļ PIN āļี่āļูāļāļ้āļāļ
- āļāļĢāļ§āļāļŠāļāļāļ§่āļēāļĢāļ°āļāļāđāļิāļāļŦāļ้āļē Admin āđāļ้
āļāļēāļĢāļัāļāđāļāļ Library
āđāļĄื่āļāđāļ้āđāļāđāļ้āļāđāļ NumericPinLibrary āļāļēāļĢāđāļ้āđāļāļāļ°āļĒัāļāđāļĄ่āļŠ่āļāļāļĨāļ่āļāđāļāļĢāđāļāļāļ์āļี่āđāļĨืāļāļāđāļ้āđāļ§āļāļĢ์āļัāļāđāļิāļĄāļัāļāļี
āļั้āļāļāļāļāļāļēāļĢāļัāļāđāļāļāļืāļ:
- āđāļ้āđāļāđāļ้āļāđāļāđāļāļĢāđāļāļāļ์ Library
- āđāļāļĨี่āļĒāļāļŦāļĄāļēāļĒāđāļĨāļāđāļ
getLibraryVersion() - āļัāļāļึāļāđāļāļĢāļāļāļēāļĢ
- āļŠāļĢ้āļēāļāđāļ§āļāļĢ์āļัāļāđāļŦāļĄ่
- āđāļิāļāđāļāļĢāđāļāļāļ์ Web App āļŦāļĨัāļ
- āđāļāļี่āļŦัāļ§āļ้āļ Library
- āđāļāļĨี่āļĒāļāđāļ็āļāđāļ§āļāļĢ์āļัāļāļĨ่āļēāļŠุāļ
- āļāļāļัāļāļึāļ
- āļāļāļŠāļāļāļĢāļ°āļāļāļีāļāļāļĢั้āļ
- āļāļģāđāļŦ้ 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 = 1234565. āđāļ้ 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
