Trai60

Google Sheets Macro

Dec 26th, 2024 (edited)
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.50 KB | None | 0 0
  1. function ProlificMacro01() {
  2. var spreadsheet = SpreadsheetApp.getActive();
  3. var sheet = spreadsheet.getActiveSheet();
  4.  
  5. // Get the last row with data
  6. var lastRow = sheet.getLastRow();
  7.  
  8. // Insert Time Taken column
  9. spreadsheet.getRange('F:F').activate();
  10. sheet.insertColumnsBefore(spreadsheet.getActiveRange().getColumn(), 1);
  11. spreadsheet.getRange('F2').activate();
  12. spreadsheet.getCurrentCell().setFormula('=IF(AND(D2<>"",E2<>""),E2-D2,"")');
  13. spreadsheet.getActiveRange().autoFill(spreadsheet.getRange('F2:F' + lastRow), SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);
  14. spreadsheet.getRange('F:F').activate();
  15. spreadsheet.getActiveRangeList().setNumberFormat('[hh]:mm:ss');
  16. spreadsheet.getRange('F1').activate();
  17. spreadsheet.getCurrentCell().setValue('Time Taken');
  18.  
  19. // Split Reward column
  20. spreadsheet.getRange('C:C').activate();
  21. sheet.insertColumnsBefore(spreadsheet.getActiveRange().getColumn(), 1);
  22. spreadsheet.getRange('B1:B' + lastRow).activate();
  23. spreadsheet.getRange('B1:B' + lastRow).splitTextToColumns('$');
  24. spreadsheet.getRange('B:B').activate();
  25. spreadsheet.getActiveRangeList().setNumberFormat('[>0]£#,##0.00;[<0]-£#,##0.00;""');
  26. spreadsheet.getRange('C:C').activate();
  27. spreadsheet.getActiveRangeList().setNumberFormat('[>0]$#,##0.00;[<0]-$#,##0.00;""');
  28. spreadsheet.getRange('B1').activate();
  29. spreadsheet.getCurrentCell().setValue('Reward (£)');
  30. spreadsheet.getRange('C1').activate();
  31. spreadsheet.getCurrentCell().setValue('Reward ($)');
  32.  
  33. // Split Bonus column
  34. spreadsheet.getRange('E:E').activate();
  35. sheet.insertColumnsBefore(spreadsheet.getActiveRange().getColumn(), 1);
  36. spreadsheet.getRange('D1:D' + lastRow).activate();
  37. spreadsheet.getRange('D1:D' + lastRow).splitTextToColumns('$');
  38. spreadsheet.getRange('D:D').activate();
  39. spreadsheet.getActiveRangeList().setNumberFormat('[>0]£#,##0.00;[<0]-£#,##0.00;""');
  40. spreadsheet.getRange('E:E').activate();
  41. spreadsheet.getActiveRangeList().setNumberFormat('[>0]$#,##0.00;[<0]-$#,##0.00;""');
  42. spreadsheet.getRange('D1').activate();
  43. spreadsheet.getCurrentCell().setValue('Bonus (£)');
  44. spreadsheet.getRange('E1').activate();
  45. spreadsheet.getCurrentCell().setValue('Bonus ($)');
  46.  
  47. // Move columns
  48. spreadsheet.getRange('D:D').activate();
  49. sheet.moveColumns(spreadsheet.getRange('D:D'), 3);
  50.  
  51. // Enhanced auto-resize approach with special handling for date/time columns
  52. var lastColumn = sheet.getLastColumn();
  53.  
  54. // Force load all data
  55. var allData = sheet.getRange(1, 1, lastRow, lastColumn).getValues();
  56. var headers = allData[0];
  57.  
  58. // Wait for calculations
  59. Utilities.sleep(1000);
  60.  
  61. // Resize columns with specific handling for different column types
  62. for (var i = 1; i <= lastColumn; i++) {
  63. // First auto-resize based on all content
  64. sheet.autoResizeColumn(i);
  65.  
  66. // Get header content
  67. var headerContent = headers[i-1].toString();
  68.  
  69. // Define fixed widths for date/time columns
  70. if (headerContent === 'Started At' || headerContent === 'Completed At') {
  71. sheet.setColumnWidth(i, 150); // Fixed width for datetime columns
  72. sheet.getRange(1, i, lastRow, 1).setHorizontalAlignment('left');
  73. } else if (headerContent === 'Time Taken') {
  74. sheet.setColumnWidth(i, 100); // Fixed width for time duration column
  75. sheet.getRange(1, i, lastRow, 1).setHorizontalAlignment('left');
  76. } else if (headerContent === 'Completion Code') {
  77. sheet.setColumnWidth(i, 200); // Fixed width for Completion Code column
  78. sheet.getRange(1, i, lastRow, 1).setHorizontalAlignment('left');
  79. } else {
  80. // For other columns, calculate width based on content
  81. var currentWidth = sheet.getColumnWidth(i);
  82. var headerWidth = headerContent.length * 8;
  83.  
  84. // Get maximum content width in column
  85. var maxContentWidth = 0;
  86. for (var row = 0; row < lastRow; row++) {
  87. var cellContent = allData[row][i-1].toString();
  88. var contentWidth = cellContent.length * 8;
  89. maxContentWidth = Math.max(maxContentWidth, contentWidth);
  90. }
  91.  
  92. // Use the larger of header width or content width, plus padding
  93. var newWidth = Math.max(headerWidth, maxContentWidth, currentWidth) + 20;
  94. sheet.setColumnWidth(i, newWidth);
  95. }
  96. }
  97.  
  98. // Add filter and freeze header row
  99. sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()).createFilter();
  100. sheet.setFrozenRows(1);
  101.  
  102. // Final force refresh
  103. sheet.getRange(1, 1, lastRow, lastColumn).activate();
  104. }
Advertisement
Add Comment
Please, Sign In to add comment