2

getEditors を使用してスプレッドシートの編集者のリストを取得しましたが、返されたリストには共有ドライブのユーザーが含まれています。ただし、共有ドライブへの「コンテンツ マネージャー」アクセス権を持つユーザーはリストに含まれません。これが事実である理由は何ですか?

また、getAccess を使用して、特定のユーザーがドライブ フォルダーに対して持つアクセスの種類を取得できることもわかりました。このアプローチを使用して、私の目的は、FILE_ORGANIZER または ORGANIZER 権限を持つすべてのユーザーを識別することです。アクセス許可に関する公式ドキュメントを参照してください。この情報を取得するために if ステートメントまたはループを使用することは可能ですか?

または、私が考えていなかったかもしれない共有ドライブへのアクセス権を持つすべてのユーザーのリストを取得するための回避策はありますか?

PS: 高度なドライブ サービスが有効になっていません。

// This code aims to protect a sheet in a spreadsheet 
// by granting specific users access (super users) 
// and revoking the access of any other user that can edit the spreadsheet. 

/*
Attempted approach:

user1 and user2 have manager permission to the shared drive as a whole
user3 has content manager permission to the shared drive as a whole
user4 only has access to this spreadsheet in the shared drive

My objective is to ensure that only users 1 and 2 can edit the protected sheet.

Result:
Log shows that users 1 and 2 have access and user 4 does not.
However, user3 can still edit the sheet because they were no included in the getEditors() result hence their access could not be revoked. 
*/

function protectASheet() {
  var superusers = ['user1', 'user2'];
  var ss = SpreadsheetApp.getActive();
  var editors = ss.getEditors(); //get file editors
  var sheet = SpreadsheetApp.getActive().getSheetByName('TestSheet');

  //Set protection  
  var protection = sheet.protect().setDescription('This sheet is protected.');

  protection.addEditors(superusers); //Grant superusers edit permission
  protection.removeEditors(editors); //Revoke other file editors' permission

  Logger.log("Only the following can edit " + sheet.getSheetName() + ": " + protection.getEditors());


}

4

1 に答える 1

2

同僚に助けてもらいました。このアプローチは、スクリプト エディターでアクティブ化されている高度なドライブ サービスに依存しています。オンにするには、[リソース] -> [高度な Google サービス] に移動します。

例外なく、ファイルまたはフォルダーへのあらゆる形式のアクセス権を持つすべてのユーザーのアクセス許可とその他の詳細をフェッチします。

以下のコード:

function getPermissionsList() {
  const fileId = "<FILE, FOLDER OR SHARED DRIVE ID HERE>"; // ID of your shared drive

  // THIS IS IMPORTANT! The default value is false, so the call won't 
  // work with shared drives unless you change this via optional arguments
  const args = {
    supportsAllDrives: true
  };

  // Use advanced service to get the permissions list for the shared drive
  let pList = Drive.Permissions.list(fileId, args);

  //Put email and role in an array
  let editors = pList.items;
  var arr = [];

  for (var i = 0; i < editors.length; i++) {
    let email = editors[i].emailAddress;
    let role = editors[i].role;

    arr.push([email, role]);

  }

  Logger.log(arr);

}

于 2020-10-06T12:14:33.780 に答える