Googleドライブ内の共有権限をGASで一括出力するコード【2023年】


Google ドライブ内のフォルダを誰に共有しているのか一覧で取得したい。
今回はGoogleドライブ上で共有権限を付与しているフォルダ・ファイルに対し、
オーナー、編集者、閲覧者をリスト化し出力する方法を解説していきます。
Gドライブは共有権限をフォルダ・ファイルごとに付与することができますが、
フォルダごとに付与をしていると、
共有権限がとっても複雑になりがちです。。。
複雑になると、どのフォルダがどんな人に共有しているのか、管理するのも大変ですし、
移行するときにもどのフォルダをどんな人に付与していたかわからなくなります。
今回は、Gドライブ上のフォルダ・ファイルの共有権限をスプレッドシートに出力するスクリプトを紹介していきます。

なるべく、コピペで動かすことができるように紹介していきます!
目次(クリックで読みたい部分にジャンプできます)
今回行うこと
まず、今回行っていくことを整理します。
共有権限を取得すること。
ですが、用途によって分けようと思います。
- マイドライブ直下の共有権限を取得したい場合
- 1階層目のみを取得したい場合
- 1&2階層目のみを取得したい場合
- 全ての階層のファイルを取得したい場合
- フォルダのみ、または、ファイルのみの共有権限を取得したい場合
1階層目、2階層目とは
1階層目とは、以下の写真の赤字部分を指しています。

2階層目は、aaフォルダまで。
3階層目は、ファイル1、2、3、bbフォルダがそれにあたります。

決まっている表現ではありませんので、今回の説明のしやすさとして理解しておいてください。
では、ソースコードを見ていきましょう。
親フォルダ直下全てのフォルダ・ファイルの共有権限を取得したい場合

マイドライブ直下全てのフォルダ・ファイルの共有権限を取得したい場合のコードです。
先ほどの写真を用いると、以下の 赤枠 の部分です。


親フォルダが、マイドライブ以外のフォルダでも大丈夫です。
あなたが、編集権限を持っているフォルダ限定になります。
実行方法
①以下コードをGASにコピペ。
②ユーザー入力欄を正しく入力する。
③getPermissionList() 関数を実行
//ユーザーの入力欄****************************
var outputsheetname = "シート1" //出力するシート名を記入
var paretfolder_name = "マイドライブ"; //親フォルダの名前を記入
//マイドライブの場合は以下
var drive_root = DriveApp.getRootFolder()
//他のフォルダの場合は、IDを指定
//var drive_root = DriveApp.getFolderById("<GドライブのIDを入力>")
//*****************************************
var activeSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(outputsheetname);
var row = 1;
var lastRow;
function getPermissionList() {
//シートをクリア
activeSheet.clear();
// ヘッダ作成
activeSheet.getRange(1, 1).setValue("ファイルorフォルダ")
activeSheet.getRange(1, 2).setValue("ファイル名")
activeSheet.getRange(1, 3).setValue("管理者")
activeSheet.getRange(1, 4).setValue("編集者")
activeSheet.getRange(1, 5).setValue("閲覧者")
activeSheet.getRange(1, 6).setValue(paretfolder_name + "直下のパス")
activeSheet.getRange("A1:F1").setBackground("#7169e5");
activeSheet.getRange("A1:F1").setFontColor("#ffffff");
// 権限一覧を取得
getFolderPermission(drive_root);
getFilePermission(drive_root);//---------------------------------------※①
}
function getFolderPermission(folder) {
var folders = folder.getFolders();
var files = folder.getFiles();
var editors;
var viewers;
while (folders.hasNext()) {
var folder = folders.next()
var parentfolder = folder.getParents().next();
let filepath = [folder.getName()]
row++;
console.info(folder.getName());
while(parentfolder.getName() != paretfolder_name){
filepath.unshift(parentfolder.getName())
parentfolder = parentfolder.getParents().next();
}
console.log(filepath)
activeSheet.getRange(row, 1).setValue("フォルダ")
activeSheet.getRange(row, 6).setValue(filepath.join("/"))
activeSheet.getRange(row, 2).setValue(folder.getName())
activeSheet.getRange(row, 3).setValue(folder.getOwner().getEmail())
try{
editors = folder.getEditors().map(a => a.getEmail()).join("\n");
}catch(e){
console.log(e)
}
console.log(editors)
activeSheet.getRange(row, 4).setValue(editors);
editorsBk = editors;
viewers = folder.getViewers().map(a => a.getEmail()).join("\n");
activeSheet.getRange(row, 5).setValue(viewers);
getFolderPermission(folder);
getFilePermission(folder);//---------------------------------------※②
}
}
function getFilePermission(folder) {
var files = folder.getFiles();
var editors;
var viewers;
while (files.hasNext()) {
var folder = files.next()
let filepath = [folder.getName()]
var parentfolder = folder.getParents().next();
row++;
console.info(folder.getName());
while(parentfolder.getName()!=paretfolder_name){
filepath.unshift(parentfolder.getName())
parentfolder = parentfolder.getParents().next();
}
console.log(filepath)
activeSheet.getRange(row, 1).setValue("ファイル")
activeSheet.getRange(row, 6).setValue(filepath.join("/"))
activeSheet.getRange(row, 2).setValue(folder.getName())
activeSheet.getRange(row, 3).setValue(folder.getOwner().getEmail())
editors = folder.getEditors().map(a => a.getEmail()).join("\n");
activeSheet.getRange(row, 4).setValue(editors);
viewers = folder.getViewers().map(a => a.getEmail()).join("\n");
activeSheet.getRange(row, 5).setValue(viewers);
}
}
実行時の注意点
フォルダ・ファイル量が多いと、タイムアウトにかかってしまいます。
タイムアウトは、G無償アカウントだと6分、有償アカウントだと30分です。

