Guest User

Case Indexing Drive

a guest
Aug 4th, 2025
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.00 KB | None | 0 0
  1. // === CONFIGURATION ===
  2. const ROOT_FOLDER_ID = 'insert';
  3. const MASTER_INDEX_DOC_ID = 'insert';
  4. const TARGET_SPREADSHEET_FOLDER_ID = 'insert';
  5. const EMAIL = 'insert';
  6. const FILE_BATCH_SIZE = 750;
  7. const FOLDER_BATCH_SIZE = 200;
  8.  
  9. // === ENTRY POINT ===
  10. function startCaseIndexing() {
  11. const folder = DriveApp.getFolderById(ROOT_FOLDER_ID);
  12. const folderName = folder.getName();
  13. const createdDate = folder.getDateCreated();
  14.  
  15. const ss = SpreadsheetApp.create(folderName + ' - Case Index');
  16. const ssId = ss.getId();
  17. DriveApp.getFolderById(TARGET_SPREADSHEET_FOLDER_ID).addFile(DriveApp.getFileById(ssId));
  18. DriveApp.getRootFolder().removeFile(DriveApp.getFileById(ssId));
  19.  
  20. const sheet = ss.getSheets()[0];
  21. sheet.setName('File Metadata');
  22. sheet.clear();
  23. sheet.appendRow(['Subfolder', 'File Name', 'Created Date', 'Modified Date', 'File Link', '', 'File ID']);
  24.  
  25. const stateSheet = ss.insertSheet('__BatchState');
  26. stateSheet.hideSheet();
  27. stateSheet.getRange('A1').setValue('folderQueue');
  28. stateSheet.getRange('B1').setValue('colorMap');
  29. stateSheet.getRange('C1').setValue('meta');
  30.  
  31. const folderQueue = [[folder.getId(), '']];
  32. stateSheet.getRange(2, 1, folderQueue.length, 2).setValues(folderQueue);
  33. stateSheet.getRange('B2').setValue(JSON.stringify({}));
  34. stateSheet.getRange('C2').setValue(JSON.stringify({
  35. fileCount: 0,
  36. folderCount: 0,
  37. colorIndex: 0,
  38. rootId: folder.getId()
  39. }));
  40.  
  41. PropertiesService.getScriptProperties().setProperty('activeSheetId', ssId);
  42. continueIndexingBatch_();
  43.  
  44. addToMasterIndexDoc_(folder.getId(), folderName, createdDate, folder.getUrl(), ss.getUrl());
  45. MailApp.sendEmail(EMAIL, 'Case Indexed (Batch Started)', `Initial batch started for "${folderName}". Spreadsheet: ${ss.getUrl()}`);
  46. }
  47.  
  48. function continueIndexingBatch_() {
  49. const ssId = PropertiesService.getScriptProperties().getProperty('activeSheetId');
  50. if (!ssId) return;
  51.  
  52. const ss = SpreadsheetApp.openById(ssId);
  53. const sheet = ss.getSheetByName('File Metadata');
  54. const stateSheet = ss.getSheetByName('__BatchState');
  55. const colorPalette = [
  56. '#f4cccc','#fce5cd','#fff2cc','#d9ead3','#d0e0e3','#cfe2f3','#d9d2e9','#ead1dc',
  57. '#ea9999','#f9cb9c','#ffe599','#b6d7a8','#a2c4c9','#9fc5e8','#b4a7d6','#d5a6bd'
  58. ];
  59.  
  60. const folderQueue = stateSheet.getRange(2, 1, stateSheet.getLastRow() - 1, 2).getValues();
  61. const colorMap = JSON.parse(stateSheet.getRange('B2').getValue());
  62. const meta = JSON.parse(stateSheet.getRange('C2').getValue());
  63.  
  64. let fileCount = 0;
  65. let folderCount = 0;
  66. const drive = Drive;
  67. const updatedQueue = [];
  68.  
  69. for (const [folderId, pageToken] of folderQueue) {
  70. if (folderCount >= FOLDER_BATCH_SIZE || fileCount >= FILE_BATCH_SIZE) {
  71. updatedQueue.push([folderId, pageToken]);
  72. continue;
  73. }
  74.  
  75. const folder = DriveApp.getFolderById(folderId);
  76. const parentFolderName = folder.getParents().hasNext() ? folder.getParents().next().getName() : 'Root';
  77.  
  78. if (!colorMap[parentFolderName]) {
  79. colorMap[parentFolderName] = colorPalette[meta.colorIndex % colorPalette.length];
  80. meta.colorIndex++;
  81. }
  82.  
  83. const query = `'${folderId}' in parents and trashed = false`;
  84. const filesResp = drive.Files.list({
  85. q: query,
  86. maxResults: 100,
  87. pageToken: pageToken || undefined,
  88. fields: 'files(id,name,createdTime,modifiedTime),nextPageToken'
  89. });
  90.  
  91. const files = filesResp.files || [];
  92. for (const file of files) {
  93. if (fileCount >= FILE_BATCH_SIZE) {
  94. updatedQueue.unshift([folderId, filesResp.nextPageToken || '']);
  95. stateSheet.getRange(2, 1, updatedQueue.length, 2).setValues(updatedQueue);
  96. stateSheet.getRange('B2').setValue(JSON.stringify(colorMap));
  97. stateSheet.getRange('C2').setValue(JSON.stringify(meta));
  98. ScriptApp.newTrigger('continueIndexingBatch_').timeBased().after(2 * 60 * 1000).create();
  99. return;
  100. }
  101.  
  102. const row = [
  103. parentFolderName,
  104. (file.name || 'Untitled').replace(/\.[^\.]+$/, ''),
  105. new Date(file.createdTime),
  106. new Date(file.modifiedTime),
  107. `=HYPERLINK("https://drive.google.com/file/d/${file.id}/view", "Link")`,
  108. '',
  109. file.id
  110. ];
  111. sheet.appendRow(row);
  112. const range = sheet.getRange(sheet.getLastRow(), 1, 1, 5);
  113. range.setBackground(colorMap[parentFolderName]);
  114. range.getCell(1, 2).setFontWeight('bold');
  115.  
  116. fileCount++;
  117. }
  118.  
  119. if (filesResp.nextPageToken) {
  120. updatedQueue.push([folderId, filesResp.nextPageToken]);
  121. } else {
  122. const subfolders = folder.getFolders();
  123. while (subfolders.hasNext()) {
  124. const sub = subfolders.next();
  125. updatedQueue.push([sub.getId(), '']);
  126. }
  127. folderCount++;
  128. }
  129. }
  130.  
  131. if (updatedQueue.length > 0) {
  132. stateSheet.getRange(2, 1, updatedQueue.length, 2).clearContent();
  133. stateSheet.getRange(2, 1, updatedQueue.length, 2).setValues(updatedQueue);
  134. meta.fileCount = 0;
  135. meta.folderCount = 0;
  136. stateSheet.getRange('B2').setValue(JSON.stringify(colorMap));
  137. stateSheet.getRange('C2').setValue(JSON.stringify(meta));
  138. ScriptApp.newTrigger('continueIndexingBatch_').timeBased().after(2 * 60 * 1000).create();
  139. } else {
  140. PropertiesService.getScriptProperties().deleteProperty('activeSheetId');
  141. }
  142. }
  143.  
  144. function addToMasterIndexDoc_(folderId, name, created, folderUrl, sheetUrl) {
  145. const doc = DocumentApp.openById(MASTER_INDEX_DOC_ID);
  146. const body = doc.getBody();
  147. const tables = body.getTables();
  148. let table;
  149. if (tables.length === 0) {
  150. table = body.appendTable([
  151. ['Folder ID', 'Case Name', 'Date Created', 'Folder Link', 'Spreadsheet Link']
  152. ]);
  153. } else {
  154. table = tables[0];
  155. }
  156. const row = table.appendTableRow();
  157. row.appendTableCell(folderId);
  158. row.appendTableCell(name);
  159. row.appendTableCell(created.toDateString());
  160. row.appendTableCell('Link').setLinkUrl(folderUrl);
  161. row.appendTableCell('Spreadsheet').setLinkUrl(sheetUrl);
  162. doc.saveAndClose();
  163. }
  164.  
Advertisement
Add Comment
Please, Sign In to add comment