GASを使ってGoogle Drive内のフォルダ、ファイルの権限をチェックする


DevRel/Asia 2020というカンファレンスを企画、推進しています。

DevRel/Asia 2020

アジア9カ国/地域の主催者たちと一緒に行っているのですが、データの管理はGoogle Driveで行っています。基本的に最初のディレクトリに全員書き込み権限ありで追加しているだけなのですが、人の入れ替わりなどもあって、だんだんと管理が煩雑になってきました。

そこで、特定のフォルダ以下の権限状態がどうなっているのかチェックするGoogle Apps Scriptを書いてみました。Drive Permissions AuditorとかWhoHasAccess.commorimorihoge/google-drive-permission-search: Search Google Drive's permissionDriveCheckerなどがあるっぽいんですが、Google Drive全体がやりたい訳でもないし、お金払うほどでもないし(コミュニティイベントだし)、google-drive-permission-searchは動かないし…。

コードはこんな感じ。フォルダを取得して権限チェックして、フォルダも同じようにチェックして…って感じでたいしたことはしていないです。

function permissionCheker(prefix = null, id = '1mK...AdH') {
  // 出力先のシート
  const sheet = SpreadsheetApp.getActive().getSheetByName('Files');
  // フォルダを取得
  const folder = DriveApp.getFolderById(id);
  // ファイルだけ取得
  const files = folder.getFiles();
  // 順番にチェック
  while (files.hasNext()) {
    writeRow(sheet, prefix, files.next());
  }
  // 中にあるフォルダを取得
  const folders = folder.getFolders();
  // 順番にチェック
  while (folders.hasNext()) {
    // フォルダを取得
    const sub = folders.next();
    writeRow(sheet, prefix, sub);
    // 再帰的に実行
    permissionCheker(`${prefix || ""}/${folder.getName()}/${sub.getName()}`, sub.getId());
  }
}

function writeRow(sheet, prefix, obj) {
  let rowIndex = sheet.getLastRow() + 1;
  // フォルダパスを出力
  sheet.getRange(rowIndex, 1).setValue(prefix ? `${prefix}/${obj.getName()}` : '');
  // ファイル名を出力
  sheet.getRange(rowIndex, 2).setValue(obj.getName());
  // 権限を持った人たちをリストアップ
  const editors = obj.getEditors();
  if (editors.length === 0) return;

  // 権限を持った人数を出力
  sheet.getRange(rowIndex, 3).setValue(editors.length);
  // 権限を持った人の名前を出力
  sheet.getRange(rowIndex, 4).setValue(editors.map(a => a.getName()).join(","));  
}

今回の目的ではとりあえず人数さえ分かっていればだいたい判断ができて、もし削除し忘れた人がいてもスプレッドシートの検索でどうにかなるので、こんな感じで十分でした。

主催者は一覧で管理しているので、権限の付与や剥奪についてもGoogle Apps Scriptでやれば楽そうだなって感じました。