คุณเคยนั่งทำงานแล้วเผลอลบไฟล์สำคัญทิ้งไปหรือไม่? หรือกังวลว่าหากมีคนในทีมเผลอแก้ไขไฟล์ต้นฉบับจนเสียหาย จะไม่มีไฟล์สำรองเก็บไว้?
การสำรองข้อมูล (Backup) คือหัวใจสำคัญของความปลอดภัยในโลกดิจิทัล แต่ปัญหาคือ “ความขี้เกียจ” เรามักจะลืม หรือไม่มีเวลามานั่งคัดลอกไฟล์ด้วยตนเองทุกวัน
วันนี้ เราจะมาแก้ปัญหานี้กันแบบถาวร ด้วยการสร้าง “AI” ผู้ช่วยส่วนตัวที่จะทำงานให้เราเงียบๆ บนเซิร์ฟเวอร์ของ Google AI ตัวนี้มีชื่อว่า Google Apps Script และมันจะคอย “Mirror Sync” (ซิงค์แบบกระจกเงา) ไฟล์จากโฟลเดอร์ต้นทางไปยังโฟลเดอร์สำรองให้คุณอัตโนมัติ… แม้ในขณะที่คุณหลับ
บทความนี้คือคู่มือฉบับจับมือทำ ที่จะเปลี่ยนคุณให้เป็นผู้ควบคุม AI ตัวนี้ พร้อมโค้ดสคริปต์ที่นำไปใช้งานได้ทันที
ภารกิจ: เราจะสร้างอะไร?
เราจะสร้างระบบสำรองข้อมูลแบบ “Mirror Sync” ที่มีคุณสมบัติดังนี้:
- เป้าหมาย: คัดลอกไฟล์และโฟลเดอร์ทั้งหมดจาก “โฟลเดอร์ต้นทาง” (Source) ไปยัง “โฟลเดอร์สำรอง” (Backup)
- ความฉลาด (Incremental Backup):
- ถ้าไฟล์ใหม่ถูกเพิ่มในต้นทาง -> จะคัดลอกไฟล์นั้นไปที่ปลายทาง
- ถ้าไฟล์ในต้นทางถูกแก้ไข (ใหม่กว่า) -> จะอัปเดตไฟล์นั้นที่ปลายทาง (ลบของเก่า, คัดลอกของใหม่)
- ถ้าไฟล์ไม่เปลี่ยนแปลง -> จะไม่ทำอะไร (เพื่อประหยัดเวลา)
- ความปลอดภัย: สคริปต์นี้จะ ไม่ลบ ไฟล์ในปลายทาง แม้ว่าไฟล์นั้นจะถูกลบในต้นทางแล้ว (เพื่อป้องกันการเผลอลบแล้ว backup หายตาม)
ขั้นตอนที่ 1: เตรียมบ้าน (Google Drive)
สิ่งที่คุณต้องมีคือโฟลเดอร์ 2 อัน:
- โฟลเดอร์ต้นทาง (Source): โฟลเดอร์ที่คุณและทีมใช้ทำงานจริง
- โฟลเดอร์สำรอง (Backup): โฟลเดอร์ว่างๆ ที่คุณจะใช้เก็บไฟล์สำรอง
วิธีหา Folder ID (สำคัญมาก):
ไปที่ Google Drive ของคุณ คลิกเข้าไปในโฟลเดอร์ สังเกตที่ URL ด้านบน: https://drive.google.com/drive/folders/1a2b3c4d_THIS_IS_THE_ID_XYZ
ข้อความที่อยู่หลัง /folders/ นั่นคือ Folder ID ให้คัดลอก ID ของทั้งสองโฟลเดอร์เก็บไว้
ขั้นตอนที่ 2: เปิด Google Apps Script
- ไปที่
script.google.com - คลิกที่ “New project” (โครงการใหม่)
- ตั้งชื่อโปรเจกต์ของคุณ (เช่น “My Drive Backup Robot”)
ขั้นตอนที่ 3: วางโค้ด (หัวใจของ AI)
ลบโค้ด function myFunction() {} ที่มีอยู่ทิ้งไป แล้วคัดลอกโค้ดทั้งหมดด้านล่างนี้ไปวางแทน:
JavaScript
// --- ‼️ กรุณาแก้ไขค่า ID ด้านล่างนี้ ‼️ ---
var SOURCE_FOLDER_ID = "YOUR_SOURCE_FOLDER_ID"; // 👈 ใส่ ID โฟลเดอร์ต้นทาง
var BACKUP_FOLDER_ID = "YOUR_BACKUP_FOLDER_ID"; // 👈 ใส่ ID โฟลเดอร์สำรอง
// ------------------------------------------
/**
* ฟังก์ชันหลักที่จะถูกเรียกโดย Trigger
*/
function startBackup() {
Logger.log("--- เริ่มกระบวนการสำรองข้อมูล ---");
// ดึงออบเจกต์โฟลเดอร์
var sourceFolder = DriveApp.getFolderById(SOURCE_FOLDER_ID);
var backupFolder = DriveApp.getFolderById(BACKUP_FOLDER_ID);
// เริ่มกระบวนการคัดลอกแบบ Recursive
copyFolderContents(sourceFolder, backupFolder);
Logger.log("--- สำรองข้อมูลเสร็จสิ้น ---");
}
/**
* ฟังก์ชันหลักที่ทำงานแบบ Recursive (ทำงานซ้ำในโฟลเดอร์ย่อย)
* @param {Folder} sourceFolder - โฟลเดอร์ต้นทาง
* @param {Folder} targetFolder - โฟลเดอร์ปลายทาง
*/
function copyFolderContents(sourceFolder, targetFolder) {
// --- 1. คัดลอกไฟล์ (Files) ---
var files = sourceFolder.getFiles();
while (files.hasNext()) {
var file = files.next();
// ตรวจสอบว่ามีไฟล์ชื่อนี้ในปลายทางหรือยัง
var existingFiles = targetFolder.getFilesByName(file.getName());
if (!existingFiles.hasNext()) {
// ถ้าไม่มี -> คัดลอกไฟล์ใหม่
file.makeCopy(targetFolder);
Logger.log("COPIED (New): " + file.getName());
} else {
// ถ้ามี -> ตรวจสอบวันที่
var existingFile = existingFiles.next();
if (file.getLastUpdated() > existingFile.getLastUpdated()) {
// ถ้าต้นทางใหม่กว่า -> ลบของเก่า, คัดลอกของใหม่
existingFile.setTrashed(true); // ย้ายไปถังขยะ
file.makeCopy(targetFolder);
Logger.log("UPDATED (Modified): " + file.getName());
} else {
// ถ้าเท่ากันหรือเก่ากว่า -> ไม่ต้องทำอะไร
// Logger.log("SKIPPED (No change): " + file.getName());
}
}
}
// --- 2. คัดลอกโฟลเดอร์ย่อย (Folders) ---
var folders = sourceFolder.getFolders();
while (folders.hasNext()) {
var subFolder = folders.next();
// ตรวจสอบว่ามีโฟลเดอร์ชื่อนี้ในปลายทางหรือยัง
var targetSubFolder;
var existingFolders = targetFolder.getFoldersByName(subFolder.getName());
if (!existingFolders.hasNext()) {
// ถ้าไม่มี -> สร้างโฟลเดอร์ใหม่
targetSubFolder = targetFolder.createFolder(subFolder.getName());
Logger.log("CREATED FOLDER: " + subFolder.getName());
} else {
// ถ้ามี -> ใช้โฟลเดอร์เดิม
targetSubFolder = existingFolders.next();
}
// --- นี่คือหัวใจของ Recursive ---
// เรียกใช้ฟังก์ชันนี้ซ้ำ โดยใช้โฟลเดอร์ย่อยเป็นพารามิเตอร์
copyFolderContents(subFolder, targetSubFolder);
}
}
ขั้นตอนที่ 4: แก้ไขโค้ด (ใส่ ID ของคุณ)
ใน 2 บรรทัดแรกของโค้ด:
JavaScript
var SOURCE_FOLDER_ID = "YOUR_SOURCE_FOLDER_ID";
var BACKUP_FOLDER_ID = "YOUR_BACKUP_FOLDER_ID";
ให้แทนที่ YOUR_..._ID ด้วย Folder ID จริงๆ ที่คุณคัดลอกมาจากขั้นตอนที่ 1
ขั้นตอนที่ 5: ทดสอบและให้สิทธิ์ (Run & Authorize)
- ตรวจสอบว่าคุณเลือกฟังก์ชัน
startBackupในแถบเมนู (ที่อยู่ข้างๆ “Debug”) - คลิกปุ่ม “Run” (ปุ่มสามเหลี่ยม)
- ครั้งแรกเท่านั้น: Google จะเด้งหน้าต่าง “Authorization required” (ต้องการสิทธิ์)
- คลิก “Review permissions” (ตรวจสอบสิทธิ์)
- เลือกบัญชี Google ของคุณ
- คุณจะเจอหน้า “Google hasn’t verified this app” (ไม่ปลอดภัย) ไม่ต้องตกใจ! นี่เป็นเรื่องปกติเพราะคุณเป็นคนเขียนสคริปต์นี้เอง
- คลิกที่ “Advanced” (ขั้นสูง)
- คลิกที่ “Go to [ชื่อโปรเจกต์ของคุณ] (unsafe)”
- คลิก “Allow” (อนุญาต) เพื่อให้สิทธิ์สคริปต์ในการจัดการไฟล์ Google Drive ของคุณ
สคริปต์จะเริ่มทำงาน คุณสามารถดูผลลัพธ์ได้ใน “Execution log” (บันทึกการทำงาน) ที่ด้านล่าง
ขั้นตอนที่ 6: ตั้งเวลาอัตโนมัติ (Triggers)
นี่คือขั้นตอนที่ทำให้มันเป็น “อัตโนมัติ”
- ในหน้า Apps Script ให้มองไปที่เมนูด้านซ้าย คลิกที่ “Triggers” (ไอคอนรูปนาฬิกาปลุก)
- คลิกปุ่ม “Add Trigger” (เพิ่มทริกเกอร์) ที่มุมขวาล่าง
- ตั้งค่าดังนี้:
- Choose which function to run:
startBackup(ฟังก์ชันที่เราสร้าง) - Choose which deployment should run:
Head - Select event source:
Time-driven(ขับเคลื่อนด้วยเวลา) - Select type of time-based trigger:
Day timer(ทริกเกอร์รายวัน) - Select time of day: เลือกเวลาที่คุณต้องการให้มันทำงาน (เช่น
Midnight to 1 a.m.– ช่วงเที่ยงคืนถึงตีหนึ่ง)
- Choose which function to run:
- คลิก “Save”
เสร็จสิ้น!
เพียงเท่านี้ คุณก็ได้สร้าง “AI” ส่วนตัวที่คอยสำรองไฟล์ให้คุณทุกวันในช่วงเวลาที่คุณกำหนดไว้เรียบร้อยแล้ว แม้คุณจะปิดคอมพิวเตอร์ไปแล้ว สคริปต์นี้ก็จะยังคงทำงานบนเซิร์ฟเวอร์ของ Google ต่อไป ทำให้คุณอุ่นใจได้ว่าไฟล์สำคัญของคุณจะมีสำเนาเก็บไว้เสมอ



