Comment appliquer Google Apps Script à plusieurs feuilles

Sep 25 2020

Je souhaite appliquer le code suivant à plusieurs onglets dans la même feuille Google. La définition de différents onglets dans la première variable ou l'application de plusieurs fichiers .gs dans le même projet, chacun avec une variable différente, n'a pas abouti.

var naamWerkbladKasboek = "Kasboek"; 
var naamWerkbladOpties = "Opties";
var eersteKolomMetInput = 2; 
var tweedeKolomMetInput = 3; 
var derdeKolomMetInput = 4; 

var werkblad = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(naamWerkbladKasboek);
var werkbladOpties = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(naamWerkbladOpties);
var Opties = werkbladOpties.getRange(2, 1, werkbladOpties.getLastRow()-1, 3).getValues();


function onEdit(e){
  var activeCell = e.range;
  var val = activeCell.getValue();
  var row = activeCell.getRow();
  var column = activeCell.getColumn();
  var werkbladName = activeCell.getSheet().getName();
  
  if(werkbladName === naamWerkbladKasboek && column === eersteKolomMetInput && row > 1){
    applyFirstLevelValidation(val, row);
  } else if(werkbladName === naamWerkbladKasboek && column === tweedeKolomMetInput && row > 1){ 
    applySecondLevelValidation(val, row);
  }
} 

function applyFirstLevelValidation(val, row){
  
  if(val === ""){
      werkblad.getRange(row, tweedeKolomMetInput).clearContent();
      werkblad.getRange(row, tweedeKolomMetInput).clearDataValidations();
      werkblad.getRange(row, derdeKolomMetInput).clearContent();
      werkblad.getRange(row, derdeKolomMetInput).clearDataValidations();
    } else {
      werkblad.getRange(row, tweedeKolomMetInput).clearContent();
      werkblad.getRange(row, tweedeKolomMetInput).clearDataValidations();
      werkblad.getRange(row, derdeKolomMetInput).clearContent();
      werkblad.getRange(row, derdeKolomMetInput).clearDataValidations();
      var gefilterdeOpties = Opties.filter(function(o){ return o[0] === val });
      var listToApply = gefilterdeOpties.map(function(o){ return o[1] });
      var cell = werkblad.getRange(row, tweedeKolomMetInput);
      applyValidationToCell(listToApply,cell);
    }
}


function applySecondLevelValidation(val, row){
  
  if(val === ""){
      werkblad.getRange(row, derdeKolomMetInput).clearContent();
      werkblad.getRange(row, derdeKolomMetInput).clearDataValidations();
    } else {
      werkblad.getRange(row, derdeKolomMetInput).clearContent();
      var waardeEersteKolomMetInput = werkblad.getRange(row, eersteKolomMetInput).getValue();
      var gefilterdeOpties = Opties.filter(function(o){ return o[0] === waardeEersteKolomMetInput && o[1] === val });
      var listToApply = gefilterdeOpties.map(function(o){ return o[2] });
      var cell = werkblad.getRange(row, derdeKolomMetInput);
      applyValidationToCell(listToApply,cell);
    }
}

function applyValidationToCell(list,cell){
  
  var rule = SpreadsheetApp
  .newDataValidation()
  .requireValueInList(list)
  .setAllowInvalid(false)
  .build();
  
  cell.setDataValidation(rule)

}

J'ai essayé de travailler avec les seules balises et d'exclure comme indiqué ici: Comment exécuter un script sur plusieurs feuilles, Google Sheets et j'ai également essayé de travailler avec un tableau comme indiqué ici:https://webapps.stackexchange.com/questions/115076/how-to-run-script-on-multiple-google-sheet-tabsmais les deux en vain. Quelqu'un peut-il s'il vous plaît me diriger dans la bonne direction?

À titre d'exemple, je peux montrer comment j'ai essayé de travailler avec la seule balise

//**EDIT**
var only = [
"Kasboek1",
"Kasboek2",
"Kasboek3"
];
var naamWerkbladOpties = "Opties";
var eersteKolomMetInput = 2; 
var tweedeKolomMetInput = 3; 
var derdeKolomMetInput = 4; 

var werkblad = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(only);
var werkbladOpties = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(naamWerkbladOpties);
var Opties = werkbladOpties.getRange(2, 1, werkbladOpties.getLastRow()-1, 3).getValues();


function onEdit(e){
  var activeCell = e.range;
  var val = activeCell.getValue();
  var row = activeCell.getRow();
  var column = activeCell.getColumn();
  var werkbladName = activeCell.getSheet().getName();
  
  if(werkbladName === only && column === eersteKolomMetInput && row > 1){
    applyFirstLevelValidation(val, row);
  } else if(werkbladName === only && column === tweedeKolomMetInput && row > 1){ 
    applySecondLevelValidation(val, row);
  }
} 

