GASを使ってスプレッドシートのアクセス権限をまとめて管理・変更(準備編)

スプレッドシートやドキュメントのファイルアクセス権を変更する際、一つ一つの共有設定を確認・変更する手間に悩んだことはありませんか?

特に大量のファイルがある場合、手作業での変更は時間がかかり効率が悪くなりがちです。

複数のファイルに対して権限を一括で管理できる方法があれば、作業時間を短縮することができます。

そこで、この記事ではGoogle Apps Scriptを使って、現在のスプレッドシートファイルのアクセス権を一覧化する方法をご紹介します。

ファイルの共有設定を簡単に確認でき、今後のアクセス権管理がより効率的になります。

スクリプトが2つに分かれるため、今回は各ファイルの現在のアクセス権表示までとし、一括変更については次回の記事でご紹介します。

目次

完成イメージ

現在のアクセス権(A~F列)

アクセス権の変更入力欄(G~M列)

  • 現在のアクセス権限の状況を一覧で表示
  • 権限の変更入力欄も今回のGASで作成

このスプレッドシートでは以下の内容が表示されます。

  • 各ファイルのフォルダ名
  • ファイル名
  • アクセス権
  • オーナーや閲覧者・編集者のメールアドレス

アクセス権の確認に加えて、次回の記事で実行する権限変更にも対応できるよう、変更用の入力欄も作成されます。

手順

STEP
スプレッドシートを開く

スプレッドシートを開きます。

(既存 or 新規ファイルのどちらも可)

項目も含めてGASで作成されるため、手入力は不要です。

  • 1行目の項目はGASで入力
  • シート名「アクセス権管理」をGASで新規作成
STEP
GASエディタを開く

Googleスプレッドシートを開き、メニューの「拡張機能」から「Apps Script」をクリックしてGASエディタを開きます。

STEP
GASスクリプトの作成

function myFunction(){

}

が最初から入っているため、消去して以下のスクリプトを貼り付けます。

長いスクリプトですが、黒い画面の右上にコピーボタンがあります。

function listFilesAndManageAccess() {
  const ui = SpreadsheetApp.getUi();
  const response = ui.prompt(
    'フォルダを指定',
    '「ドライブ内すべて」と入力するか、フォルダ名またはフォルダIDを入力してください:',
    ui.ButtonSet.OK_CANCEL
  );

  if (response.getSelectedButton() == ui.Button.CANCEL) {
    ui.alert('操作がキャンセルされました。');
    return;
  }

  const input = response.getResponseText().trim();
  
  // 入力値が「ドライブ内すべて」の場合は全ファイルをリスト、それ以外はフォルダを指定
  if (input === 'ドライブ内すべて') {
    listAllFiles();
  } else {
    listFilesInFolder(input);
  }
}

function listAllFiles() {
  const sheet = setupSheet();
  const files = DriveApp.getFiles();
  let row = 2;

  while (files.hasNext()) {
    const file = files.next();
    appendFileDataToSheet(sheet, file, row);
    row++;
  }
}

function listFilesInFolder(folderNameOrId) {
  const sheet = setupSheet();
  let folder;
  
  try {
    folder = DriveApp.getFolderById(folderNameOrId);
  } catch (e) {
    const folders = DriveApp.getFoldersByName(folderNameOrId);
    if (folders.hasNext()) {
      folder = folders.next();
    } else {
      SpreadsheetApp.getUi().alert('フォルダが見つかりません。');
      return;
    }
  }
  
  const files = folder.getFiles();
  let row = 2;

  while (files.hasNext()) {
    const file = files.next();
    appendFileDataToSheet(sheet, file, row);
    row++;
  }
}

