Come applicare Google Apps Script a più fogli

Sep 25 2020

Voglio applicare il seguente codice a più schede nello stesso foglio Google. La definizione di diverse schede nella prima var o l'applicazione di più file .gs nello stesso progetto, ciascuno con una diversa var, non è riuscita.

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)

}

Ho provato a lavorare con i tag unici ed esclusi come indicato qui: Come eseguire uno script su più fogli, Fogli Google e ho anche provato a lavorare con un array come indicato qui:https://webapps.stackexchange.com/questions/115076/how-to-run-script-on-multiple-google-sheet-tabsma entrambi inutilmente. qualcuno può indicarmi la giusta direzione?

Ad esempio posso mostrare come ho provato a lavorare con l'unico tag

//**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)

}

Risposte

3 George Sep 25 2020 at 19:27

nel onEditcontrollo se il nome del foglio corrente contiene "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
  }
}

Dopo di che hai la tua function KasboekModification(cell){}funzione in cui puoi fare la magia del tuo foglio corrente.

3 RafaGuillermo Sep 25 2020 at 20:42

Risposta:

Una semplice soluzione sarebbe quella di tornare fuori onEdit(e)se il foglio che è stato modificato non è uno di quelli predefiniti da modificare.

Esempio di codice:

A che fare con solo :

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
}

o con escludi :

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
}

Esempio per il tuo caso d'uso:

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) {
  // ...
}

Spero che questo ti sia di aiuto!

PainfullyStoic Sep 27 2020 at 13:15

TypeError: impossibile leggere la proprietà "range" di undefined (riga 7, file "multipledatavalidation")

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

Va notato che ho anche un altro script in esecuzione sul mio foglio. Uno che mi permette di duplicare il foglio con il suo lucchetto in posizione. Voglio essere in grado di eseguire questo codice su tutte le copie che faccio del foglio originale. ecco un collegamento a una versione condivisa e modificabile del mio foglio .

     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)
    
    }