Trai60

Emergency_Medic_109

Dec 27th, 2024
33
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.33 KB | None | 0 0
  1. function Emergency_Medic_109() {
  2. var spreadsheet = SpreadsheetApp.getActive();
  3. var sheet = spreadsheet.getActiveSheet();
  4.  
  5. // Performance optimizations
  6. SpreadsheetApp.flush(); // Clear any pending operations
  7. sheet.getRange('A1:Z' + sheet.getLastRow()).setNumberFormat('@STRING@'); // Temporarily set as text
  8.  
  9. // Disable automatic calculations temporarily
  10. var properties = PropertiesService.getDocumentProperties();
  11. properties.setProperty('calculationMode', 'MANUAL');
  12.  
  13. // Remove any existing filters first
  14. var existingFilter = sheet.getFilter();
  15. if (existingFilter) {
  16. existingFilter.remove();
  17. }
  18.  
  19. // Get the last row with data
  20. var lastRow = sheet.getLastRow();
  21.  
  22. // === First Macro Operations ===
  23.  
  24. // Split Started At into Date and Time
  25. var startedAtCol = 4;
  26. sheet.insertColumnsBefore(startedAtCol, 2);
  27. sheet.getRange(1, startedAtCol).setValue('Start Date');
  28. sheet.getRange(1, startedAtCol + 1).setValue('Start Time');
  29.  
  30. var startedAtRange = sheet.getRange(2, startedAtCol + 2, lastRow - 1);
  31. var startDateRange = sheet.getRange(2, startedAtCol, lastRow - 1);
  32. var startTimeRange = sheet.getRange(2, startedAtCol + 1, lastRow - 1);
  33.  
  34. // Process date/time formulas in batches
  35. var batchSize = 100;
  36. for (var i = 2; i <= lastRow; i += batchSize) {
  37. var currentBatchSize = Math.min(batchSize, lastRow - i + 1);
  38. var startDateFormulas = Array(currentBatchSize).fill('=IF(INDIRECT("R[0]C[2]",FALSE)<>"",LEFT(INDIRECT("R[0]C[2]",FALSE),10),"")');
  39. var startTimeFormulas = Array(currentBatchSize).fill('=IF(INDIRECT("R[0]C[1]",FALSE)<>"",MID(INDIRECT("R[0]C[1]",FALSE),12,8),"")');
  40.  
  41. sheet.getRange(i, startedAtCol, currentBatchSize, 1).setFormulas(startDateFormulas.map(f => [f]));
  42. sheet.getRange(i, startedAtCol + 1, currentBatchSize, 1).setFormulas(startTimeFormulas.map(f => [f]));
  43.  
  44. if (i % (batchSize * 5) === 0) {
  45. SpreadsheetApp.flush();
  46. Utilities.sleep(50);
  47. }
  48. }
  49.  
  50. // Split Completed At into Date and Time
  51. var completedAtCol = 7;
  52. sheet.insertColumnsBefore(completedAtCol, 2);
  53. sheet.getRange(1, completedAtCol).setValue('Complete Date');
  54. sheet.getRange(1, completedAtCol + 1).setValue('Complete Time');
  55.  
  56. var completedAtRange = sheet.getRange(2, completedAtCol + 2, lastRow - 1);
  57. var completeDateRange = sheet.getRange(2, completedAtCol, lastRow - 1);
  58. var completeTimeRange = sheet.getRange(2, completedAtCol + 1, lastRow - 1);
  59.  
  60. // Process completed date/time formulas in batches
  61. for (var i = 2; i <= lastRow; i += batchSize) {
  62. var currentBatchSize = Math.min(batchSize, lastRow - i + 1);
  63. var completeDateFormulas = Array(currentBatchSize).fill('=IF(INDIRECT("R[0]C[2]",FALSE)<>"",LEFT(INDIRECT("R[0]C[2]",FALSE),10),"")');
  64. var completeTimeFormulas = Array(currentBatchSize).fill('=IF(INDIRECT("R[0]C[1]",FALSE)<>"",MID(INDIRECT("R[0]C[1]",FALSE),12,8),"")');
  65.  
  66. sheet.getRange(i, completedAtCol, currentBatchSize, 1).setFormulas(completeDateFormulas.map(f => [f]));
  67. sheet.getRange(i, completedAtCol + 1, currentBatchSize, 1).setFormulas(completeTimeFormulas.map(f => [f]));
  68.  
  69. if (i % (batchSize * 5) === 0) {
  70. SpreadsheetApp.flush();
  71. Utilities.sleep(50);
  72. }
  73. }
  74.  
  75. // Format date and time columns
  76. sheet.getRange(2, startedAtCol, lastRow - 1).setNumberFormat('yyyy-mm-dd');
  77. sheet.getRange(2, completedAtCol, lastRow - 1).setNumberFormat('yyyy-mm-dd');
  78. sheet.getRange(2, startedAtCol + 1, lastRow - 1).setNumberFormat('hh:mm:ss');
  79. sheet.getRange(2, completedAtCol + 1, lastRow - 1).setNumberFormat('hh:mm:ss');
  80.  
  81. // Split Reward column
  82. spreadsheet.getRange('C:C').activate();
  83. sheet.insertColumnsBefore(spreadsheet.getActiveRange().getColumn(), 1);
  84. spreadsheet.getRange('B1:B' + lastRow).activate();
  85. spreadsheet.getRange('B1:B' + lastRow).splitTextToColumns('$');
  86.  
  87. // Batch process currency formatting
  88. var rewardRange = sheet.getRange('B:B');
  89. var rewardUSDRange = sheet.getRange('C:C');
  90. rewardRange.setNumberFormat('[>0]£#,##0.00;[<0]-£#,##0.00;""');
  91. rewardUSDRange.setNumberFormat('[>0]$#,##0.00;[<0]-$#,##0.00;""');
  92. sheet.getRange('B1').setValue('Reward (£)');
  93. sheet.getRange('C1').setValue('Reward ($)');
  94.  
  95. SpreadsheetApp.flush();
  96. Utilities.sleep(100);
  97.  
  98. // Split Bonus column
  99. spreadsheet.getRange('E:E').activate();
  100. sheet.insertColumnsBefore(spreadsheet.getActiveRange().getColumn(), 1);
  101. spreadsheet.getRange('D1:D' + lastRow).activate();
  102. spreadsheet.getRange('D1:D' + lastRow).splitTextToColumns('$');
  103.  
  104. // Batch process bonus currency formatting
  105. var bonusRange = sheet.getRange('D:D');
  106. var bonusUSDRange = sheet.getRange('E:E');
  107. bonusRange.setNumberFormat('[>0]£#,##0.00;[<0]-£#,##0.00;""');
  108. bonusUSDRange.setNumberFormat('[>0]$#,##0.00;[<0]-$#,##0.00;""');
  109. sheet.getRange('D1').setValue('Bonus (£)');
  110. sheet.getRange('E1').setValue('Bonus ($)');
  111.  
  112. // Move Bonus (£) after Reward (£)
  113. sheet.moveColumns(sheet.getRange('D:D'), 3);
  114.  
  115. SpreadsheetApp.flush();
  116. Utilities.sleep(100);
  117.  
  118. // === Time Calculations Optimization ===
  119.  
  120. // Insert Time Taken column and calculate with multi-day support
  121. var timeCol = sheet.getLastColumn() + 1;
  122. sheet.insertColumnBefore(timeCol);
  123. sheet.getRange(1, timeCol).setValue('Time Taken');
  124.  
  125. // Batch process time calculations
  126. var batchSize = 50; // Smaller batch size for complex calculations
  127. for (var i = 2; i <= lastRow; i += batchSize) {
  128. var currentBatchSize = Math.min(batchSize, lastRow - i + 1);
  129.  
  130. // Create array of formulas for the current batch
  131. var formulas = Array(currentBatchSize).fill().map(function(_, index) {
  132. var row = i + index;
  133. return ['=IF(AND(G' + row + '<>"",J' + row + '<>""),' +
  134. 'IF(J' + row + '<G' + row + ',J' + row + '-G' + row + '+1,J' + row + '-G' + row + '),' +
  135. '"")'];
  136. });
  137.  
  138. // Apply formulas to the current batch
  139. sheet.getRange(i, timeCol, currentBatchSize, 1).setFormulas(formulas);
  140.  
  141. // Force partial calculation after each batch
  142. if (i % (batchSize * 2) === 0) {
  143. SpreadsheetApp.flush();
  144. Utilities.sleep(50);
  145. }
  146. }
  147.  
  148. // Set number format for the entire Time Taken column
  149. sheet.getRange(2, timeCol, lastRow - 1).setNumberFormat('[hh]:mm:ss');
  150.  
  151. SpreadsheetApp.flush();
  152. Utilities.sleep(100);
  153.  
  154. // Enhanced auto-resize approach
  155. var lastColumn = sheet.getLastColumn();
  156. var allData = sheet.getRange(1, 1, lastRow, lastColumn).getValues();
  157. var headers = allData[0];
  158.  
  159. // Batch process column resizing
  160. for (var i = 1; i <= lastColumn; i += 5) {
  161. var batchEnd = Math.min(i + 4, lastColumn);
  162.  
  163. for (var j = i; j <= batchEnd; j++) {
  164. var headerContent = headers[j-1].toString();
  165.  
  166. // Column width settings
  167. if (headerContent === 'Date') { // Exact match for Date
  168. sheet.setColumnWidth(j, 25);
  169. } else if (headerContent === 'Start Date' || headerContent === 'Complete Date') {
  170. sheet.setColumnWidth(j, 25);
  171. } else if (headerContent.includes('Time') || headerContent === 'Started At' || headerContent === 'Completed At') {
  172. sheet.setColumnWidth(j, 140);
  173. } else if (headerContent === 'Completion Code') {
  174. sheet.setColumnWidth(j, 200);
  175. } else if (headerContent.includes('Reward') || headerContent.includes('Bonus')) {
  176. sheet.setColumnWidth(j, 90);
  177. } else if (headerContent === 'Status') {
  178. sheet.setColumnWidth(j, 130);
  179. } else if (headerContent === 'Year') { // Exact match for Year
  180. sheet.setColumnWidth(j, 25);
  181. } else if (headerContent === 'Applicable Terms') {
  182. sheet.setColumnWidth(j, 140);
  183. } else {
  184. sheet.autoResizeColumn(j);
  185. var currentWidth = sheet.getColumnWidth(j);
  186. sheet.setColumnWidth(j, currentWidth + 20);
  187. }
  188.  
  189. // Debug logging
  190. Logger.log('Column ' + j + ' (' + headerContent + '): Setting width');
  191.  
  192. // Column alignment settings
  193. if (headerContent === 'Date' || headerContent.includes('Time') ||
  194. headerContent === 'Started At' || headerContent === 'Completed At') {
  195. sheet.getRange(1, j, lastRow, 1).setHorizontalAlignment('left');
  196. } else if (headerContent.includes('Reward') || headerContent.includes('Bonus')) {
  197. sheet.getRange(1, j, lastRow, 1).setHorizontalAlignment('right');
  198. } else if (headerContent === 'Status' || headerContent === 'Year') {
  199. sheet.getRange(1, j, lastRow, 1).setHorizontalAlignment('left');
  200. } else if (headerContent === 'Study') {
  201. sheet.getRange(1, j, lastRow, 1).setHorizontalAlignment('left');
  202. sheet.getRange(1, j, lastRow, 1).setWrapStrategy(SpreadsheetApp.WrapStrategy.WRAP);
  203. }
  204. }
  205.  
  206. // Force update after each batch
  207. SpreadsheetApp.flush();
  208. Utilities.sleep(50);
  209. }
  210.  
  211. // === Second Macro Operations ===
  212.  
  213. // Store current column layout
  214. headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
  215. var startDateCol = headers.indexOf('Start Date') + 1;
  216. var completeTimeCol = headers.indexOf('Complete Time') + 1;
  217. var timeTakenCol = headers.indexOf('Time Taken') + 1;
  218. var completedAtCol = headers.indexOf('Completed At') + 1;
  219.  
  220. // Store Time Taken values
  221. var timeTakenRange = sheet.getRange(1, timeTakenCol, lastRow);
  222. var timeTakenValues = timeTakenRange.getValues();
  223.  
  224. // Copy Start Date to new column at the end
  225. var lastCol = sheet.getLastColumn();
  226. sheet.insertColumnAfter(lastCol);
  227. var newCol = lastCol + 1;
  228. sheet.getRange(1, startDateCol, lastRow).copyTo(
  229. sheet.getRange(1, newCol),
  230. SpreadsheetApp.CopyPasteType.PASTE_VALUES,
  231. false
  232. );
  233.  
  234. // Move the new column to position 1 and rename it to "Date"
  235. sheet.moveColumns(sheet.getRange(1, newCol), 1);
  236. sheet.getRange('A1').setValue('Date');
  237.  
  238. // Move Time Taken column after Completed At
  239. headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
  240. timeTakenCol = headers.indexOf('Time Taken') + 1;
  241. completedAtCol = headers.indexOf('Completed At') + 1;
  242. if (timeTakenCol > 0 && completedAtCol > 0) {
  243. sheet.moveColumns(sheet.getRange(1, timeTakenCol), completedAtCol + 1);
  244. }
  245.  
  246. // Hide columns in batches
  247. var columnsToHide = ['Start Date', 'Complete Date', 'Started At', 'Completed At'];
  248. headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
  249. columnsToHide.forEach(function(colName) {
  250. var colIndex = headers.indexOf(colName) + 1;
  251. if (colIndex > 0 && colIndex !== 1) { // Don't hide the first column
  252. sheet.hideColumn(sheet.getRange(1, colIndex));
  253. }
  254. });
  255.  
  256. // Add Year column in position Q (17)
  257. sheet.insertColumnAfter(16); // Insert after column P
  258. sheet.getRange(1, 17).setValue('Year');
  259.  
  260. // Batch process Year formula
  261. var batchSize = 100;
  262. for (var i = 2; i <= lastRow; i += batchSize) {
  263. var currentBatchSize = Math.min(batchSize, lastRow - i + 1);
  264. var yearFormulas = Array(currentBatchSize).fill(['=YEAR(A' + i + ')']);
  265. sheet.getRange(i, 17, currentBatchSize, 1)
  266. .setFormulas(yearFormulas)
  267. .setNumberFormat('0');
  268.  
  269. if (i % (batchSize * 5) === 0) {
  270. SpreadsheetApp.flush();
  271. Utilities.sleep(50);
  272. }
  273. }
  274.  
  275. // Re-enable automatic calculations
  276. properties.deleteProperty('calculationMode');
  277.  
  278. // Final flush and cleanup
  279. SpreadsheetApp.flush();
  280. Utilities.sleep(200);
  281.  
  282. // Remove extra columns - more aggressive approach
  283. var lastColumn = sheet.getLastColumn();
  284. var yearColIndex = -1;
  285.  
  286. // Find the Year column
  287. var headers = sheet.getRange(1, 1, 1, lastColumn).getValues()[0];
  288. for (var i = 0; i < headers.length; i++) {
  289. if (headers[i] === 'Year') {
  290. yearColIndex = i + 1;
  291. break;
  292. }
  293. }
  294.  
  295. // If Year column found, delete all columns after it
  296. if (yearColIndex > 0) {
  297. try {
  298. // Get the total number of columns in the sheet
  299. var totalColumns = sheet.getMaxColumns();
  300.  
  301. // Calculate how many columns to delete
  302. var columnsToDelete = totalColumns - yearColIndex;
  303.  
  304. // Delete extra columns if they exist
  305. if (columnsToDelete > 0) {
  306. sheet.deleteColumns(yearColIndex + 1, columnsToDelete);
  307. }
  308. } catch (e) {
  309. Logger.log('Error deleting columns: ' + e.toString());
  310. }
  311. }
  312.  
  313. // Format specific columns
  314. headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
  315.  
  316. headers.forEach(function(header, index) {
  317. var colIndex = index + 1;
  318.  
  319. switch(header) {
  320. case 'Date':
  321. sheet.setColumnWidth(colIndex, 85);
  322. sheet.getRange(1, colIndex, lastRow, 1).setHorizontalAlignment('left');
  323. break;
  324. case 'Reward (£)':
  325. case 'Reward ($)':
  326. case 'Bonus (£)':
  327. case 'Bonus ($)':
  328. sheet.setColumnWidth(colIndex, 90);
  329. sheet.getRange(1, colIndex, lastRow, 1).setHorizontalAlignment('right');
  330. break;
  331. case 'Start Time':
  332. case 'Time Taken':
  333. sheet.setColumnWidth(colIndex, 95);
  334. sheet.getRange(1, colIndex, lastRow, 1).setHorizontalAlignment('left');
  335. break;
  336. case 'Complete Time':
  337. sheet.setColumnWidth(colIndex, 120);
  338. sheet.getRange(1, colIndex, lastRow, 1).setHorizontalAlignment('left');
  339. break;
  340. case 'Completion Code':
  341. sheet.setColumnWidth(colIndex, 200);
  342. sheet.getRange(1, colIndex, lastRow, 1).setHorizontalAlignment('left');
  343. break;
  344. case 'Status':
  345. sheet.setColumnWidth(colIndex, 130);
  346. sheet.getRange(1, colIndex, lastRow, 1).setHorizontalAlignment('left');
  347. break;
  348. case 'Applicable Terms':
  349. sheet.setColumnWidth(colIndex, 140);
  350. sheet.getRange(1, colIndex, lastRow, 1).setHorizontalAlignment('left');
  351. break;
  352. case 'Year':
  353. sheet.setColumnWidth(colIndex, 60);
  354. sheet.getRange(1, colIndex, lastRow, 1).setHorizontalAlignment('right');
  355. break;
  356. }
  357. });
  358.  
  359. SpreadsheetApp.flush();
  360. Utilities.sleep(100);
  361.  
  362. // === Final Operations ===
  363.  
  364. // Create filter and freeze row
  365. sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()).createFilter();
  366. sheet.setFrozenRows(1);
  367.  
  368. // Set final cursor position to A2
  369. sheet.getRange('A2').activate();
  370.  
  371. // Final recalculation
  372. SpreadsheetApp.flush();
  373. }
Advertisement
Add Comment
Please, Sign In to add comment