function setupSheet() {
  const sheetName = 'アクセス権管理';
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName) || SpreadsheetApp.getActiveSpreadsheet().insertSheet(sheetName);
  
  // シートを初期化
  sheet.clear();
  
  // ヘッダーを設定
  const headers = [
    'フォルダ名', 
    'ファイル名', 
    '現在の権限', 
    'オーナー', 
    '閲覧者\n(コメント可含む)', 
    '編集者', 
    '変更対象', 
    '変更後の権限', 
    '閲覧者 削除', 
    '編集者 削除', 
    '閲覧者 追加', 
    '編集者 追加', 
    'タイムスタンプ'
  ];
  
  sheet.appendRow(headers);
  const headerRange = sheet.getRange(1, 1, 1, headers.length);
  headerRange.setHorizontalAlignment('center');
  headerRange.setVerticalAlignment('middle');
  
  // ヘッダー色分け
  const greenHeadersRange = sheet.getRange(1, 1, 1, 6); // 明るい緑3を適用する範囲
  const orangeHeadersRange = sheet.getRange(1, 8, 1, 6); // 明るいオレンジ3を適用する範囲
  
  greenHeadersRange.setBackground('#B7E1CD'); // 明るい緑3
  orangeHeadersRange.setBackground('#FAD7AC'); // 明るいオレンジ3
  
  // 「変更後の権限」列にドロップダウンリストを設定
  const permissions = [
    'リンクを知っている人 (閲覧可)', 
    'リンクを知っている人 (コメント可)', 
    'リンクを知っている人 (編集可)', 
    '制限付き'
  ];
  const validation = SpreadsheetApp.newDataValidation().requireValueInList(permissions).build();
  sheet.getRange(2, 8, sheet.getMaxRows() - 1).setDataValidation(validation);
  
  return sheet;
}

function appendFileDataToSheet(sheet, file, row) {
  const folderName = getFolderName(file);
  const fileName = file.getName();
  const fileLink = file.getUrl();
  const currentPermission = translatePermission(file.getSharingAccess(), file.getSharingPermission());

  // データを追加(ファイル名にハイパーリンクを設定)
  sheet.getRange(row, 1).setValue(folderName);
  sheet.getRange(row, 2).setFormula(`=HYPERLINK("${fileLink}", "${fileName}")`);
  sheet.getRange(row, 3).setValue(currentPermission);
  
  // 各権限別のメンバー情報を取得し表示
  const viewers = file.getViewers().map(user => user.getEmail());
  const editors = file.getEditors().map(user => user.getEmail());
  
  // オーナーが存在しない場合に備えて安全に取得
  const owner = file.getOwner() ? file.getOwner().getEmail() : 'オーナーなし';

  // 各列に権限別のメンバー情報を出力
  sheet.getRange(row, 4).setValue(owner);
  sheet.getRange(row, 5).setValue(viewers.join(', ')); // 閲覧者(コメント可含む)
  sheet.getRange(row, 6).setValue(editors.join(', ')); // 編集者
  sheet.getRange(row, 7).insertCheckboxes(); // チェックボックスを追加
}

function getFolderName(file) {
  const parents = file.getParents();
  return parents.hasNext() ? parents.next().getName() : 'ルート';
}

// 権限の日本語表記を取得するヘルパー関数
function translatePermission(access, permission) {
  const accessMap = {
    [DriveApp.Access.ANYONE]: '誰でも',
    [DriveApp.Access.ANYONE_WITH_LINK]: 'リンクを知っている人',
    [DriveApp.Access.PRIVATE]: '制限付き'
  };
  const permissionMap = {
    [DriveApp.Permission.VIEW]: '閲覧可',
    [DriveApp.Permission.COMMENT]: 'コメント可',
    [DriveApp.Permission.EDIT]: '編集可'
  };

  // 制限付きの場合は、"制限付き"とだけ表示
  if (access === DriveApp.Access.PRIVATE) {
    return accessMap[access];
  } else {
    return `${accessMap[access] || '不明'} (${permissionMap[permission] || '不明'})`;
  }
}
スクリプトの説明
メイン関数:listFilesAndManageAccess()
function listFilesAndManageAccess() {
  const ui = SpreadsheetApp.getUi();
  const response = ui.prompt(
    'フォルダを指定',
    '「ドライブ内すべて」と入力するか、フォルダ名またはフォルダIDを入力してください:',
    ui.ButtonSet.OK_CANCEL
  );

  if (response.getSelectedButton() == ui.Button.CANCEL) {
    ui.alert('操作がキャンセルされました。');
    return;
  }

  const input = response.getResponseText().trim();
  
  // 入力値が「ドライブ内すべて」の場合は全ファイルをリスト、それ以外はフォルダを指定
  if (input === 'ドライブ内すべて') {
    listAllFiles();
  } else {
    listFilesInFolder(input);
  }
}
  • スクリプト実行時にポップアップが表示され、「ドライブ内すべて」または特定のフォルダ名やフォルダIDを指定できます。
  • この選択によって、次のステップでどの範囲のファイルを操作するかが決まります。
ドライブ全体のファイル一覧:listAllFiles()
function listAllFiles() {
  const sheet = setupSheet();
  const files = DriveApp.getFiles();
  let row = 2;

  while (files.hasNext()) {
    const file = files.next();
    appendFileDataToSheet(sheet, file, row);
    row++;
  }
}
  • Googleドライブ内のすべてのファイルを取得し、スプレッドシートに一覧表示するものです。
  • DriveApp.getFiles()を使用してドライブ内のすべてのファイルを取得し、結果を順番にスプレッドシートに書き込んでいきます。
