如何重置 Google 云端硬盘(文件夹、子文件夹和文件)的权限?

Mk1*_*Mk1 0 google-apps-script google-drive-api

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

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

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

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

Raf*_*rmo 5

回答:

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

更多信息:

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

代码:

由于 Drive API 比内置 API 更快DriveApp,因此我将在示例中使用它。运行前请确保启用驱动器高级服务。

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

  while (files.nextPageToken) {
    console.log(files.nextPageToken)
    fileIds.push(...files.files.map(x => x.id))
    files = Drive.Files.list({
      pageSize: 1000,
      pageToken: files.nextPageToken
    })
  }
  fileIds.push(...files.files.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)
  })
}
Run Code Online (Sandbox Code Playgroud)

这个想法是这样的:

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

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

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

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

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

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

参考: