Hướng dẫn copy dữ liệu Google Drive thông qua Google Apps Script
Google Drive là một dịch vụ lưu trữ đám mây phổ biến, đặc biệt ở Việt Nam. Đa số người dùng sử dụng nó để lưu trữ dữ liệu trực tuyến. Tuy nhiên, nhiều người gặp khó khăn khi muốn sao chép một thư mục trên Google Drive. Dịch vụ này không hỗ trợ chức năng sao chép trực tiếp, vì vậy người dùng phải sử dụng một công cụ bên thứ ba. Một số người lo ngại về việc bảo mật khi sử dụng công cụ không được cung cấp bởi Google.
Nếu bạn đang đọc bài viết này, bạn có thể tự tạo một công cụ sao chép thư mục trên Google Drive và đảm bảo rằng tài khoản Google của bạn sẽ được bảo vệ an toàn. Đó là một tin vui đúng không? Vậy hãy bắt đầu thực hiện nhé.
Ưu điểm
Các công cụ cần thiết để tạo công cụ sao chép này bao gồm Google App Script và Script. Có một số ưu điểm của công cụ này bao gồm khả năng chạy trên Drive Team, không sao chép những tệp đã có trong thư mục, và giúp người dùng tiếp tục sao chép thêm 750GB/ngày mà không cần lo lắng về việc sao chép những tệp đã được sao chép trước đó. Ngoài ra, công cụ này còn giúp người dùng yên tâm về việc bảo mật.
Nhược điểm
App Script chỉ có thể chạy được trong 6 phút đối với tài khoản Gmail và 30 phút đối với tài khoản Google Workspace. Ngoài ra, tệp log của công cụ này cũng có thể ảnh hưởng đến thẩm mỹ của tài khoản Google của người dùng.
Thông tin và tác giả phát triển
Đoạn mã script gốc này được lấy từ trang Labnol. Sau đó đã được xào nấu lại.
/*
Author: Lê Văn Đông - www.levandong.com
Refer: https://www.labnol.org/code/19979-copy-folders-drive
*/
function main() {
let src = "https://drive.google.com/drive/folders/ID";
let des = "https://drive.google.com/drive/folders/ID";
src = src.match(/(?<=folders\/).*?((?=\?)|$)/g)[0].toString();
des = des.match(/(?<=folders\/).*?((?=\?)|$)/g)[0].toString();
start(src, des);
}
//Preprocess the copy.
function start(sourceFolderID, targetFolder) {
var source = DriveApp.getFolderById(sourceFolderID);
var name = source.getName();
var target = null;
var sheet_id = initSheet(targetFolder); // get ID of Sheet LOG!
var sheet_name = getsheetName(sheet_id); // get Sheet name
//If user do not input destination folder ID, create a new folder in root folder My Drive.
//Else, the script goes to the destination folder.
if (targetFolder == "") {
Logger.log("Create folder" + name);
targetFolder = "Copy of " + name;
target = DriveApp.createFolder(targetFolder);
}
else {
console.log("Go to target folder");
target = DriveApp.getFolderById(targetFolder);
}
if (getStatusAutoResume(target) == 0) { // Status auto resume is turn off.
Logger.log("Set up trigger.");
setupAutoResume(target, 1); // turn on auto resume.
setupTrigger(); // Create trigger.
}
else {
Logger.log("Skip set up trigger");
}
try {
copyFolder(source, target, sheet_id, sheet_name);
}
catch (e) {
Logger.log("Sending email Error");
sendMail(e);
deleteTrigger(); // delete trigger when this script has an issue.
setupAutoResume(target, 0); // Turn off auto resume.
return;
}
Logger.log("Done. Delete triggers. Turn off Auto Resume. Sending email notification.");
deleteTrigger();// Finish copy;
sendEmailComplete(target.getUrl());
}
function copyFolder(source, target, sheet_id, sheetName) {
//Folder copy incomplete
//Change the symbol at target folder (Folder don't already copy)
var ispecialFolders = target.searchFolders('title contains \"chuacopyxong\"');
while (ispecialFolders.hasNext()) {
var folder = ispecialFolders.next();
var name = folder.getName().split("chuacopyxong ")[1];
//Find same folder in source
var ifolderInSource = source.getFoldersByName(name); // itor
while (ifolderInSource.hasNext()) { // has a
Logger.log("Go to: " + name);
copyFolder(ifolderInSource.next(), folder, sheet_id, sheetName); // copy
folder.setName(name); // Done in folder. Set name again.
}
}
//Copy normal
Logger.log("Scan source Folder: " + source.getName());
var srcSubfolders = getAllNameItemsInFolder(source, isFolder = 1);
var srcFiles = getAllNameItemsInFolder(source);
Logger.log("Scan des Folder: " + target.getName());
var desSubfolders = getAllNameItemsInFolder(target, isFolder = 1);
var desFiles = getAllNameItemsInFolder(target);
var diffFolders = srcSubfolders.filter(x => !desSubfolders.includes(x));
var diffFiles = srcFiles.filter(x => !desFiles.includes(x));
for (var j = 0; j < diffFiles.length; j++) {
var files = source.getFilesByName(diffFiles[j]);
//Copy files
if (files.hasNext()) {
var file = files.next();
var name = file.getName();
console.log("Make copy file: " + name);
file.makeCopy(name, target);
appendRow(sheet_id, [getTimeNow(), name, file.getSize()], sheetName);
}
}
for (var j = 0; j < diffFolders.length; j++) {
var folders = source.getFoldersByName(diffFolders[j]);
//Copy Folder
if (folders.hasNext()) {
var folder = folders.next();
var name = folder.getName();
Logger.log("Create folder: " + name);
appendRow(sheet_id, [getTimeNow(), "Create Folder " + name], sheetName);
var targetSub = target.createFolder("chuacopyxong " + name);
copyFolder(folder, targetSub, sheet_id, sheetName);
targetSub.setName(name);
}
}
}
Hướng dẫn sử dụng
Để sử dụng script này, bạn cần thay thế src và des bằng ID của thư mục nguồn và thư mục đích tương ứng. Sau đó, bạn chỉ cần nhấn “Run” để thực hiện chức năng sao chép.
Tính năng bổ sung
- Auto Resume: Tính năng này cho phép tiến trình sao chép file được tự động tiếp tục nếu bị gián đoạn hoặc dừng lại do lý do nào đó, giúp tiết kiệm thời gian và tăng tính ổn định của quá trình sao chép.
- Send an email notification when the copy is done or has an issue: Tính năng này cho phép gửi email thông báo khi quá trình sao chép hoàn tất hoặc gặp vấn đề. Điều này giúp người dùng biết được kết quả của quá trình sao chép một cách nhanh chóng và thuận tiện.
- Create a log sheet to monitor: Tính năng này cho phép tạo một bảng ghi để giám sát quá trình sao chép file. Bảng ghi này sẽ lưu lại thông tin về thời gian bắt đầu, thời gian kết thúc, tên file, dung lượng và kết quả của quá trình sao chép. Việc sử dụng tính năng này giúp người dùng có thể theo dõi và phân tích quá trình sao chép một cách hiệu quả, từ đó có thể tối ưu hóa quá trình sao chép trong tương lai.
Lưu ý
- Bạn chỉ có thể sao chép tối đa 750GB/ngày.
- Bạn cần truy cập link được share trước để tài khoản của bạn được cấp quyền truy cập vào thư mục.
- Có một số người dùng gặp phải lỗi “Drive Limit Exceed”. Lỗi này xảy ra khi bạn đã copy quá 750GB/ngày hoặc Shared Drive của bạn có vấn đề, cần tạo mới cái khác là được.
- Limit Exceeded: Ổ đĩa: Đã vượt quá hạn ngạch. Vui lòng chạy lại tập lệnh sau 24 giờ.
- Copy script file: Không thể sao chép tệp tập lệnh vào thư mục đích. Tập lệnh luôn được sao chép vào thư mục gốc.
Chia sẻ: Lê Văn Đông