特定フォルダ内のファイル一覧:listFilesInFolder()
function listFilesInFolder(folderNameOrId) {
  const sheet = setupSheet();
  let folder;
  
  try {
    folder = DriveApp.getFolderById(folderNameOrId);
  } catch (e) {
    const folders = DriveApp.getFoldersByName(folderNameOrId);
    if (folders.hasNext()) {
      folder = folders.next();
    } else {
      SpreadsheetApp.getUi().alert('フォルダが見つかりません。');
      return;
    }
  }
  
  const files = folder.getFiles();
  let row = 2;

  while (files.hasNext()) {
    const file = files.next();
    appendFileDataToSheet(sheet, file, row);
    row++;
  }
}
  • 指定したフォルダ内のファイルだけを取得して一覧化します。
  • フォルダ名またはフォルダIDで特定のフォルダを取得し、その中に含まれるファイルを順次スプレッドシートに書き込む処理を行います。
シートの初期設定:setupSheet()
function setupSheet() {
  const sheetName = 'アクセス権管理';
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName) || SpreadsheetApp.getActiveSpreadsheet().insertSheet(sheetName);
  
  // シートを初期化
  sheet.clear();
  
  // ヘッダーを設定
  const headers = [
    'フォルダ名', 
    'ファイル名', 
    '現在の権限', 
    'オーナー', 
    '閲覧者\n(コメント可含む)', 
    '編集者', 
    '変更対象', 
    '変更後の権限', 
    '閲覧者 削除', 
    '編集者 削除', 
    '閲覧者 追加', 
    '編集者 追加', 
    'タイムスタンプ'
  ];
  
  sheet.appendRow(headers);
  const headerRange = sheet.getRange(1, 1, 1, headers.length);
  headerRange.setHorizontalAlignment('center');
  headerRange.setVerticalAlignment('middle');
  
  // ヘッダー色分け
  const greenHeadersRange = sheet.getRange(1, 1, 1, 6); // 明るい緑3を適用する範囲
  const orangeHeadersRange = sheet.getRange(1, 8, 1, 6); // 明るいオレンジ3を適用する範囲
  
  greenHeadersRange.setBackground('#B7E1CD'); // 明るい緑3
  orangeHeadersRange.setBackground('#FAD7AC'); // 明るいオレンジ3
  
  // 「変更後の権限」列にドロップダウンリストを設定
  const permissions = [
    'リンクを知っている人 (閲覧可)', 
    'リンクを知っている人 (コメント可)', 
    'リンクを知っている人 (編集可)', 
    '制限付き'
  ];
  const validation = SpreadsheetApp.newDataValidation().requireValueInList(permissions).build();
  sheet.getRange(2, 8, sheet.getMaxRows() - 1).setDataValidation(validation);
  
  return sheet;
}
  • 「アクセス権管理」というシートを作成または初期化し、アクセス権情報を書き込むための列を設定します。
  • また、各列には用途に応じて適切なヘッダーと色分けを施し、見やすい形で表示されます。
  • 「変更後の権限」列にはドロップダウンリストを設定し、次回の記事で紹介する変更操作に備えています。
ファイル情報のシートへの書き込み:appendFileDataToSheet()
function appendFileDataToSheet(sheet, file, row) {
  const folderName = getFolderName(file);
  const fileName = file.getName();
  const fileLink = file.getUrl();
  const currentPermission = translatePermission(file.getSharingAccess(), file.getSharingPermission());

  // データを追加(ファイル名にハイパーリンクを設定)
  sheet.getRange(row, 1).setValue(folderName);
  sheet.getRange(row, 2).setFormula(`=HYPERLINK("${fileLink}", "${fileName}")`);
  sheet.getRange(row, 3).setValue(currentPermission);
  
  // 各権限別のメンバー情報を取得し表示
  const viewers = file.getViewers().map(user => user.getEmail());
  const editors = file.getEditors().map(user => user.getEmail());
  
  // オーナーが存在しない場合に備えて安全に取得
  const owner = file.getOwner() ? file.getOwner().getEmail() : 'オーナーなし';

  // 各列に権限別のメンバー情報を出力
  sheet.getRange(row, 4).setValue(owner);
  sheet.getRange(row, 5).setValue(viewers.join(', ')); // 閲覧者(コメント可含む)
  sheet.getRange(row, 6).setValue(editors.join(', ')); // 編集者
  sheet.getRange(row, 7).insertCheckboxes(); // チェックボックスを追加
}
  • 取得したファイルの情報をスプレッドシートに書き込む処理を行います。
  • ファイル名、フォルダ名、オーナー、閲覧者、編集者などの情報を各列に表示します。
  • ファイル名をハイパーリンクとして出力し、クリックすることで直接そのファイルにアクセスできます。
