【问题标题】:Google apps script Permissions on created file in shared folderGoogle 应用程序脚本对共享文件夹中创建的文件的权限
【发布时间】:2015-04-09 07:25:18
【问题描述】:

我有一个脚本可以在共享的 Google Drive 文件夹中创建一个文件,这是脚本:

  var spr = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Klantenlijst'); 
  var data = spr.getDataRange().getValues(); 
  var klanNumbers = data; //some var declared before this piece of code
  var file = DriveApp.createFile(fileName, JSON.stringify(klanNumbers));

此文件需要经常更新,为此我删除现有文件并创建一个新文件来替换它(使用新数据)。问题是当我尝试以文件所有者以外的用户身份执行setTrashed 操作时,会弹出此错误:

您无权执行该操作。

关于如何解决这个问题的任何想法? :)

谢谢!

编辑:我可以与其他用户手动删除驱动器中的文件。 我看过this 的文章,但我完全不同意这个问题“过于本地化”的结论。在 Google 上环顾四周,您会发现存在相同问题但没有合适解决方案的案例。

目前的解决方法:

  • 重命名文件
  • 将其移至另一个文件夹
  • 在旧文件夹中创建新文件

我不会删除这篇文章,所以人们可以在这里添加其他想法。

【问题讨论】:

  • 是的,你是对的。它不允许您将非所有者的文件丢弃。
  • WRT 手动删除文件(使用 GUI 删除文件):您实际上并没有在该文件上设置已删除标志,您正在拒绝共享权限。 (所有者仍将您视为协作者,但该文件不再对您可见,甚至在您的垃圾箱中也不可见。如果您有该文件的链接,例如在电子邮件中,您仍然可以访问它。)您可以尝试Advanced Drive Service 看看你是否可以删除你的共享权限。
  • 我正要写类似 mogsdad 的东西。最近没有测试过,但我很确定如果另一个编辑器删除了文件,它不像删除共享权限那么无害。我记得它还会从文件夹中删除文件,所有者只能在所有文件视图中找到它(或在根目录中,但我认为它是无根目录的)。

标签: google-apps-script permissions google-drive-api file-sharing


【解决方案1】:

您只能回收您拥有的文件。当您手动删除文件时(使用 GUI 删除文件),您似乎已经删除了文件,但实际上并没有在其上设置已删除标志。相反,您将其从您自己的 Google 云端硬盘的视图中删除,不会影响其他任何人。所有者仍会看到它与您共享,并且任何其他协作者不受影响。事实上,如果您按全名搜索文件,或使用“最近”文件列表等备用视图之一,或使用文件的 URL,您仍然可以看到该文件。

要从脚本中获得相同的效果,请使用removeFile()

这是一个实用程序,它可以对所有者和协作者区别对待文件,将其丢弃或删除。

/**
 * Remove the given file from view in the user's Drive.
 * If the user is the owner of the file, it will be trashed,
 * otherwise it will be removed from all of the users' folders
 * and their root. Refer to the comments on the removeFile()
 * method:
 *
 *   https://developers.google.com/apps-script/reference/drive/drive-app#removeFile(File)
 *
 * @param {File} file  File object to be trashed or removed.
 */
function deleteOrRemove( file ) {
  var myAccess = file.getAccess(Session.getActiveUser());
  if (myAccess == DriveApp.Permission.OWNER) {
    // If I own the file, trash it.
    file.setTrashed(true);
  }
  else {
    // If I don't own the file, remove it.
    var parents = file.getParents();
    while (parents.hasNext()) {
      // Remove the file from the current folder.
      parents.next().removeFile(file);
    }

    // Remove the given file from the root of the user's Drive.
    DriveApp.removeFile(file);
  }
}

例子:

function test_deleteOrRemove() {
  var files = DriveApp.getFilesByName('536998589.mp3');
  while (files.hasNext()) {
    var file = files.next();
    deleteOrRemove( file );
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多