見出し画像

Google ドライブ のファイルの権限移譲 / フォルダごとオーナー権限の移譲

ドライブ 内のファイルの権限を移譲していきたいと思います!

[0] まずは注意事項!

// ***********************************************
// *                                             *
// *   このプログラムを実行する前に、必ず以下を確認してください。  *
// *                                             *
// ***********************************************
//
// このプログラムには、以下のようなセキュリティ上の問題点があります。
//
// * スプレッドシートに保存されたIDやメールアドレスは、誤って設定された場合、権限を与えることができない人に誤って権限が付与される可能性があります。
// * プログラム内で直接メールアドレスを扱っているため、誤ってメールアドレスを公開した場合、スパムメールの対象になる可能性があります。
// * このプログラムを実行するためには、スクリプトを実行するアカウントにDrive APIのアクセス権限が必要です。誤ったアカウントで実行した場合、Drive内のファイルやフォルダを誤って削除する可能性があります。
// * このプログラムは、再帰的にフォルダとファイルを処理するため、処理するフォルダやファイルの数が多い場合は、Drive APIの利用制限に引っかかる可能性があります。
// * プログラム内で扱っているファイルやフォルダには、機密性の高い情報が含まれている可能性があります。プログラムを実行する前に、十分に検討し、実行する必要があります。
//
// ***********************************************

[1] 準備

下記の スプレッドシート のコピーを作成してください!

既に入っている スクリプト はこんな感じ!

1つ目は、

function delRows() {
  //スクリプトに紐づいたスプレッドシートのアクティブなシートを読み込み
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getSheetByName('権限移譲');
  //clearContentメソッドで複数行を削除
  var lastRow = sheet.getLastRow();
  var ui = SpreadsheetApp.getUi();
  var res = ui.alert('警告', 'このシートをクリアしていいですか?', ui.ButtonSet.YES_NO);
  if (res == ui.Button.YES) {
    sheet.getRange(2, 1, lastRow, 3).clearContent();
  }
}

function drive() {
  var ui = SpreadsheetApp.getUi();
  var res = ui.alert('警告', '一度共有を掛けるとキャンセルはできません。\n本当に良いですか?', ui.ButtonSet.YES_NO);
  if (res == ui.Button.YES) {
    // スプレッドシートを取得する
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = spreadsheet.getSheetByName('権限移譲');

    // 値を取得する
    var values = sheet.getDataRange().getValues();

    // 値を繰り返し処理する
    for (var i = 1; i < values.length; i++) {
      // ファイルを取得する
      var id = values[i][0];
      if (values[i][2] == 'owner') {
        // 権限を付与する
        var permission = {
          'role': 'writer',//編集権限付与
          'pendingOwner': true,//オーナー譲渡承認待ち状態にする
          'value': values[i][1],
          'type': 'user',//特定のユーザーに対して
        };
      } else if (values[i][2] == 'writer') {
        // 権限を付与(承認待ちの状態)
        var permission = {
          'role': 'writer',//編集権限付与
          'value': values[i][1],
          'type': 'user',//特定のユーザーに対して
        };
      } else if (values[i][2] == 'reader') {
        // 権限を付与(承認待ちの状態)
        var permission = {
          'role': 'reader',//編集権限付与
          'value': values[i][1],
          'type': 'user',//特定のユーザーに対して
        };
      }
      try {
        Drive.Permissions.insert(permission, id);
      } catch {
        var ui = SpreadsheetApp.getUi();
        res = ui.alert('この機能では、組織外の人にオーナー権限を移譲することはできません。');
      }
    }
  }
  var res = ui.alert('共有が完了しました。');
}

2つ目は、

