在辦理活動時,我們開放了一個 Google Drive 雲端資料夾,讓「知道連結的人」可以自由進入、建立子資料夾,並上傳自己的照片或檔案。
這樣的設計在活動初期運作良好,參與者能自由創建與整理資料夾。但活動結束後,主辦方希望後續資料能維持原樣,不再被修改或新增檔案。因此,我想實作一段自動化邏輯:
一開始我使用的程式碼,是針對 folder.getEditors()
的使用者做調整:
folder.removeEditor(editor);
folder.addViewer(editor);
但實際執行後,權限完全沒變。後來才理解——這種寫法只適用於明確設定為共用者的帳號,對於「Anyone with link」這種分享方式無效。
.setSharing()
來調整連結存取權限為了正確處理 link-based 權限,最後使用了 DriveApp.setSharing()
:
if (/#\(.+?\)/.test(name)) {
folder.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
} else {
folder.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.EDIT);
}
這段程式會:
#()
的資料夾降為「只能檢視」這段程式只針對第一層子資料夾執行權限調整:
function updateLinkSharingBasedOnName() {
var parentFolderId = '1iWli59WTQWSGEU2JSK1kHisCE5DTcnml';
var parent = DriveApp.getFolderById(parentFolderId);
var folders = parent.getFolders();
while (folders.hasNext()) {
var f = folders.next();
var name = f.getName();
if (/#\(.+?\)/.test(name)) {
f.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
} else {
f.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.EDIT);
}
}
}
問題情境 | 說明 |
---|---|
權限沒變 | .removeEditor() 無效於「任何知道連結的人」 |
需要遞迴 | 預設只處理一層,需額外實作遞迴邏輯 |
不想調整自己帳號權限 | 可加入 if (user.getEmail() !== Session.getActiveUser().getEmail()) 避免影響自己 |
請用 Google Apps Script 幫我掃描一個 Google Drive 資料夾的所有子資料夾,根據名稱是否包含 #() 來調整連結共用權限:含有的設為僅檢視,其餘設為可編輯。
這次遇到的問題讓我更理解 Google Drive 的權限機制,特別是「知道連結的使用者」與「明確設定的共用者」在程式控制上的差異。使用 .setSharing()
是處理這類狀況的關鍵。
如果你還有進階需求,例如:
這些都可以透過 Apps Script 繼續擴充。
function updateLinkSharingBasedOnName() {
var parentFolderId = '你的ID';
var parent = DriveApp.getFolderById(parentFolderId);
var folders = parent.getFolders();
while (folders.hasNext()) {
var f = folders.next();
var name = f.getName();
if (/#\(.+?\)/.test(name)) {
Logger.log(`📁 '${name}' → 改為「Anyone with link = VIEW」`);
f.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
} else {
Logger.log(`📁 '${name}' → 改為「Anyone with link = EDIT」`);
f.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.EDIT);
}
}
Logger.log('✅ 所有子資料夾權限已依名稱同步');
}