Foglio di calcolo di Google SCRIPT Controlla se la cella modificata si trova in un intervallo specifico

Devo rilevare se vengono apportate modifiche a un foglio di calcolo all’interno di un certo intervallo di dati e, in tal caso, impostare l’ora di aggiornamento corrente.

Il problema è che ho un foglio di calcolo che modifico le intestazioni e il testo e non voglio che il tempo di aggiornamento in una cella specifica venga aggiornato sul foglio di calcolo, ma quando modifico i dati in un intervallo di celle, DEVO L’aggiornamento il tempo è cambiato.

Ecco cosa devo aggiornare il tempo.

function onEdit(e) { var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); ss.getRange("G10").setValue(new Date()); } ​ 

Voglio solo la data in G10 impostata se modifico determinate celle (in un intervallo “B4: J6”)

Esiste un evento fornito come parametro per la funzione onEdit() e contiene le informazioni necessarie su ciò che è stato modificato. Se ti stavi chiedendo cosa fosse (e) , questo è tutto.

Poiché una funzione onEdit() viene chiamata per ogni modifica, è necessario investire il meno ansible dell’elaborazione per determinare se si debba uscire . Usando l’evento passato, avrai bisogno di meno chiamate di servizio, quindi sarà più efficiente. Il modo in cui la risposta di Rasmus converte la notazione A1 in numeri di colonne e righe è buona se devi essere flessibile, ma se l’intervallo di modifica è fisso, puoi semplicemente usare valori costanti per i confronti – ancora, per ridurre i tempi di elaborazione richiesti.

 function onEdit(e) { var editRange = { // B4:J6 top : 4, bottom : 6, left : 2, right : 10 }; // Exit if we're out of range var thisRow = e.range.getRow(); if (thisRow < editRange.top || thisRow > editRange.bottom) return; var thisCol = e.range.getColumn(); if (thisCol < editRange.left || thisCol > editRange.right) return; // We're in range; timestamp the edit var ss = e.range.getSheet(); ss.getRange(thisRow,7) // "G" is column 7 .setValue(new Date()); // Set time of edit in "G" } ​ 

Puoi semplicemente verificare se l’evento di modifica si è verificato all’interno dell’intervallo.

 function onEdit(e) { var sheet = SpreadsheetApp.getActiveSheet(); var editRange = sheet.getActiveRange(); var editRow = editRange.getRow(); var editCol = editRange.getColumn(); var range = sheet.getRange("B4:J6"); var rangeRowStart = range.getRow(); var rangeRowEnd = rangeRowStart + range.getHeight(); var rangeColStart = range.getColumn(); var rangeColEnd = rangeColStart + range.getWidth(); if (editRow >= rangeRowStart && editRow <= rangeRowEnd && editCol >= rangeColStart && editCol <= rangeColEnd) { // Do your magic here } } 

Riconosco che questo è molto verboso, ma non ho ancora trovato un metodo semplice per range range.contains (range)

Solo una rapida soluzione ad un ansible problema alla precedente risposta di Rasmus:

Sulle linee:

 var rangeRowEnd = rangeRowStart + range.getHeight(); var rangeColEnd = rangeColStart + range.getWidth(); 

sta aggiungendo (in realtà non sta sottraendo la riga e la colonna iniziali .Questo risulta in un intervallo più ampio di quello che ci si aspetta da 1 riga e 1 colonna intera. Sottrarre solo 1 nella stessa riga:

 var rangeRowEnd = rangeRowStart + range.getHeight()-1; var rangeColEnd = rangeColStart + range.getWidth()-1; 

Codice di Rasmus Fuglsnag e la correzione dovrebbe essere simile a questa:

 function onEdit(e) { var sheet = SpreadsheetApp.getActiveSheet(); var editRange = sheet.getActiveRange(); var editRow = editRange.getRow(); var editCol = editRange.getColumn(); var range = sheet.getRange("B4:J6"); var rangeRowStart = range.getRow(); var rangeRowEnd = rangeRowStart + range.getHeight()-1; var rangeColStart = range.getColumn(); var rangeColEnd = rangeColStart + range.getWidth()-1; if (editRow >= rangeRowStart && editRow <= rangeRowEnd && editCol >= rangeColStart && editCol <= rangeColEnd) { // Do your magic here } } 

Grazie a Rasmus Fuglsnag per aver fornito il modo più semplice per farlo. Non posso credere che ci sia un modo più semplice per farlo in base al codice.

Il modo più semplice è di NOME la tua gamma di trigger

Denominando il proprio intervallo di “trigger”, non è necessario fare confusione con lo script dopo aver impostato il nome dell’intervallo all’interno dello script. Semplicemente modificando l’intervallo dell’intervallo con nome nell’interfaccia standard di google sheets, lo script funzionerà anche se si espande o si riduce la dimensione dell’intervallo.

Passaggio 1: Assegna un nome al tuo intervallo

Assegna un nome all’intervallo di celle a cui sei interessato per agire come trigger per il tuo script nel caso in cui modificherai una delle celle dell’intervallo seguendo le istruzioni qui: https://support.google.com/docs/answer/63175

Ho chiamato il mio intervallo “triggerRange”.

Passaggio 2: modifica il nome dell’intervallo nel seguente script:

 function onEdit(e) { var myRange = SpreadsheetApp.getActiveSheet().getRange('triggerRange'); //<<< Change Your Named Ranged Name Here inside the getRange() function. //SpreadsheetApp.getUi().alert("myRange in A1 Notation is: " + myRange.getA1Notation()); //If you're having problems, uncomment this to make sure your named range is properly defined //Let's get the row & column indexes of the active cell var row = e.range.getRow(); var col = e.range.getColumn(); //SpreadsheetApp.getUi().alert('The Active Cell Row is ' + row + ' and the Column is ' + col); //uncomment this out to do testing //Check that your active cell is within your named range if (col >= myRange.getColumn() && col <= myRange.getLastColumn() && row >= myRange.getRow() && row <= myRange.getLastRow()) { //As defined by your Named Range SpreadsheetApp.getUi().alert('You Edited a Cell INSIDE the Range!');//Repalace Your Custom Code Here } else { SpreadsheetApp.getUi().alert('You Edited a Cell OUTSIDE the Range!');//Comment this out or insert code if you want to do something if the edited cells AREN'T inside your named range return; } } 

PS: Grazie agli altri poster per fornire il framework di base per questo script di base. Ovviamente ho commentato la sceneggiatura in modo piuttosto pesante per poterla facilmente testare. Rimuovi gli avvisi che ho creato all'interno dello script per un look più pulito ... o semplicemente copia e incolla questo invece:

 function onEdit(e) { var myRange = SpreadsheetApp.getActiveSheet().getRange('triggerRange'); //<<< Change Your Named Ranged Name Here //Let's get the row & column indexes of the active cell var row = e.range.getRow(); var col = e.range.getColumn(); //Check that your active cell is within your named range if (col >= myRange.getColumn() && col <= myRange.getLastColumn() && row >= myRange.getRow() && row <= myRange.getLastRow()) { //As defined by your Named Range SpreadsheetApp.getUi().alert('You Edited a Cell INSIDE the Range!');//Repalace Your Custom Code Here } } 

Se vuoi pochissime righe di codice, puoi usare:

 function onEdit(){ var cell = SpreadsheetApp.getActive().getActiveCell(); var row = cell.getRow(); var col = cell.getColumn(); //if col > A && col < K ... if(col > 1 && col < 11 && row > 3 && row < 7){ //B4:J6 //do something } 

Tuttavia, la modifica dell'intervallo potrebbe richiedere un po 'più tempo rispetto agli altri metodi.