自分が実行した時は、30分で1400ファイルが実行できるようでした。
次から説明する、1階層のみ、1&2階層のみの取得の場合は、実行スピードは早くなります。
(親フォルダを取得する処理が少ないから)
フォルダーのみの取得で良い場合
フォルダのみの取得で良い場合のコード修正方法を解説します。


コードの中で、※①※②と書いてある部分があります。
この部分をコメントアウト、削除してください。
そうすることで、フォルダのみの共有権限を取得することができます。
1階層目のみの共有権限を取得したい場合

次に1階層のみを取得したい場合の方法です。
1階層目のみは、以下 赤枠 の部分のみの共有権限を取得します。

実行方法
①以下コードをGASにコピペ。
②ユーザー入力欄を正しく入力する。
③getPermissionList() 関数を実行
//ユーザーの入力欄****************************
var outputsheetname = "シート1" //出力するシート名を記入
var paretfolder_name = "マイドライブ"; //親フォルダの名前を記入
//マイドライブの場合は以下
var drive_root = DriveApp.getRootFolder()
//他のフォルダの場合は、IDを指定
//var drive_root = DriveApp.getFolderById("<GドライブのIDを入力>")
//*****************************************
var activeSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(outputsheetname);
var row = 1;
var lastRow;
function getPermissionList() {
//シートをクリア
activeSheet.clear();
// ヘッダ作成
activeSheet.getRange(1, 1).setValue("ファイルorフォルダ")
activeSheet.getRange(1, 2).setValue("ファイル名")
activeSheet.getRange(1, 3).setValue("管理者")
activeSheet.getRange(1, 4).setValue("編集者")
activeSheet.getRange(1, 5).setValue("閲覧者")
activeSheet.getRange(1, 6).setValue(paretfolder_name + "直下のパス")
activeSheet.getRange("A1:F1").setBackground("#7169e5");
activeSheet.getRange("A1:F1").setFontColor("#ffffff");
// 権限一覧を取得
getFolderPermission(drive_root);
getFilePermission(drive_root);//--------------------------------※①
}
function getFolderPermission(folder) {
var folders = folder.getFolders();
var files = folder.getFiles();
var editors;
var viewers;
while (folders.hasNext()) {
var folder = folders.next()
var parentfolder = folder.getParents().next();
let filepath = [folder.getName()]
row++;
console.info(folder.getName());
while(parentfolder.getName() != paretfolder_name){
filepath.unshift(parentfolder.getName())
parentfolder = parentfolder.getParents().next();
}
console.log(filepath)
activeSheet.getRange(row, 1).setValue("フォルダ")
activeSheet.getRange(row, 6).setValue(filepath.join("/"))
activeSheet.getRange(row, 2).setValue(folder.getName())
activeSheet.getRange(row, 3).setValue(folder.getOwner().getEmail())
try{
editors = folder.getEditors().map(a => a.getEmail()).join("\n");
}catch(e){
console.log(e)
}
console.log(editors)
activeSheet.getRange(row, 4).setValue(editors);
editorsBk = editors;
viewers = folder.getViewers().map(a => a.getEmail()).join("\n");
activeSheet.getRange(row, 5).setValue(viewers);
}
}
function getFilePermission(folder) {
var files = folder.getFiles();
var editors;
var viewers;
while (files.hasNext()) {
var folder = files.next()
let filepath = [folder.getName()]
row++;
console.info(folder.getName());
console.log(filepath)
activeSheet.getRange(row, 1).setValue("ファイル")
activeSheet.getRange(row, 6).setValue(filepath.join("/"))
activeSheet.getRange(row, 2).setValue(folder.getName())
activeSheet.getRange(row, 3).setValue(folder.getOwner().getEmail())
editors = folder.getEditors().map(a => a.getEmail()).join("\n");
activeSheet.getRange(row, 4).setValue(editors);
viewers = folder.getViewers().map(a => a.getEmail()).join("\n");
activeSheet.getRange(row, 5).setValue(viewers);
}
}

こちらの実行スピードは先ほどよりも早くなります。
私が実行してみたら、100ファイル&フォルダ 43秒でした。
フォルダーのみの取得で良い場合
もし、フォルダーのみの取得で良い場合のコード修正方法を解説します。

コードの中で、※①と書いてある部分があります。
この部分をコメントアウト、削除してください。
そうすることで、フォルダのみの共有権限を取得することができます。
1&2階層目のみの共有権限を取得したい場合

次に1&2階層目を取得したい場合を紹介します。
取得するファイルは以下の 赤枠 部分です。

実行方法
①以下コードをGASにコピペ。
②ユーザー入力欄を正しく入力する。
③getPermissionList() 関数を実行
//ユーザーの入力欄****************************
var outputsheetname = "シート1" //出力するシート名を記入
var paretfolder_name = "マイドライブ"; //親フォルダの名前を記入
//マイドライブの場合は以下
var drive_root = DriveApp.getRootFolder()
//他のフォルダの場合は、IDを指定
//var drive_root = DriveApp.getFolderById("<GドライブのIDを入力>")
//*****************************************
var activeSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(outputsheetname);
var row = 1;
var lastRow;
function getPermissionList() {
//シートをクリア
activeSheet.clear();
// ヘッダ作成
activeSheet.getRange(1, 1).setValue("ファイルorフォルダ")
activeSheet.getRange(1, 2).setValue("ファイル名")
activeSheet.getRange(1, 3).setValue("管理者")
activeSheet.getRange(1, 4).setValue("編集者")
activeSheet.getRange(1, 5).setValue("閲覧者")
activeSheet.getRange(1, 6).setValue(paretfolder_name + "直下のパス")
activeSheet.getRange("A1:F1").setBackground("#7169e5");
activeSheet.getRange("A1:F1").setFontColor("#ffffff");
// 権限一覧を取得
getFolderPermission(drive_root);
getFilePermission(drive_root);//-----------------------------------※①
}
function getFolderPermission(folder) {
var folders = folder.getFolders();
var files = folder.getFiles();
var editors;
var viewers;
while (folders.hasNext()) {
var folder = folders.next()
var parentfolder = folder.getParents().next();
let filepath = [folder.getName()]
row++;
console.info(folder.getName());
while(parentfolder.getName() != paretfolder_name){
filepath.unshift(parentfolder.getName())
parentfolder = parentfolder.getParents().next();
}
console.log(filepath)
activeSheet.getRange(row, 1).setValue("フォルダ")
activeSheet.getRange(row, 6).setValue(filepath.join("/"))
activeSheet.getRange(row, 2).setValue(folder.getName())
activeSheet.getRange(row, 3).setValue(folder.getOwner().getEmail())
try{
editors = folder.getEditors().map(a => a.getEmail()).join("\n");
}catch(e){
console.log(e)
}
console.log(editors)
activeSheet.getRange(row, 4).setValue(editors);
viewers = folder.getViewers().map(a => a.getEmail()).join("\n");
activeSheet.getRange(row, 5).setValue(viewers);
getunderFolderPermission(folder)
}
}
function getunderFolderPermission(folder) {
var folders = folder.getFolders();
var files = folder.getFiles();
var editors;
var viewers;
getFilePermission(folder)//-----------------------------------※②
while (folders.hasNext()) {
var folder = folders.next()
var parentfolder = folder.getParents().next();
let filepath = [folder.getName()]
row++;
console.info(folder.getName());
while(parentfolder.getName()!=paretfolder_name){
filepath.unshift(parentfolder.getName())
parentfolder = parentfolder.getParents().next();
}
console.log(filepath)
activeSheet.getRange(row, 1).setValue("フォルダ")
activeSheet.getRange(row, 6).setValue(filepath.join("/"))
activeSheet.getRange(row, 2).setValue(folder.getName())
activeSheet.getRange(row, 3).setValue(folder.getOwner().getEmail())
try{
editors = folder.getEditors().map(a => a.getEmail()).join("\n");
}catch(e){
console.log(e)
}
console.log(editors)
activeSheet.getRange(row, 4).setValue(editors);
editorsBk = editors;
viewers = folder.getViewers().map(a => a.getEmail()).join("\n");
activeSheet.getRange(row, 5).setValue(viewers);
}
}
function getFilePermission(folder) {
var files = folder.getFiles();
var editors;
var viewers;
while (files.hasNext()) {
var folder = files.next()
var parentfolder = folder.getParents().next();
let filepath = [folder.getName()]
row++;
console.info(folder.getName());
while(parentfolder.getName()!=paretfolder_name){
filepath.unshift(parentfolder.getName())
parentfolder = parentfolder.getParents().next();
}
console.log(filepath)
activeSheet.getRange(row, 1).setValue("ファイル")
activeSheet.getRange(row, 6).setValue(filepath.join("/"))
activeSheet.getRange(row, 2).setValue(folder.getName())
activeSheet.getRange(row, 3).setValue(folder.getOwner().getEmail())
editors = folder.getEditors().map(a => a.getEmail()).join("\n");
activeSheet.getRange(row, 4).setValue(editors);
viewers = folder.getViewers().map(a => a.getEmail()).join("\n");
activeSheet.getRange(row, 5).setValue(viewers);
}
}
フォルダーのみの取得で良い場合
もし、フォルダーのみの取得で良い場合のコード修正方法を解説します。


コードの中で、※①※②と書いてある部分があります。
この部分をコメントアウト、削除してください。
そうすることで、フォルダのみの共有権限を取得することができます。
まとめ
共有権限を取得することはできましたでしょうか。
もし動かすことができない時がありましたら、

X (twitter) @abebe_code に質問いただければ、わかる範囲でお答えします!
また、