function applyFirstLevelValidation(val, row){
  
  if(val === ""){
      werkblad.getRange(row, tweedeKolomMetInput).clearContent();
      werkblad.getRange(row, tweedeKolomMetInput).clearDataValidations();
      werkblad.getRange(row, derdeKolomMetInput).clearContent();
      werkblad.getRange(row, derdeKolomMetInput).clearDataValidations();
    } else {
      werkblad.getRange(row, tweedeKolomMetInput).clearContent();
      werkblad.getRange(row, tweedeKolomMetInput).clearDataValidations();
      werkblad.getRange(row, derdeKolomMetInput).clearContent();
      werkblad.getRange(row, derdeKolomMetInput).clearDataValidations();
      var gefilterdeOpties = Opties.filter(function(o){ return o[0] === val });
      var listToApply = gefilterdeOpties.map(function(o){ return o[1] });
      var cell = werkblad.getRange(row, tweedeKolomMetInput);
      applyValidationToCell(listToApply,cell);
    }
}


function applySecondLevelValidation(val, row){
  
  if(val === ""){
      werkblad.getRange(row, derdeKolomMetInput).clearContent();
      werkblad.getRange(row, derdeKolomMetInput).clearDataValidations();
    } else {
      werkblad.getRange(row, derdeKolomMetInput).clearContent();
      var waardeEersteKolomMetInput = werkblad.getRange(row, eersteKolomMetInput).getValue();
      var gefilterdeOpties = Opties.filter(function(o){ return o[0] === waardeEersteKolomMetInput && o[1] === val });
      var listToApply = gefilterdeOpties.map(function(o){ return o[2] });
      var cell = werkblad.getRange(row, derdeKolomMetInput);
      applyValidationToCell(listToApply,cell);
    }
}

function applyValidationToCell(list,cell){
  
  var rule = SpreadsheetApp
  .newDataValidation()
  .requireValueInList(list)
  .setAllowInvalid(false)
  .build();
  
  cell.setDataValidation(rule)

}

Réponses

3 George Sep 25 2020 at 19:27

dans le onEditvous vérifiez si le nom de la feuille courante contient "Kasboek"

function onEdit(e){
  var activeCell = e.range;
  var activeSheet = activeCell.getSheet();
  
  if(activeSheet.getName().includes("Kasboek")){
    KasboekModification(activeCell);
  } else {
    //code here if changes need to be made on other sheets
  }
}

Après cela, vous avez votre function KasboekModification(cell){}fonction où vous pouvez faire la magie de votre feuille actuelle.

3 RafaGuillermo Sep 25 2020 at 20:42

Répondre:

Une solution simple serait de revenir en dehors de onEdit(e)si la feuille qui a été éditée n'est pas l'une des feuilles prédéfinies à éditer.

Exemple de code:

A faire uniquement avec :

var only = ["Sheet1Name", "Sheet2Name", "Sheet3Name"]; // add sheet names as desired

