'How to solve this error "getRange is not a function" in google apps script?

I wrote a code as follows. When I run the deLete function here, I get this TypeError: tab.getRange is not a function error. At first I did not have a problem writing the code. But then when adding various functions to this, did he have a problem? Can you help me solve this? enter image description here

Originally the variable was like this

 var [tabb,x4, start,x1, end,x2, side,x3, item] = sheet.getRange("C5:C13").getValues().flat();
  var [tesNo,y1, rfiNo] = sheet.getRange("G15:G17").getValues().flat();

After the error came, I tried to change it as follows

const tab =spreadsheet.getSheetByName(spreadsheet.getActiveSheet().getRange("C5").getValue());

This is the function that receives the error

var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Data Entry Form');
  var regiWs = ss.getSheetByName('Data Registry');
  const spreadsheet = SpreadsheetApp.getActive();
  const tab =spreadsheet.getSheetByName(spreadsheet.getActiveSheet().getRange("C5").getValue());

        function get_rows(tab, side, item) {
      try{
        Logger.log("test "+tab);
        // var tab = ss.getSheetByName(c5);//copy
      var items = tab.getRange("C:C").getValues().flat();
      if (side == 'LHS') return [items.indexOf(item) + 1];
      if (side == 'RHS') return [items.lastIndexOf(item) + 1];
      if (side == "BOTH SIDE") return [items.indexOf(item) + 1, items.lastIndexOf(item) + 1];
      //return []; // just in case, to avoud any errors due trash input data
      }catch(err){
        Logger.log("ERROR-get_rows "+ err)
      }
    }
    
    //find location & clor the bar
    function colorize_rows(tab, rows, start, end) {
      //var tab = ss.getSheetByName(c5); //copy
      var chainage_row = tab.getRange('c:c').getValues().flat().indexOf('Chainage') + 1;
      var chainage = tab.getRange(chainage_row, 4, 1, tab.getLastColumn()).getValues().flat();
      var start_index = chainage.findIndex(x => x > start);
      var end_index = chainage.findIndex(x => x >= end) - start_index;
    
      var tesNo= sheet.getRange("G15").getValue();
      var rfiNo= sheet.getRange("G17").getValue();
      var comment =tesNo+" => "+rfiNo;
    
      for (row of rows) {
        var color = tab.getRange('c' + row).getBackground();
            if(tab.getRange(row, start_index+3, 1, end_index+1).isPartOfMerge() == true){
              SpreadsheetApp.getUi().alert("Can't mark the vlaues in bar chart. Part length  or full length of it has overlapped. Please check it.");
              Logger.log("Can't mark the bar chart, it's part length  or full length overlapped")
              //to be run delete last record
    
    
    }else{
      tab.getRange(row, start_index+3, 1, end_index+1)
        .setBackground(color)
        .mergeAcross()
        .setValue(comment)    
        .setHorizontalAlignment("center")
        .setVerticalAlignment("center")
        .setBorder(null, true, null, true, false, false);
        }
      }   
    }
    
    
    //use for edit & delete
    function unMerge(tab, rows, start, end) {
      
      Logger.log("trst "+tab);
      var chainage_row = tab.getRange("C:C").getValues().flat().indexOf('Chainage') + 1;
      var chainage = tab.getRange(chainage_row, 4, 1, tab.getLastColumn()).getValues().flat();
      var start_index = chainage.findIndex(x => x > start);
      var end_index = chainage.findIndex(x => x >= end) - start_index;
    
    
      for (row of rows) {
        var color = tab.getRange('c' + row).getBackground();
            tab.getRange(row, start_index+3, 1, end_index+1).clear().setBackground(null).breakApart();
      }  
    
    }
    
    //Delete function unmerge barchart
    function deLete() {
      
      var [tab,x4,start,x1, end,x2, side,x3, item] = sheet.getRange("C5:C13").getValues().flat();
      var [tesNo,y1, rfiNo] = sheet.getRange("G15:G17").getValues().flat();
    
    
    
      var rows = get_rows(tab, side, item);
      unMerge(tab, rows, start, end);
    
    }
    
    //set delete button
    function deleteRocrd(){
     //before check save or edit and after save new record
    if(searchCell == ""){
      return
    }
    
    if(accept == true){
    //set edit
    const cellfound = regiWs.getRange("A2:A")
                        .createTextFinder(idCell)
                        .matchCase(true)
                        .matchEntireCell(true)
                        .findNext();
    if(!cellfound) return
    const rowNo = cellfound.getRowIndex();
    regiWs.deleteRow(rowNo);
    deLete();
    newRecord();
    // ss.toast("Recrod Deleted..!","Delete Id:- "+idCell);
    }
    else{
     SpreadsheetApp.getUi().alert("Please tick the I Confirmed checkbox");
      return
    }
    }

How can this problem be solved? I printed in the log and searched for myself? But I don't know if it's worth it.



Solution 1:[1]

If you run deLete() first then tab is not a sheet it is assigned a value

function deLete() {
  var [tab, x4, start, x1, end, x2, side, x3, item] = sheet.getRange("C5:C13").getValues().flat();//tab is assigned a value
  var [tesNo, y1, rfiNo] = sheet.getRange("G15:G17").getValues().flat();
  var rows = get_rows(tab, side, item);
  unMerge(tab, rows, start, end);//tab is not a sheet here
}

function unMerge(tab, rows, start, end) {
  Logger.log("trst " + tab);
  var chainage_row = tab.getRange("C:C").getValues().flat().indexOf('Chainage') + 1;
  var chainage = tab.getRange(chainage_row, 4, 1, tab.getLastColumn()).getValues().flat();
  var start_index = chainage.findIndex(x => x > start);
  var end_index = chainage.findIndex(x => x >= end) - start_index;
  for (row of rows) {
    var color = tab.getRange('c' + row).getBackground();
    tab.getRange(row, start_index + 3, 1, end_index + 1).clear().setBackground(null).breakApart();
  }
}

Change one of the variables and rewrite the function

Globally tab is defined as:

const tab =spreadsheet.getSheetByName(spreadsheet.getActiveSheet().getRange("C5").getValue()); globally it's a sheet

but in the delete function tab is defined:

var [tab, x4, start, x1, end, x2, side, x3, item] = sheet.getRange("C5:C13").getValues().flat();

inside delete it's the name of the sheet

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1