function setPermissions(email, role, id) {
  var folder = DriveApp.getFolderById(id);
  var folders = folder.getFolders();
  // 自分がオーナーになっているファイルを取得する
  var files = folder.searchFiles("'me' in owners");

  // 権限を付与するためのオブジェクトを作成
  var permission = {
    'type': 'user',
    'value': email
  };
  // ユーザーの役割に応じて権限オブジェクトを更新
  if (role === 'owner') {
    permission['role'] = 'writer';
    permission['pendingOwner'] = true;
  } else if (role === 'writer') {
    permission['role'] = 'writer';
  } else {
    permission['role'] = 'reader';
  }

  // 各サブフォルダに権限を適用
  while (folders.hasNext()) {
    var subfolder = folders.next();
    id = subfolder.getId();
    Drive.Permissions.insert(permission, id);

    // 再帰的にサブフォルダを探索
    setPermissions(email, role, id);
  }

  // 各ファイルに権限を適用
  while (files.hasNext()) {
    var file = files.next();
    id = file.getId();
    var mime = file.getMimeType();
    // Googleアプリケーションのファイルであれば権限を設定
    if (mime.match(/google-apps/)) {
      Drive.Permissions.insert(permission, id);
    } else {
      // それ以外のファイルは無視
    }
  }
}

function drive2() {
  var ui = SpreadsheetApp.getUi();
  // 共有を開始する前に警告を表示
  var res = ui.alert('警告', '一度共有を掛けるとキャンセルはできません。\n本当に良いですか?', ui.ButtonSet.YES_NO);
  if (res == ui.Button.YES) {
    // スプレッドシートを取得
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = spreadsheet.getSheetByName('権限移譲');

    // スプレッドシートのデータを取得
    var data = sheet.getDataRange().getValues();

    // 各行のデータを処理
    for (var i = 1; i < data.length; i++) {
      // フォルダまたはファイルのID、メールアドレス、役割を取得
      var id = data[i][0];
      var email = data[i][1];
      var role = data[i][2];

      // フォルダまたはファイルに権限を設定
      setPermissions(email, role, id);
    }
  }
}

3つ目は、

function onOpen() {
  SpreadsheetApp.getActiveSpreadsheet().addMenu('実行メニュー', [
    { name: 'ファイルごと', functionName: 'drive' },
    { name: 'フォルダ内の全て', functionName: 'drive2' },
    { name: 'クリア', functionName: 'delRows' },
  ]);
}

[2] 権限の承認

この スプレッドシート は、特にプログラムを変更するようなことはなく使えます!

よって、まずは、メニュー.gs 実行▶️ の順にクリックしましょう!

先ほどと同じように、権限の承認プロセスがありますので、許可をしてください!

すると、スプレッドシート に 実行メニュー が用意されており、ファイルごとフォルダ内の全て のどちらかを実行すると権限の移譲ができます!

[4] 使い方

① ここに、権限を与えたいファイルまたはフォルダのIDをコピペする

② 権限を付与したい人の Google アカウント のアドレスを入力する

③ 与える権限の種類を選択する

この設定をした上で、実行メニュー から ファイルごと をクリックすることで、権限を与えることができるようになります!

ただし!これでは、フォルダ内の全てのファイルにオーナー権限を与えることはできません!!

この状態で、オーナー権限を与えてみようとしてみます。

この ID は、Google ドライブ のフォルダの ID にしてあります!

すると、、確かに指定したフォルダは、オーナー権限を与えようとしています。

ただし、その中身は?というと。
下記のように、編集権限は全て与えられているのですが….。

そのファイルを確認してみると、こんな感じでオーナー権限は付与できていないんです。

そのため、全てのファイルのオーナー権限を与えたい場合には、

  1. それらのファイルやフォルダを一つのフォルダにまとめる

  2. まとめたフォルダの ID を A列 にコピペする

  3. 権限を与える人のアドレスを B列 に入力し、C列 を owner にする

上記を満たしてから、フォルダ内の全て を実行してください!

これ、結構便利じゃないですか!?🤣
そもしも、手作業で、オーナー権限を与えようとしても、さっきうまくいかなかったように、一気には権限を与えることができないようになっているんですよね🤔

これを、上記の手順でやってみると….。

ちゃんとフォルダ内のファイルにオーナー権限を与えていますね!!!

ちなみに、そのフォルダ内のフォルダに入っているファイルも権限を与えています!

ぜひ活用してみてください!!

参考動画

Twitter

Facebook

ポートフォリオ

YouTube チャンネル

いちばんやさしい Google Apps Script


何かと0から1を作るのは大変だと思います。学校はどこも似たような問題課題に対応していると思います。それなのに、先生って自分だけで頑張ろうとするんですよね。ボクの資料やnoteが1になって、学校ごとの現状に合わせてカスタムしていただければと思います‼️