Advertisement
Guest User

Untitled

a guest
Mar 22nd, 2019
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.82 KB | None | 0 0
  1. /**
  2. *
  3. * Google Drive を対象にドキュメントインデックスを生成する Google Apps Script.
  4. *
  5. * Google Spreadsheet にバンドルして使用する.
  6. *
  7. */
  8.  
  9. var MAX_DEPTH = 3
  10.  
  11. var PATH_DELIMITER = " > "
  12.  
  13. function onOpen() {
  14. setupMenu()
  15. }
  16.  
  17. function setupMenu() {
  18. var ui = SpreadsheetApp.getUi()
  19. var menu = ui.createMenu("Document Index")
  20. menu.addItem("Generate Document Index (starting on root folder)",
  21. "onGenerateDocumentIndexStartingOnRootFolder")
  22. menu.addItem("Generate Document Index (starting on current folder)",
  23. "onGenerateDocumentIndexStartingOnCurrentFolder")
  24. menu.addToUi()
  25. }
  26.  
  27. function onGenerateDocumentIndexStartingOnRootFolder() {
  28. var sheet = SpreadsheetApp.getActiveSheet()
  29. var rootFolder = DriveApp.getRootFolder()
  30. generateDocumentIndex(sheet, rootFolder, MAX_DEPTH)
  31. }
  32.  
  33. function onGenerateDocumentIndexStartingOnCurrentFolder() {
  34. var sheet = SpreadsheetApp.getActiveSheet()
  35. var spreadsheetId = sheet.getParent().getId()
  36. var spreadsheetFile = DriveApp.getFileById(spreadsheetId)
  37. var rootFolder = spreadsheetFile.getParents().next()
  38. generateDocumentIndex(sheet, rootFolder, MAX_DEPTH)
  39. }
  40.  
  41. function generateDocumentIndex(sheet, rootFolder, maxDepth) {
  42. var filePaths = getFilePaths(rootFolder, maxDepth)
  43. updateSheet(sheet, filePaths)
  44. }
  45.  
  46. function getFilePaths(rootFolder, maxDepth) {
  47. var filePaths = []
  48. traverseDrive(rootFolder, maxDepth, function(parents, file) {
  49. filePaths.push({parents: parents, paths: parents.concat(file), file: file})
  50. })
  51. return filePaths
  52. }
  53.  
  54. function traverseDrive(rootFolder, maxDepth, callback) {
  55. function traverse(parents, folder, depth) {
  56. if (depth > maxDepth) {
  57. return
  58. }
  59. var query = "'" + folder.getId() + "' in parents"
  60. var files = DriveApp.searchFiles(query)
  61. while (files.hasNext()) {
  62. var file = files.next()
  63. callback(parents.concat(folder), file)
  64. }
  65. var folders = DriveApp.searchFolders(query)
  66. while (folders.hasNext()) {
  67. var subFolder = folders.next()
  68. callback(parents.concat(folder), subFolder)
  69. traverse(parents.concat(folder), subFolder, depth + 1)
  70. }
  71. }
  72. traverse([], rootFolder, 1)
  73. }
  74.  
  75. function updateSheet(sheet, filePaths) {
  76. initializeSheet(sheet)
  77. generateHeaderRow(sheet, filePaths)
  78. generateValueRows(sheet, filePaths)
  79. }
  80.  
  81. function initializeSheet(sheet) {
  82. sheet.clear()
  83. }
  84.  
  85. function generateHeaderRow(sheet, filePaths) {
  86. var headers = ["No.", "Type", "MIME Type", "Full Path"]
  87.  
  88. var maxDepth = 0
  89. for (var i = 0; i < filePaths.length; i++) {
  90. maxDepth = Math.max(maxDepth, filePaths[i].parents.length + 1)
  91. }
  92. for (var i = 0; i < maxDepth; i++) {
  93. headers.push("Path (Level " + i + ")")
  94. }
  95.  
  96. var row = 1
  97. var range = sheet.getRange(row, 1, 1, headers.length)
  98. range.setValues([headers])
  99. range.setBackground("orange")
  100. range.setHorizontalAlignment("center")
  101. }
  102.  
  103. function generateValueRows(sheet, filePaths) {
  104. var row = 2
  105. for (var i = 0; i < filePaths.length; i++) {
  106. generateValueRow(sheet, filePaths[i], i, row++)
  107. }
  108. }
  109.  
  110. function generateValueRow(sheet, filePath, index, row) {
  111. function setNoCell(column) {
  112. var range = sheet.getRange(row, column)
  113. CellUtils.setNumber(range, index + 1)
  114. }
  115. function setTypeCell(column) {
  116. var range = sheet.getRange(row, column)
  117. var value = FileUtils.isFile(filePath.file) ? "File" : "Directory"
  118. CellUtils.setText(range, value)
  119. }
  120. function setMimeTypeCell(column) {
  121. var range = sheet.getRange(row, column)
  122. if (FileUtils.isFile(filePath.file)) {
  123. CellUtils.setText(range, filePath.file.getMimeType())
  124. }
  125. }
  126. function setFullPathCell(column) {
  127. var value = ""
  128. var delimiter = ""
  129. for (var i = 0; i < filePath.paths.length; i++) {
  130. value += delimiter + filePath.paths[i].getName()
  131. delimiter = PATH_DELIMITER
  132. }
  133. var range = sheet.getRange(row, column)
  134. CellUtils.setTextLink(range, filePath.file.getUrl(), value)
  135. }
  136. function setPathCells(column) {
  137. for (var i = 0; i < filePath.paths.length; i++) {
  138. var range = sheet.getRange(row, column++)
  139. var path = filePath.paths[i]
  140. CellUtils.setTextLink(range, path.getUrl(), path.getName())
  141. }
  142. }
  143.  
  144. var column = 1
  145. setNoCell(column++)
  146. setTypeCell(column++)
  147. setMimeTypeCell(column++)
  148. setFullPathCell(column++)
  149. setPathCells(column++)
  150. }
  151.  
  152. var FileUtils = {
  153. isFile: function(file) {
  154. return !file.addFile
  155. },
  156. isFolder: function(file) {
  157. return !!file.addFile
  158. },
  159. }
  160.  
  161. var CellUtils = {
  162. setNumber: function(range, value) {
  163. range.setValue(value)
  164. range.setNumberFormat("0")
  165. },
  166. setText: function(range, value) {
  167. range.setValue(value)
  168. range.setNumberFormat("@")
  169. },
  170. setTextLink: function(range, url, value) {
  171. value = value.replace(/"/g, '""')
  172. range.setValue('=HYPERLINK("' + url + '", "' + value + '")')
  173. range.setNumberFormat("@")
  174. range.setShowHyperlink(true)
  175. },
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement