![見出し画像](https://assets.st-note.com/production/uploads/images/79961725/rectangle_large_type_2_4cfdf7fd40a49a527074061d6453a7e3.png?width=800)
[GAS] 指定フォルダ配下の全ファイル特定の権限一覧化するツール1:指定フォルダ配下のフォルダを全取得する
はじめに
GASで、指定したGoogleドライブのフォルダの配下にあるすべてのファイルを検索し、特定の権限を持つ場合、そのファイル情報を、Googleスプレッドシートに出力するツールを作成します。
Googleドライブに配置したファイルを、他の人と共有することができるのは非常に便利です。その際、特定のユーザーに共有ではなく、「リンクを知っている全員」に設定してしまうことで、情報漏洩のリスクが高まります。
![](https://assets.st-note.com/img/1654500332692-JPZOCQOkbi.png?width=800)
指定したフォルダ配下にある全ファイルを検索し、この「リンクを知っている全員」の共有権限が設定されているファイルを一覧化するツールを作成します。
今回は、その処理の概要と、独自メニューを表示する処理、指定フォルダ配下のフォルダを全取得する処理の実装について、まとめます。
処理概要
処理概要は、下記となります。
指定フォルダ配下に存在するすべてのフォルダを取得する
フォルダごとに、全ファイルを取得する
ファイルのアクセス権を取得し、「リンクを知っている全員」の共有権限が設定されている場合、Googleスプレッドシートにファイル情報を出力する
Googleドライブのフォルダの指定は、フォルダIDで指定します。フォルダIDは、ブラウザのアドレスバーのURLをコピーして取得することができます。
![](https://assets.st-note.com/img/1654330980539-QiqMCZpT7r.png?width=800)
このフォルダIDは、Googleスプレッドシートの指定シートから指定を行うようにします。
また、GASの実行は、独自メニューを作成し、そのメニューから選択し、実行が開始される、とします。
![](https://assets.st-note.com/img/1654331051121-e6WKbGYiyI.png?width=800)
続いて、Googleスプレッドシートの構成は、下記としています。
設定
FileList
ErrorList
![](https://assets.st-note.com/img/1654549460443-Atw6UIR9zb.png)
「設定」シートでは、Googleドライブのフォルダの指定を行います。
「FileList」シートには、指定したフォルダ配下にある全ファイルを検索し、この「リンクを知っている全員」の共有権限が設定されているファイル一覧を出力します。
「ErrorList」シートには、ファイルの権限取得時にエラーが発生した場合のファイル一覧を取得します。
独自メニューを表示する処理の実装
全体の実装は下記になります。
function onOpen(e){
const ui = SpreadsheetApp.getUi();
ui.createMenu('【ファイル共有権限検出】')
.addItem('ファイル一覧作成', 'createFilesList')
.addToUi();
}
Googleスプレッドシートが起動時に実行されるシンプルトリガー、onOpen関数の中に実装します。これによって、Googleスプレッドシートが起動する際に、独自メニューが作成されるようになります。
UIを操作するためのオブジェクト、Uiクラスを取得します。
const ui = SpreadsheetApp.getUi();
createMenuメソッドで、Uiクラスからメニューを作成します。
次に、addItemメソッドで、メニューにアイテムを追加します。この際、第1引数では、メニュー上に表示したい名前(メニュー名)を、第2引数では、選択された際に実行する関数名を指定します。
最後に、addToUiメソッドで、メニューをUiクラスに追加します。
指定フォルダ配下のフォルダを全取得する処理の実装
全体の実装は下記になります。
function createAccessPermissionsFilesList(){
const folderId = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
const folder = DriveApp.getFolderById(folderId);
// 指定フォルダ配下のフォルダを全取得
const folderIDs = getFolderIDs_(folder);
folderIDs.push(folderId);
console.log(folderIDs);
}
/**
* 指定フォルダにあるすべてのフォルダのIDを取得する
* @param {object} Folderオブジェクト
* @return {Array.<string>} フォルダIDの配列
*/
function getFolderIDs_(rootFolder) {
const folders = rootFolder.getFolders();
let folderIDs = [];
while (folders.hasNext()) {
const folder = folders.next();
folderIDs.push(folder.getId());
const subFolderIDs = getFolderIDs_(folder);
folderIDs = folderIDs.concat(subFolderIDs);
}
return folderIDs;
}
DriveApp.getFolderByIdメソッドで、引数で指定されたGoogleドライブのフォルダのIDのFolderクラスを取得します。
const folder = DriveApp.getFolderById(folderId);
そのFolderクラスを、getFolderIDs_関数に引数として渡しています。戻り値は、そのFolderクラス内にあるフォルダのIDの配列としています。
const folderIDs = getFolderIDs_(folder);
続いて、getFolderIDs_関数の処理について、見ていきます。
引数で渡されたFolderクラスから、getFoldersメソッドで、その配下にあるフォルダを取得します。
const folders = rootFolder.getFolders();
getFoldersメソッドの戻り値は、FolderIteratorクラスとなります。
フォルダが存在するかどうかを、hasNextメソッドで取得することができます。
while文の条件式として、このhasNextメソッドの戻り値がtrue、つまり、フォルダが存在する間、1つずつフォルダを、nextメソッドで取得し、取得したフォルダIDを配列に保存していきます。
while (folders.hasNext()) {
const folder = folders.next();
folderIDs.push(folder.getId());
このgetFolderIDs_関数は、再帰関数としており、自分のことを自分で呼び出すようにしています。
これにより、引数で渡されたFolderクラスの配下に、フォルダがなくなるまで、繰り返し呼び出しを行うようになります。
const subFolderIDs = getFolderIDs_(folder);
戻り値として取得したフォルダIDの配列は、Arrayオブジェクトのconcatメソッドで連結します。
concatメソッドの戻り値は、連結後の配列となります。
folderIDs = folderIDs.concat(subFolderIDs);
全てのフォルダのIDが取得出来たら、フォルダIDの配列を戻して終了です!
まとめ
今回は、GASで、指定したGoogleドライブのフォルダの配下にあるすべてのファイルを検索し、特定の権限を持つ場合、そのファイル情報を、Googleスプレッドシートに出力するツールを作成します、の第1回目として、ツールの処理概要と、実装として、独自メニューを表示する処理、指定フォルダ配下のフォルダを全取得する処理について、まとめました。
次は、取得した全フォルダIDからファイルを取得する処理について実装していきます!
この記事が気に入ったらサポートをしてみませんか?