- Lấy thông tin file nằm ở nhiều thư mục khác nhau
- Lấy thông tin file nằm cả ở thư mục mẹ và thư mục con
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu(‘Menu’)
.addItem(‘Lấy dữ liệu từ thư mục’, ‘layfile_trongthumuc’)
.addToUi();
}
function layfile_trongthumuc() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var dataSheet = spreadsheet.getSheetByName(‘DATA’);
// Kiểm tra nếu sheet DATA tồn tại
if (!dataSheet) {
SpreadsheetApp.getUi().alert(‘Không tìm thấy sheet có tên DATA’);
return;
}
// Lấy tất cả các ID thư mục từ cột B, bắt đầu từ dòng 2
var folderIds = dataSheet.getRange(‘B2:B’).getValues();
// Danh sách chứa dữ liệu để ghi vào sheet
var list = [];
var sttCounter = 1; // Khởi tạo số thứ tự ngoài hàm đệ quy
// Lặp qua từng ID thư mục
folderIds.forEach(function(row) {
var folderId = row[0];
// Kiểm tra nếu ID thư mục có giá trị hợp lệ
if (folderId) {
try {
var folder = DriveApp.getFolderById(folderId); // Lấy thư mục theo ID
sttCounter = processFolder(folder, list, sttCounter); // Gọi hàm đệ quy và truyền `sttCounter` để tiếp tục đếm
} catch (e) {
list.push([‘Lỗi: ‘ + e.message, ”, ”, ”, ”, ”, ”]); // Ghi lỗi nếu có
}
}
});
// Ghi dữ liệu vào sheet DATA, bắt đầu từ dòng 2
if (list.length > 0) {
dataSheet.getRange(2, 4, list.length, list[0].length).setValues(list); // Ghi vào cột D, E, F, G, H, I, J
// Sắp xếp dữ liệu theo cột I (Thời điểm tạo file) và cột FolderName (tên thư mục), giữ nguyên cột Số thứ tự
var lastRow = dataSheet.getLastRow(); // Lấy dòng cuối cùng có dữ liệu
// Chỉ sắp xếp từ cột E (tên thư mục) đến cột J (thời điểm chỉnh sửa), không bao gồm cột D (Số thứ tự)
dataSheet.getRange(2, 5, lastRow – 1, list[0].length – 1).sort([
{column: 5, ascending: true}, // Sắp xếp theo tên thư mục (cột E)
{column: 9, ascending: true} // Sau đó sắp xếp theo cột I (Thời điểm tạo file)
]);
} else {
SpreadsheetApp.getUi().alert(‘Không tìm thấy tệp nào trong các thư mục.’);
}
}
// Hàm đệ quy để duyệt qua các thư mục con và lấy thông tin file, đồng thời cập nhật số thứ tự
function processFolder(folder, list, sttCounter) {
var folderName = folder.getName(); // Lấy tên thư mục
var folderUrl = folder.getUrl(); // Lấy URL của thư mục
var files = folder.getFiles();
// Lấy thông tin về các tệp trong thư mục hiện tại
while (files.hasNext()) {
var file = files.next();
var createdDate = file.getDateCreated(); // Lấy thời điểm tạo file
var lastUpdatedDate = file.getLastUpdated(); // Lấy thời điểm chỉnh sửa file gần nhất
list.push([sttCounter++, folderName, folderUrl, file.getName(), file.getUrl(), createdDate, lastUpdatedDate]); // Đánh số thứ tự liên tục
}
// Lặp qua các thư mục con và gọi đệ quy
var subfolders = folder.getFolders();
while (subfolders.hasNext()) {
var subfolder = subfolders.next();
sttCounter = processFolder(subfolder, list, sttCounter); // Đệ quy để duyệt qua thư mục con, và cập nhật `sttCounter`
}
return sttCounter; // Trả lại giá trị `sttCounter` để tiếp tục tăng
}