function onEdit(e) {
  if (!(only.includes(e.range.getSheet().getName())) {
    return;
  }
  // put the rest of your onEdit function here
}

ou avec exclure :

var exclude = ["Sheet4Name", "Sheet5Name", "Sheet6Name"]; // add sheet names as desired

function onEdit(e) {
  if (exclude.includes(e.range.getSheet().getName())) {
    return;
  }
  // put the rest of your onEdit function here
}

Exemple pour votre cas d'utilisation:

var only = ["Kasboek", "Kasboek2", "Kasboek3"];

function onEdit(e) {
  if (!(only.includes(e.range.getSheet().getName())) {
    return;
  }

  var activeCell = e.range;
  var val = activeCell.getValue();
  var row = activeCell.getRow();

  if (row <= 1) return;

  var column = activeCell.getColumn();
  var eersteKolomMetInput = 2; 
  var tweedeKolomMetInput = 3; 
  var derdeKolomMetInput = 4;
  
  if (column === eersteKolomMetInput) {
    applyFirstLevelValidation(val, row);
  } 
  else if (column === tweedeKolomMetInput) {
    applySecondLevelValidation(val, row);
  }
} 

function applyFirstLevelValidation(val, row) {
  // ...
}

function applySecondLevelValidation(val, row) {
  // ...
}

J'espère que ça t'aide!

PainfullyStoic Sep 27 2020 at 13:15

TypeError: Impossible de lire la propriété 'range' de undefined (ligne 7, fichier "multipledatavalidation")

ligne 7; if (exclude.includes (e.range.getSheet (). getName ())) {return;

Il convient de noter que j'ai également un autre script sur ma feuille. Celui qui me permet de dupliquer la feuille avec son verrou en place. Je veux pouvoir exécuter ce code sur toutes les copies que je fais de la feuille originale. voici un lien vers une version partagée et modifiable de ma feuille .

     var optionsWsName = "Backend-Prices";
      var wsOptions = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(optionsWsName);
      var exclude = ["BackendImportedData", "donotedit", "BackendDataSort", "09/20_DS7"]; // add sheet names as desired
    
// function to update each time the file is Edited 

function onEdit(e){
      if (exclude.includes(e.range.getSheet().getName())) {
        return;
      }
      
      var Options = wsOptions.getRange(2, 1, wsOptions.getLastRow()-1, 5).getValues();
      var activeCell = e.range;
      var val = activeCell.getValue();
      var r = activeCell.getRow();
    
      if (r <= 8) return;
    
      var c = activeCell.getColumn();
      var FirstLevelColumn = 1;
      var SecondLevelColumn = 2; 
      var ThirdLevelColumn = 3; 
      var FourthLevelColumn = 4;
      
      
      if(c === FirstLevelColumn){
        applyFirstLevelValidation(val, r);
      } else if(c === SecondLevelColumn){ 
        applySecondLevelValidation(val, r);
      } else if(c === ThirdLevelColumn){ 
        applyThirdLevelValidation(val, r);
      }
    
}//end onEdit
    
    
    
    // function for second level of data validation to work correctly
    
function applyFirstLevelValidation(val, r){
      
      if(val === ""){
          ws.getRange(r, SecondLevelColumn).clearContent();
          ws.getRange(r, SecondLevelColumn).clearDataValidations();
          ws.getRange(r, ThirdLevelColumn).clearContent();
          ws.getRange(r, ThirdLevelColumn).clearDataValidations();
          ws.getRange(r, FourthLevelColumn).clearContent();
          ws.getRange(r, FourthLevelColumn).clearDataValidations();
        } else {
          ws.getRange(r, SecondLevelColumn).clearContent();
          ws.getRange(r, SecondLevelColumn).clearDataValidations();
          ws.getRange(r, ThirdLevelColumn).clearContent();
          ws.getRange(r, ThirdLevelColumn).clearDataValidations();
          ws.getRange(r, FourthLevelColumn).clearContent();
          ws.getRange(r, FourthLevelColumn).clearDataValidations();
          var filteredOptions = Options.filter(function(o){ return o[0] === val });
          var listToApply = filteredOptions.map(function(o){ return o[1] });
          var cell = ws.getRange(r, SecondLevelColumn);
          applyValidationToCell(listToApply,cell);
        }

}
    
    // function for third level of data validation to work correctly
    
function applySecondLevelValidation(val, r){
      
      if(val === ""){
          ws.getRange(r, ThirdLevelColumn).clearContent();
          ws.getRange(r, ThirdLevelColumn).clearDataValidations();
          ws.getRange(r, FourthLevelColumn).clearContent();
          ws.getRange(r, FourthLevelColumn).clearDataValidations();
        } else {
          ws.getRange(r, ThirdLevelColumn).clearContent();
          ws.getRange(r, ThirdLevelColumn).clearDataValidations();
          ws.getRange(r, FourthLevelColumn).clearContent();
          ws.getRange(r, FourthLevelColumn).clearDataValidations();
          var firstlevelColValue = ws.getRange(r, FirstLevelColumn).getValue();
          var filteredOptions = Options.filter(function(o){ return o[0] === firstlevelColValue && o[1] === val });
          var listToApply = filteredOptions.map(function(o){ return o[2] });
          var cell = ws.getRange(r, ThirdLevelColumn);
          applyValidationToCell(listToApply,cell);
        }
        
}
    
    
    // function for fourth level of data validation to work correctly
    
    function applyThirdLevelValidation(val, r){
      
      if(val === ""){
          ws.getRange(r, FourthLevelColumn).clearContent();
          ws.getRange(r, FourthLevelColumn).clearDataValidations();
        } else {
          ws.getRange(r, FourthLevelColumn).clearContent();
          var firstlevelColValue = ws.getRange(r, FirstLevelColumn).getValue();
          var secondlevelColValue = ws.getRange(r, SecondLevelColumn).getValue();
          var filteredOptions = Options.filter(function(o){ return o[0] === firstlevelColValue && o[1] === secondlevelColValue && o[2] === val });
          var listToApply = filteredOptions.map(function(o){ return o[3] });
          var cell = ws.getRange(r, FourthLevelColumn);
          applyValidationToCell(listToApply,cell);
        }

}

    
function applyValidationToCell(list,cell){
      
var rule = SpreadsheetApp
 .newDataValidation()
 .requireValueInList(list)
 .setAllowInvalid(false)
 .build();
      
 cell.setDataValidation(rule)
    
    }