iT邦幫忙

1

📁 Google Drive 子資料夾權限控管自動化:用 Apps Script 精準調整共用設定

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20250806/20155103LABSYTtdHh.png

✨ 專案緣由:從開放雲端到後續控管的需求

在辦理活動時,我們開放了一個 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()) 避免影響自己

🤖 想問 GPT 的建議 Prompt

請用 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('✅ 所有子資料夾權限已依名稱同步');
}


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言