Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save takapiro99/99cbd01624a4d1868baf692588496995 to your computer and use it in GitHub Desktop.
Save takapiro99/99cbd01624a4d1868baf692588496995 to your computer and use it in GitHub Desktop.
/**
* 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