I have an onEdit() function that hosts 3 different onEdit() functions. I know the question has been asked several times and I have tested the solutions of many of these answers but I don’t understand why it doesn’t work.
In my script, which I wrote based on the most relevant answer, onEdit1(event) and onEdit2(event) work but not onEdit3(event). I have the impression that there is a problem with “event.range” but I can’t solve it.
Can you tell me what I did wrong?
Here is my script:
JavaScript
x
65
65
1
function onEdit(event) {
2
onEdit1(event);
3
onEdit2(event);
4
onEdit3(event);
5
}
6
7
//ADD COLOR MPR MASTER TAB
8
function onEdit1(event) {
9
var sss = event.source;
10
var sourceSheet = sss.getActiveSheet();
11
var shName = sourceSheet.getName();
12
var crange = event.range;
13
var crow = crange.getRow();
14
var ccol = crange.getColumn();
15
16
if ((shName == "MASTER" ) && (ccol >= 38)){
17
var cvalue = crange.getValue();
18
var validationSheet = sss.getSheetByName("CALCULS");
19
var optionColor = validationSheet.createTextFinder(cvalue).findNext().getBackground();
20
crange.setBackground(optionColor);
21
22
var sourceOptionColor = sourceSheet.getRange(crow, 38).getBackground();
23
destSheet.getRange(destRow,38).setBackground(sourceOptionColor);
24
}
25
}
26
27
//MERGE BANQUE TAB
28
function onEdit2(event) {
29
let sh = event.source.getActiveSheet()
30
let onglets = ['BANQUE']
31
let shCol = event.range.getColumn()
32
let shRow = event.range.getRow()
33
let upRows = [25]
34
let upCols = [14]
35
console.log(shCol)
36
console.log(shRow)
37
if (onglets.indexOf(sh.getName()!=-1) && upRows.includes(shRow) && upCols.includes(shCol)){
38
mergeBanque()
39
}
40
}
41
42
//LOCK ROWS MASTER TAB
43
function onEdit3(event) {
44
let range = event.range; //get the range of edited cell
45
let row = range.getRow(); //get the row
46
let col = range.getColumn(); //get the column
47
let value = event.value; //get the new value of edited cell
48
let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('MASTER'); //get the sheet where edit is made
49
50
if(col == 69 && row >= 6 && value == 'TRUE'){ //check if the edited cell is BM and row is equal or greater than 5 and value is X
51
let lock_range = `B${row}:BQ${row}`; //set lock range using row
52
let protection = sheet.getRange(lock_range).protect() //set protection
53
.setDescription(`Ligne ${row}`) //add description
54
protection.addEditor(kamaramamedia);
55
protection.removeEditors(protection.getEditors()); //remove editors
56
}else if(col == 69 && row >= 6 && value == 'FALSE'){ //check if the edited cell is BL and row is equal or greater than 5 and value is O
57
var protectedRange = sheet.getProtections(SpreadsheetApp.ProtectionType.RANGE); //get all protection with type range
58
for (var i = 0; i < protectedRange.length; i++) { //loop
59
if (protectedRange[i].getDescription() == `Ligne ${row}`) { //row matching
60
protectedRange[i].remove(); //remove protection
61
}
62
}
63
}
64
}
65
Advertisement
Answer
I rewrote them as below:
JavaScript
1
29
29
1
function onEdit(e) {
2
onEdit1(e);
3
onEdit2(e);
4
onEdit3(e);
5
}
6
7
//ADD COLOR MPR MASTER TAB
8
function onEdit1(e) {
9
const sh = e.range.getSheet();
10
if ((sh.getName() == "MASTER" ) && (e.range.columnStart >= 38)){
11
var validationSheet = e.source.getSheetByName("CALCULS");
12
var optionColor = validationSheet.createTextFinder(e.value).findNext().getBackground();
13
e.range.setBackground(optionColor);
14
var sourceOptionColor = sh.getRange(e.range.rowStart, 38).getBackground();
15
destSheet.getRange(destRow,38).setBackground(sourceOptionColor);
16
}
17
}
18
19
//MERGE BANQUE TAB
20
function onEdit2(e) {
21
let sh = e.range.getSheet();
22
let onglets = ['BANQUE']
23
let upRows = [25]
24
let upCols = [14]
25
if (~onglets.indexOf(sh.getName()) && upRows.includes(e.range.rowStart) && upCols.includes(e.range.columnStart)){
26
mergeBanque()//undefined function so I cannot comment
27
}
28
}
29
- The one requires permissions so it needs to be an installable trigger
JavaScript
1
8
1
//LOCK ROWS MASTER TAB
2
function onEdit3(e) {
3
let sheet = e.source.getSheetByName('MASTER');
4
if(e.range.columnStart == 69 && e.range.rowStart > 5 && e.value == 'TRUE'){
5
let lock_range = `B${e.range.rowStart}:BQ${e.range.rowStart}`;
6
let protection = sheet.getRange(lock_range).protect().setDescription(`Ligne ${e.range.rowStart}`);
7
8
This line has an undefined variable
JavaScript112121protection.addEditor(kamaramamedia);
2
3protection.removeEditors(protection.getEditors());
4}else if(e.range.columnStart == 69 && e.range.rowStart > 5 && e.value == 'FALSE'){
5var protectedRange = sheet.getProtections(SpreadsheetApp.ProtectionType.RANGE);
6for (var i = 0; i < protectedRange.length; i++) {
7if (protectedRange[i].getDescription() == `Ligne ${e.range.rowStart}`) {
8protectedRange[i].remove();
9}
10}
11}
12
}
The other possibility is that number 3 just takes to long because simple triggers must finish in 30 seconds. Try using installable trigger.