Last active
February 14, 2021 04:05
-
-
Save takapiro99/99cbd01624a4d1868baf692588496995 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Google Drive の特定のフォルダー以下のメンバーと権限をスプレッドシートに展開する | |
* | |
* 1. 権限を知りたいフォルダー直下にスプレッドシートを作成する | |
* 2. ツール > スクリプトエディタ で開いたエディタにこのページのコードを貼り付ける | |
* 3. 保存、実行、してちょっと待つ (初回実行時は権限の許可が必要) | |
*/ | |
const masterSheet = SpreadsheetApp.getActive() | |
const sheet = masterSheet.getSheetByName("シート1").activate() | |
const heading = ["名前", "共有状態", "リンク共有権限", "オーナー", "編集者数", "編集者", "閲覧者数", "閲覧者", "種類", "作成", "最終更新"] | |
const main = () => { | |
sheet.clear() | |
// スプシの階層のフォルダー | |
const targetFolder = DriveApp.getFileById(masterSheet.getId()).getParents().next() | |
// 任意の"フォルダー"が良い場合 | |
// const targetFolder = DriveApp.getFolderById("フォルダーID") | |
sheet.getRange(1, 1) | |
.setValue(`「${targetFolder}」 下の権限一覧`) | |
.setFontSize(18) | |
sheet.getRange("A3:K3") | |
.setValues([heading]) | |
.setBackground("#fff9c4") | |
.setBorder(false, false, true, false, false, false) | |
checkFolder(targetFolder, 1) | |
sheet.getRange(sheet.getLastRow() + 1, 1).setValue("以上!") | |
} | |
const createTreeSymbol = n => (n == 1 ? "━" : " " + " │ ".repeat(n - 2) + "┗") | |
const outputFileIteratorPermissions = (fileIterator, n) => { | |
const prefix = createTreeSymbol(n) | |
const filePermissions = [] | |
while (fileIterator.hasNext()) { | |
const file = fileIterator.next() | |
filePermissions.push([`${prefix} ${file}`, ...getPermissions(file.getId())]) | |
} | |
if (!filePermissions.length) return | |
sheet.getRange(sheet.getLastRow() + 1, 1, filePermissions.length, heading.length).setValues(filePermissions) | |
} | |
const outputFolderPermissions = (folder, n) => { | |
const permissions = getPermissions(folder.getId()) | |
sheet.getRange(sheet.getLastRow() + 1, 1, 1, heading.length) | |
.setValues([[`${createTreeSymbol(n)} ${folder}`, ...permissions]]) | |
.setBackground("#eceff1") | |
} | |
// フォルダー中の | |
const checkFolder = (givenFolder, n) => { | |
Logger.log(`${createTreeSymbol(n)}「${givenFolder}」の中の権限を確認しています…`) | |
// 直下のファイルたち | |
outputFileIteratorPermissions(givenFolder.getFiles(), n) | |
// 直下のフォルダーたち | |
const innerFolders = givenFolder.getFolders() | |
while (innerFolders.hasNext()) { | |
const folder = innerFolders.next() | |
outputFolderPermissions(folder, n) | |
checkFolder(folder, n + 1) | |
} | |
} | |
// file の各種権限を取得する | |
// なぜか folder に対しても動くからそのままにしてる | |
const getPermissions = (fileID) => { | |
const file = DriveApp.getFileById(fileID) | |
const owner = file.getOwner() | |
const editors = file.getEditors() | |
const viewers = file.getViewers() | |
return [ | |
file.getSharingAccess(), | |
file.getSharingPermission(), | |
owner ? owner.getName() : "---", | |
editors.length, | |
editors.length ? editors.map((user) => user.getName()).join(", ") : "---", | |
viewers.length, | |
viewers.length ? viewers.map((user) => user.getName()).join(", ") : "---", | |
file.getMimeType(), | |
file.getDateCreated().toLocaleString(), | |
file.getLastUpdated().toLocaleString() | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment