'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?

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 |
