【问题标题】:How can I reset permissions for Google Drive (Folders, subfolders and files)?如何重置 Google Drive(文件夹、子文件夹和文件)的权限?
【发布时间】:2021-10-14 08:40:18
【问题描述】:

我想将所有文件和文件夹权限重置为“受限”。在整个驱动器上。

谷歌驱动器上的权限不会级联,因此从父文件夹中删除它们不会在子文件夹和文件中删除它们。而且我有大量的文件和文件夹。

我发现了一个带有脚本的过时帖子,但“Uiapp”功能已被弃用(评论中有人说它可能会删除一些文件,所以不是我真正想要的)

这是类似内容的过时帖子(不再工作):https://webapps.stackexchange.com/questions/37592/how-do-i-reset-permissions-for-google-drive-documents-in-all-subfolders

【问题讨论】:

  • 我能问一下您想将权限更改为“受限”的文件和文件夹的大致数量吗?在您的情况下,目标是根文件夹下的所有文件和文件夹?或者,目标是特定文件夹下的所有文件和文件夹?
  • 根文件夹下的所有文件和文件夹。我会说大约 60k 文件和 15k 文件夹
  • 感谢您的回复。我有4个问题。 1.关于"restricted"你所期望的,这种情况下,当一个文件与其他用户共享时,你会怎么做? 2.当文件的所有者不是你时,你会怎么做? 3.在您的情况下,共享云端硬盘怎么样? 4. 在您​​的标签中,包含google-apps-script。在您的情况下,使用 Google Apps 脚本?如果是这样,您能提供您当前的脚本吗?
  • 1- Restricted 如“所有驱动器都是私有的”,没有任何共享,文件和文件夹只能由驱动器所有者(文件所有者)看到。 2- 我是驱动器上每个文件的所有者 3- 我不关心共享驱动器 4- 我使用了google-apps-script,因为从以前的线程中我看到了人们是如何做到的。我的问题中有一个链接,其中包含一个带有已弃用功能的旧线程。我也不确定它是否正是我所需要的。旧脚本在这里:webapps.stackexchange.com/questions/37592/…
  • 感谢您的回复。现在我注意到已经发布了答案。在这种情况下,我想尊重现有的答案。它将解决您的问题。

标签: google-apps-script google-drive-api


【解决方案1】:

答案:

您可以使用 Drive API 检索所有文件,然后循环访问它们,将权限设置为 PRIVATE

更多信息:

这里最棘手的部分是您拥有的文件数量无疑意味着脚本执行时间将远远超过 Apps 脚本限制。但是,您可以通过最初存储所有文件 ID 然后循环遍历它们来解决此问题,从上次执行时中断的地方继续。

代码:

由于 Drive API 比内置的 DriveApp 更快,我将在我的示例中使用它。确保在运行前启用 Drive Advanced Service。

function getAllFileIds() {
  const fileIds = []
  let files = Drive.Files.list({
    pageSize: 1000
  })

  while (files.nextPageToken) {
    console.log(files.nextPageToken)
    fileIds.push(...files.items.map(x => x.id))
    files = Drive.Files.list({
      pageSize: 1000,
      pageToken: files.nextPageToken
    })
  }
  fileIds.push(...files.items.map(x => x.id))

  const ss = SpreadsheetApp.create("Files List")
  const sheet = ss.getSheetByName("Sheet1")
  sheet.getRange(1, 1, fileIds.length, 1).setValues(fileIds.map(x => [x]))
  
  PropertiesService.getScriptProperties().setProperty("sheet", ss.getId())
}

function changePermissions() {
  const props = PropertiesService.getScriptProperties()
  const sheet = SpreadsheetApp.openById(props.getProperty("sheet")).getSheetByName("Files List")

  let ids

  const curr = parseInt(props.getProperty("index"))
  if (curr) {
    ids = sheet.getRange(curr, 1, sheet.getLastRow() - curr, 1).getValues().flat(2)
  }
  else {
    ids = sheet.getDataRange().getValues().flat(2)
  }

  ids.forEach(function(id, index) {
    try {
      console.log(id)
      DriveApp.getFileById(id).setSharing(DriveApp.Access.PRIVATE, DriveApp.Permission.VIEW)
    }
    catch(e) {
      console.info(e)
    }
    props.setProperty("index", index + 1)
  })
}

这个想法是这样的:

  • 运行函数getAllFileIds()。这将:
  • 使用 Drive API 一次检索最多 1000 个文件并将其所有 ID 添加到数组中。
  • 创建一个电子表格以保存所有 ID。
  • 将电子表格 ID 保存到脚本的属性中以供以后访问。

我选择记录每个 nextPageToken,以便您可以看到它运行 - 我的云端硬盘中有大约 16,800 个文件和文件夹,此功能需要一分钟左右才能运行。

然后,您可以运行函数changePermissions()。这将:

  • 检查脚本的属性以获取电子表格的 ID 和已完成行数的索引
  • 打开电子表格
  • 如果存在已保存的 index 值,则脚本将从上次停止的位置开始
  • 如果没有保存的index值,脚本从列表的开头开始
  • 按 ID 循环遍历每个文件并将访问权限设置为 PRIVATE
  • 每次更改权限时,新索引都会保存到脚本属性中。

您必须多次运行此程序。我建议创建一个基于时间的触发器,以便函数多次运行而无需手动重新运行。您可以在this answer 中找到相关说明。

注意:Gmail 帐户的 Apps 脚本执行时间限制为 6 分钟,商业/企业帐户为 30 分钟。请在设置可安装触发器时牢记这一点,以免各个脚本执行重叠。

参考资料:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 2014-09-28
    • 2011-05-15
    相关资源
    最近更新 更多