ユーティリティ関数:getFolderName()translatePermission()
function getFolderName(file) {
  const parents = file.getParents();
  return parents.hasNext() ? parents.next().getName() : 'ルート';
}

  • getFolderName():ファイルがどのフォルダに含まれているかを取得し、ルートフォルダに存在する場合は「ルート」と表示します。
// 権限の日本語表記を取得するヘルパー関数
function translatePermission(access, permission) {
  const accessMap = {
    [DriveApp.Access.ANYONE]: '誰でも',
    [DriveApp.Access.ANYONE_WITH_LINK]: 'リンクを知っている人',
    [DriveApp.Access.PRIVATE]: '制限付き'
  };
  const permissionMap = {
    [DriveApp.Permission.VIEW]: '閲覧可',
    [DriveApp.Permission.COMMENT]: 'コメント可',
    [DriveApp.Permission.EDIT]: '編集可'
  };

  // 制限付きの場合は、"制限付き"とだけ表示
  if (access === DriveApp.Access.PRIVATE) {
    return accessMap[access];
  } else {
    return `${accessMap[access] || '不明'} (${permissionMap[permission] || '不明'})`;
  }
}
  • Googleドライブのアクセス権設定を日本語に変換するための関数です。
STEP
スクリプトを保存

スクリプトを書いたら、名前を付けて保存します。

(例:「アクセス権データ取得」)

STEP
スクリプトを実行

スクリプトを実行します。

初めてそのスクリプトを実行する場合は権限の確認が必要です。

そのため、『権限を確認』を押します。

許可の詳細手順

「詳細」をクリックします。

無題のプロジェクト(安全ではないページ)に移動」をクリックします。

許可」をクリックします。

STEP
ドライブ内すべて or フォルダを指定

スクリプトを実行すると、最初にポップアップが表示されます。

ここで、ドライブ内すべてもしくは特定のフォルダ名またはフォルダIDを入力します。

  • ドライブ内すべて:Googleドライブ内のすべてのファイルを対象とします。
  • 特定のフォルダ:そのフォルダ内のファイルだけが対象になります。
STEP
スプレッドシートに結果を表示

スクリプトを実行すると、指定した範囲のファイルアクセス権が一覧として出力されます。

出力される内容は以下の通りです。

出力内容
A列フォルダ名
B列ファイル名
C列現在の権限
D列オーナー
E列閲覧者(コメント可含む)
F列編集者

G~M列は項目名が表示されます。

また、G列の「変更対象」にはチェックボックスが追加されます。

これで、アクセス権の一括変更の準備が完了です。

注意事項

スクリプトの実行時間

GASには実行時間6分の制限があるため、ドライブ内に大量のファイルがある場合はフォルダ単位での実行をおすすめします。

(ファイル数が300以上ある場合は途中で終了する可能性があります)

オーナー権の譲渡は対象外

今回のスクリプトでは、ファイルのオーナー権の譲渡は対象外としています。

オーナー権の譲渡にはGoogle Drive APIを利用する必要があるため、APIを利用するか、手動でのオーナー変更が必要です。

制限付き 閲覧者・閲覧者(コメント可)を一つの列に表示

制限付きの権限選択に「閲覧者」と「閲覧者(コメント可)」がありますが、今回のスプレッドシートでは一つの列にまとめて表示しています。

これもGoogle Drive APIを使用することで個別に管理できますが、APIを使わずにシンプルにスクリプトで操作するために、一つの列に統合しています。

まとめ

今回のGASでは、フォルダ単位、またはドライブ全体でファイルのアクセス権を把握することができます。

次の記事では、この取得した情報を元に、Googleドライブ内のファイルのアクセス権を一括で変更する方法についてご紹介します。

アクセス権の調整を手軽に行えるようになります。

弊社では、Google Apps Script(GAS)を活用した業務効率化のサポートを提供しております。

GASのカスタマイズやエラー対応にお困りの際は、ぜひお気軽にご相談ください。

また、ITツールの導入支援やIT導入補助金の申請サポートも行っております。

貴方の業務改善を全力でサポートいたします。

お問い合わせはこちら

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次