# 用Google Apps Script自動爬出雲端硬碟內特定資料夾檔案
###### tags: `Google` `Apps Script`
## 1. 建立一個新的Google Sheets
在上方工具列點選[擴充功能]>[Apps Script]進入Apps Script的編輯畫面

## 2. 編輯Apps Scripts程式碼
將下方程式碼貼上
```js=
//取得當前Apps Script所在的google sheet
let sheet = SpreadsheetApp.getActiveSheet();
//最上層資料夾ID,留空為搜尋整個雲端硬碟
let parentFolderId = '';
/**
* 主程式進入點
*/
function main() {
//新增標題列(如果標題列已存在可註解這行)
sheet.appendRow(['資料夾', '名稱', '類型', '連結網址', '擁有者']);
//撈取最上層資料夾的檔案
if (parentFolderId == '') {
getFiles(DriveApp.getRootFolder());
} else {
getFiles(DriveApp.getFolderById(parentFolderId));
}
//撈取子資料夾
getFolders(parentFolderId);
}
/**
* 取得資料夾底下所有檔案
* @param folder 資料夾id
* @param filter 檔案類型mimetype
*/
function getFiles(folder, filter = '') {
var files;
if (filter == '') {
files = folder.getFiles();
} else {
files = folder.getFilesByType(filter);
}
while (files.hasNext()) {
var file = files.next();
var mimeType = file.getMimeType();
var url = file.getUrl();
var name = file.getName();
//如果檔案類型為捷徑要找出真實類型
if (mimeType == 'application/vnd.google-apps.shortcut') {
var tFile = DriveApp.getFileById(file.getTargetId());
mimeType = tFile.getMimeType();
url = tFile.getUrl();
//如果真實類型為資料夾,再列出資料夾內檔案
if (mimeType == 'application/vnd.google-apps.folder') {
mimeType = '資料夾';
getFolders(file.getTargetId());
}
}
else {
mimeType = file.getMimeType();
}
//取得檔案擁有者
var owner = file.getOwner().getEmail();
if (file.getTargetId() != null) {
owner = DriveApp.getFileById(file.getTargetId()).getOwner().getEmail();
}
sheet.appendRow([getParentFolder(file), name, mimeType, url, owner]);
}
}
/**
* 取得資料夾底下的所有資料夾
* @param tFolderID 目標資料夾id
*/
function getFolders(tFolderID = '') {
var folderList;
if (tFolderID.length > 0) {
folderList = DriveApp.getFolderById(tFolderID).getFolders();
} else {
folderList = DriveApp.getFolders();
}
while (folderList.hasNext()) {
var folder = folderList.next();
var folderName = getParentFolder(folder);
var owner = folder.getOwner().getEmail();
sheet.appendRow([folderName, folder.getName(), '資料夾', folder.getUrl(), owner]);
//找出其他子資料夾
if (folder.getFolders().hasNext()) {
getFolders(folder.getId());
}
//找出檔案清單
if (folder.getFiles().hasNext()) {
getFiles(folder);
}
}
}
/**
* 找出上層資料夾的名稱
* @param target 目標
*/
function getParentFolder(target) {
var pName = '';
var parents = target.getParents();
while (parents.hasNext()) {
var parent = parents.next();
pName = parent.getName() + '\\' + pName;
if (parent.getParents().hasNext()) {
pName = getParentFolder(parent) + pName;
}
}
return pName;
}
```
## 3. 執行Apps Scripts

## 4. 檢視成果

## 參考資料
1. https://developers.google.com/apps-script/reference/drive/file
2. https://developers.google.com/apps-script/reference/base/mime-type