Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- *
- * Google Drive を対象にドキュメントインデックスを生成する Google Apps Script.
- *
- * Google Spreadsheet にバンドルして使用する.
- *
- */
- var MAX_DEPTH = 3
- var PATH_DELIMITER = " > "
- function onOpen() {
- setupMenu()
- }
- function setupMenu() {
- var ui = SpreadsheetApp.getUi()
- var menu = ui.createMenu("Document Index")
- menu.addItem("Generate Document Index (starting on root folder)",
- "onGenerateDocumentIndexStartingOnRootFolder")
- menu.addItem("Generate Document Index (starting on current folder)",
- "onGenerateDocumentIndexStartingOnCurrentFolder")
- menu.addToUi()
- }
- function onGenerateDocumentIndexStartingOnRootFolder() {
- var sheet = SpreadsheetApp.getActiveSheet()
- var rootFolder = DriveApp.getRootFolder()
- generateDocumentIndex(sheet, rootFolder, MAX_DEPTH)
- }
- function onGenerateDocumentIndexStartingOnCurrentFolder() {
- var sheet = SpreadsheetApp.getActiveSheet()
- var spreadsheetId = sheet.getParent().getId()
- var spreadsheetFile = DriveApp.getFileById(spreadsheetId)
- var rootFolder = spreadsheetFile.getParents().next()
- generateDocumentIndex(sheet, rootFolder, MAX_DEPTH)
- }
- function generateDocumentIndex(sheet, rootFolder, maxDepth) {
- var filePaths = getFilePaths(rootFolder, maxDepth)
- updateSheet(sheet, filePaths)
- }
- function getFilePaths(rootFolder, maxDepth) {
- var filePaths = []
- traverseDrive(rootFolder, maxDepth, function(parents, file) {
- filePaths.push({parents: parents, paths: parents.concat(file), file: file})
- })
- return filePaths
- }
- function traverseDrive(rootFolder, maxDepth, callback) {
- function traverse(parents, folder, depth) {
- if (depth > maxDepth) {
- return
- }
- var query = "'" + folder.getId() + "' in parents"
- var files = DriveApp.searchFiles(query)
- while (files.hasNext()) {
- var file = files.next()
- callback(parents.concat(folder), file)
- }
- var folders = DriveApp.searchFolders(query)
- while (folders.hasNext()) {
- var subFolder = folders.next()
- callback(parents.concat(folder), subFolder)
- traverse(parents.concat(folder), subFolder, depth + 1)
- }
- }
- traverse([], rootFolder, 1)
- }
- function updateSheet(sheet, filePaths) {
- initializeSheet(sheet)
- generateHeaderRow(sheet, filePaths)
- generateValueRows(sheet, filePaths)
- }
- function initializeSheet(sheet) {
- sheet.clear()
- }
- function generateHeaderRow(sheet, filePaths) {
- var headers = ["No.", "Type", "MIME Type", "Full Path"]
- var maxDepth = 0
- for (var i = 0; i < filePaths.length; i++) {
- maxDepth = Math.max(maxDepth, filePaths[i].parents.length + 1)
- }
- for (var i = 0; i < maxDepth; i++) {
- headers.push("Path (Level " + i + ")")
- }
- var row = 1
- var range = sheet.getRange(row, 1, 1, headers.length)
- range.setValues([headers])
- range.setBackground("orange")
- range.setHorizontalAlignment("center")
- }
- function generateValueRows(sheet, filePaths) {
- var row = 2
- for (var i = 0; i < filePaths.length; i++) {
- generateValueRow(sheet, filePaths[i], i, row++)
- }
- }
- function generateValueRow(sheet, filePath, index, row) {
- function setNoCell(column) {
- var range = sheet.getRange(row, column)
- CellUtils.setNumber(range, index + 1)
- }
- function setTypeCell(column) {
- var range = sheet.getRange(row, column)
- var value = FileUtils.isFile(filePath.file) ? "File" : "Directory"
- CellUtils.setText(range, value)
- }
- function setMimeTypeCell(column) {
- var range = sheet.getRange(row, column)
- if (FileUtils.isFile(filePath.file)) {
- CellUtils.setText(range, filePath.file.getMimeType())
- }
- }
- function setFullPathCell(column) {
- var value = ""
- var delimiter = ""
- for (var i = 0; i < filePath.paths.length; i++) {
- value += delimiter + filePath.paths[i].getName()
- delimiter = PATH_DELIMITER
- }
- var range = sheet.getRange(row, column)
- CellUtils.setTextLink(range, filePath.file.getUrl(), value)
- }
- function setPathCells(column) {
- for (var i = 0; i < filePath.paths.length; i++) {
- var range = sheet.getRange(row, column++)
- var path = filePath.paths[i]
- CellUtils.setTextLink(range, path.getUrl(), path.getName())
- }
- }
- var column = 1
- setNoCell(column++)
- setTypeCell(column++)
- setMimeTypeCell(column++)
- setFullPathCell(column++)
- setPathCells(column++)
- }
- var FileUtils = {
- isFile: function(file) {
- return !file.addFile
- },
- isFolder: function(file) {
- return !!file.addFile
- },
- }
- var CellUtils = {
- setNumber: function(range, value) {
- range.setValue(value)
- range.setNumberFormat("0")
- },
- setText: function(range, value) {
- range.setValue(value)
- range.setNumberFormat("@")
- },
- setTextLink: function(range, url, value) {
- value = value.replace(/"/g, '""')
- range.setValue('=HYPERLINK("' + url + '", "' + value + '")')
- range.setNumberFormat("@")
- range.setShowHyperlink(true)
- },
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement