Google App Script 取 File ID
目的:
使用 Google Apps Script 匯出指定資料夾及其子資料夾中的所有檔案的檔名和 Google File ID,並將結果輸出到 Google Sheets。
Google App Script 建立
- 開啟 Google Sheets,然後點選
擴充功能
->Apps Script
。 - 此功能頁面可處理 App Scripts 建立於執行。
重點說明
Google Sheets
- YOUR_FOLDER_ID : 替換為您想要匯出檔案的來源資料夾 Google File ID。
- DIST_PATH : 替換為您想要匯出結果檔的目的雲端位置。以
/
分隔每一層資料夾。 - exportFilesToSheet():Main 函式,會創建 Google Sheets 並呼叫 listFilesInFolder() 來列出檔案。
- listFilesInFolder():遞迴函式抓取資料夾中的所有檔案以及子資料夾中的檔案,並將 Filename、File ID 和 URL 寫入 Google Sheets。
- getFormattedTimestamp() : 取得並格式化當前的日期與時間,格式為 YYYYMMDD-HHmm,並將其用在資料夾名稱中。
- DriveApp.getRootFolder() : API 用來取得「我的雲端硬碟」根目錄。
- getFoldersByName() : 依次取得輸出雲端 dist 資料夾。
儲存為 CSV
- 使用 Utilities.newBlob() 將 CSV 內容轉換成 Blob 格式。
- 使用 distFolder.createFile(csvBlob) 將生成的 CSV 檔案儲存至 dist 資料夾。
function go(){
exportFilesToSheet('YOUR_FOLDER_ID', 'DIST_PATH');
exportFilesToCSV('YOUR_FOLDER_ID', 'DIST_PATH');
}
function exportFilesToCSV(folderId, outputPath) {
// 設定要匯出檔案的根資料夾 ID
var folder = DriveApp.getFolderById(folderId);
// 取得目前的日期和時間,並格式化為 YYYYMMDD-HHmm
var timestamp = getFormattedTimestamp();
// 解析 outputPath,並定位到對應的資料夾
var outputFolder = getFolderByPath(outputPath);
// 生成 CSV 的內容
var csvContent = 'File Name,File ID,File URL\n'; // CSV 的表頭
// 開始遞迴抓取檔案並生成 CSV 內容
csvContent = generateCSVContent(folder, csvContent);
// 將 CSV 內容轉換為 Blob 格式
var csvBlob = Utilities.newBlob(csvContent, 'text/csv', 'File_Export_' + timestamp + '.csv');
// 確保 outputFolder 資料夾存在並儲存 CSV 檔案
try {
var file = outputFolder.createFile(csvBlob);
Logger.log('CSV File created successfully. File URL: ' + file.getUrl());
} catch (e) {
Logger.log('Error creating CSV file: ' + e.message);
}
}
function exportFilesToSheet(folderId, outputPath) {
// 設定要匯出檔案的根資料夾 ID
var folder = DriveApp.getFolderById(folderId);
// 取得目前的日期和時間,並格式化為 YYYYMMDD-HHmm
var timestamp = getFormattedTimestamp();
// 解析 outputPath,並定位到對應的資料夾
var outputFolder = getFolderByPath(outputPath);
// 建立一個新的 Google Sheet,並將時間戳記加到檔案名稱中
var sheetFileName = 'File_Export_' + timestamp;
var ss = SpreadsheetApp.create(sheetFileName);
// 把新建立的檔案移動到指定資料夾
var sheetFile = DriveApp.getFileById(ss.getId());
outputFolder.addFile(sheetFile);
DriveApp.getRootFolder().removeFile(sheetFile); // 移除根目錄中的檔案(只保留在指定資料夾中)
var sheet = ss.getActiveSheet();
// 設定標題
sheet.appendRow(['File Name', 'File ID', 'File URL']);
// 開始遞迴抓取檔案
listFilesInFolder(folder, sheet);
// 顯示 Google Sheet 的 URL
Logger.log('Google Sheet URL: ' + ss.getUrl());
}
function listFilesInFolder(folder, sheet) {
// 取得資料夾中的所有檔案
var files = folder.getFiles();
// 逐一處理每個檔案
while (files.hasNext()) {
var file = files.next();
sheet.appendRow([file.getName(), file.getId(), file.getUrl()]);
}
// 取得子資料夾並遞迴處理
var subfolders = folder.getFolders();
while (subfolders.hasNext()) {
var subfolder = subfolders.next();
listFilesInFolder(subfolder, sheet);
}
}
function generateCSVContent(folder, csvContent) {
// 取得資料夾中的所有檔案
var files = folder.getFiles();
// 逐一處理每個檔案並加入 CSV 內容
while (files.hasNext()) {
var file = files.next();
csvContent += file.getName() + ',' + file.getId() + ',' + file.getUrl() + '\n';
}
// 取得子資料夾並遞迴處理
var subfolders = folder.getFolders();
while (subfolders.hasNext()) {
var subfolder = subfolders.next();
generateCSVContent(subfolder, csvContent);
}
return csvContent;
}
function getFolderByPath(path) {
var folder = DriveApp.getRootFolder();
var pathArray = path.split('/');
Logger.log[pathArray];
// 逐層尋找資料夾
for (var i = 0; i < pathArray.length; i++) {
var folderName = pathArray[i];
var folders = folder.getFoldersByName(folderName);
Logger.log(folderName);
if (folders.hasNext()) {
folder = folders.next();
} else {
throw new Error('Folder not found: ' + folderName);
}
}
return folder;
}
function getFormattedTimestamp() {
var date = new Date();
// 取得年、月、日、時、分,並格式化
var year = date.getFullYear();
var month = ('0' + (date.getMonth() + 1)).slice(-2);
var day = ('0' + date.getDate()).slice(-2);
var hours = ('0' + date.getHours()).slice(-2);
var minutes = ('0' + date.getMinutes()).slice(-2);
// 回傳格式化後的時間戳記:YYYYMMDD-HHmm
return year + month + day + '-' + hours + minutes;
}