javascriptgoogle-apps-scriptsetbackground

App Script - How can I Speed up My setBackground() function?


I'm struggling with my setBackground() function on App script. How can I speed it up? It's working but the execution is very slow.

I have written this:

function changeColor(sheetName, startColorCol, sizeCellCol, totalCellCol) {

    var sSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName)

    for (z = startColorCol; z <= totalCellCol; z = z + sizeCellCol) {

        // As this is called onEdit() we don't want to perform the entire script every time a cell is
        // edited- only when a status cell is mofified. 
        // To ensure this, before anything else we check to see if the modified cell is actually in the status column.
        if (sSheet.getActiveCell().getColumn() == z) {
            var row = sSheet.getActiveRange().getRow();
            var value = sSheet.getActiveCell().getValue();
            var col = "white"; // Default background color
            var colLimit = z; // Number of columns across to affect

            switch (value) {
                case "fait":
                    col = "MediumSeaGreen";
                    break;
                case "sans réponse":
                    col = "Orange";
                    break;
                case "proposition":
                    col = "Skyblue";
                    break;
                case "Revisions Req":
                    col = "Gold";
                    break;
                case "annulé":
                    col = "LightCoral";
                    break;
                default:
                    break;
            }
            if (row >= 3) {
                sSheet.getRange(row, z - 2, 1, sizeCellCol).setBackground(col);
            }
        }
    }
}

I saw I might need to use batch operations but I have no idea how to make it works.

The thing is, I need to color a range of cells when the value of one is changed. Any ideas ?

Thanks


Solution

  • Issues:

    Solution:

    Code sample:

    function onEdit(e) {
      // ...Some stuff...
      changeColor(e, sheetName, startColorCol,sizeCellCol, totalCellCol);
    }
    
    function changeColor(e, sheetName, startColorCol,sizeCellCol, totalCellCol) {
      const range = e.range;
      const column = range.getColumn();
      const row = range.getRow();
      const sSheet = range.getSheet();
      if (sSheet.getName() === sheetName && column >= startColorCol && column <= totalCellCol && row >= 3) {
        const value = range.getValue();
        let col = "white"; // Default background color
        switch (value) {
          case "fait":
            col = "MediumSeaGreen";
            break;
          case "sans réponse":
            col = "Orange";
            break;
          case "proposition":
            col = "Skyblue";
            break;
          case "Revisions Req":
            col = "Gold";
            break;
          case "annulé":
            col = "LightCoral";
            break;
          default:
            break;  
        }
        sSheet.getRange(row, column-2, 1, sizeCellCol).setBackground(col);
      }
    }