ใช้ Google Sheets เป็นฐานข้อมูลด้วย Apps Script: CRUD และเทคนิคทำให้เร็ว
อัปเดต 5 ตุลาคม 2026
Google Sheets ใช้เป็นฐานข้อมูลสำหรับระบบขนาดเล็ก-กลางได้ดีมาก ข้อดีคือ เจ้าของร้านเปิดดู/แก้ข้อมูลเองได้ทันที และสำรองข้อมูลอัตโนมัติบน Google Drive หน้านี้รวมเทคนิคที่ทำให้ระบบเร็วและไม่พังเมื่อมีผู้ใช้หลายคน
ระบบพร้อมใช้ที่เกี่ยวข้อง
หลักการออกแบบชีต
- 1 ชีต = 1 ตาราง แถวแรกเป็นชื่อคอลัมน์
- มีคอลัมน์
idที่ไม่ซ้ำ (เช่นUtilities.getUuid()) ไว้อ้างอิงแถว - อย่าเก็บข้อมูลหลายประเภทในชีตเดียว อย่า merge เซลล์ในชีตข้อมูล
CRUD แบบเร็ว (อ่าน/เขียนครั้งเดียว)
function readAll(name) {
const values = SpreadsheetApp.getActive().getSheetByName(name).getDataRange().getValues();
const [head, ...rows] = values;
return rows.map(r => Object.fromEntries(head.map((h, i) => [h, r[i]])));
}
function insert(name, obj) {
const sh = SpreadsheetApp.getActive().getSheetByName(name);
const head = sh.getRange(1, 1, 1, sh.getLastColumn()).getValues()[0];
sh.appendRow(head.map(h => obj[h] ?? ''));
}
function updateById(name, id, patch) {
const sh = SpreadsheetApp.getActive().getSheetByName(name);
const values = sh.getDataRange().getValues();
const idCol = values[0].indexOf('id');
const i = values.findIndex(r => r[idCol] === id);
if (i < 1) return false;
values[0].forEach((h, c) => { if (h in patch) values[i][c] = patch[h]; });
sh.getRange(i + 1, 1, 1, values[i].length).setValues([values[i]]);
return true;
}
เทคนิคทำให้เร็ว
- อ่านทีเดียวด้วย
getValues()แทนการวนอ่านทีละเซลล์ (เร็วกว่าหลายสิบเท่า) - เขียนทีเดียวด้วย
setValues()แทนsetValue()ในลูป - แคชข้อมูลที่อ่านบ่อย ด้วย
CacheService.getScriptCache()เช่น รายการสินค้า - ใช้
LockServiceทุกครั้งที่เขียน เพื่อกันข้อมูลทับกัน เช่น เลขที่บิลซ้ำ - เก็บประวัติเก่าแยกชีต/แยกไฟล์ เมื่อข้อมูลเกินหลักแสนแถว
ข้อจำกัดที่ควรรู้
ไฟล์ Google Sheets มีขีดจำกัดจำนวนเซลล์ทั้งไฟล์ (ราว 10 ล้านเซลล์) และสคริปต์ทำงานได้สูงสุด 6 นาทีต่อครั้ง ระบบ POS หรือระบบสต็อกของร้านทั่วไปจึงใช้ได้สบาย แต่ระบบที่มีธุรกรรมหลักล้านต่อวันควรใช้ฐานข้อมูลจริง
คำถามที่พบบ่อย: ใช้ Google Sheets เป็นฐานข้อมูล
จำกัดที่จำนวนเซลล์ทั้งไฟล์ประมาณ 10 ล้านเซลล์ เช่น ตาราง 10 คอลัมน์เก็บได้ราว 1 ล้านแถว แต่ควรแยกข้อมูลเก่าออกเพื่อให้ระบบเร็ว
ส่วนใหญ่เกิดจากการเรียก getValue/setValue ทีละเซลล์ในลูป ให้เปลี่ยนเป็น getValues/setValues ครั้งเดียว และแคชข้อมูลที่ใช้บ่อย
อาจเกิดได้ ให้ใช้ LockService.getScriptLock() ครอบส่วนที่เขียนข้อมูลทุกครั้ง
ระบบอื่นที่น่าสนใจ
POS ร้านขายยา
จ่ายยาถูกคน ถูกล็อต ไม่มียาหมดอายุค้างชั้น · ชื่อสามัญ ประเภทยา เภสัชกรยืนยัน เตือนแพ้ยา ล็อต FEFO ฉลากยา บัญชีขายยาอันตราย · บน Google Sheets ของร้านเอง ไม่มีค่ารายเดือน
POS ร้านอาหาร (โต๊ะ ครัว QR สั่งอาหาร)
ผังโต๊ะสด · ลูกค้าสแกน QR สั่งอาหารที่โต๊ะ · จอครัว · แจ้งเตือนเรียกพนักงาน · ค่าบริการ · เมนูหมดอัตโนมัติ + แจ้งวัตถุดิบหมดทาง LINE/อีเมล · ไม่มีค่ารายเดือน