Je travaille avec une feuille de calcul simple comportant un nom/des noms de famille. J'ai besoin que la feuille de calcul trie automatiquement l'entrée par ordre alphabétique du nom de famille (colonne B). J'ai utilisé le code suivant:
function onEdit(event){
var sheet = event.source.getActiveSheet();
var editedCell = sheet.getActiveCell();
var columnToSortBy = 1;
var tableRange = "A2:B500";
if(editedCell.getColumn() == columnToSortBy){
var range = sheet.getRange(tableRange);
range.sort( { column : columnToSortBy } );
}
}
Cependant, lorsque je l'exécute, le message suivant s'affiche: Impossible de lire la propriété "source" de non définie. (Ligne 2)
Est-ce que quelqu'un pourrait m'aider à comprendre ce que je fais mal?
Ce morceau de code fonctionne:
function onEdit(){
var sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var editedCell = sh.getActiveRange().getColumnIndex();
if(editedCell == 2) {
var range = sh.getRange("A2:B10");
range.sort({column: 2});
}
}
Une différence clé est le .getColumnIndex
. Sans cela, vous ne recevez pas un entier !!
Voir un exemple de fichier que j'ai créé: tri
Voici un script générique qui trie automatiquement en fonction de la 1ère colonne et suppose une ligne d'en-tête.
Pour créer un script:
Dans le menu, sélectionnez Outils -> Editeur de script ... Dans la fenêtre de code vide, collez le code suivant, qui s'exécutera automatiquement chaque fois qu'une cellule est modifiée:
/**
* Automatically sorts the 1st column (not the header row) Ascending.
*/
function onEdit(event){
var sheet = event.source.getActiveSheet();
var editedCell = sheet.getActiveCell();
var columnToSortBy = 1;
var tableRange = "A2:T99"; // What to sort.
if(editedCell.getColumn() == columnToSortBy){
var range = sheet.getRange(tableRange);
range.sort( { column : columnToSortBy, ascending: true } );
}
}
J'ai utilisé ce morceau de code:
/**
* Automatically sorts the 1st column (not the header row) Descending.
*/
function onEdit(){
var sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var editedCell = sh.getActiveRange().getColumnIndex();
if(editedCell == 2) {
var range = sh.getRange("A2:B100");
range.sort({column: 2, ascending: false });
}
}
et il fonctionne!
Inclus car c'est une nouvelle réponse à une vieille question
Les réponses précédentes mettaient l'accent sur la fourniture d'un script qui correspond à ce que le titre de la question décrit, mais pour le moment, ils n'ont pas expliqué pourquoi l'erreur s'était produite. Il n'a pas été analysé si cela pouvait fonctionner, ils n'ont donc pas répondu à la bonne question
Est-ce que quelqu'un pourrait m'aider à comprendre ce que je fais mal?
En prenant en compte ceux qui trouvent cette question lors de la recherche de la méthode de tri automatique, j'ai ajouté une section contenant des liens vers des questions à ce sujet.
L'erreur appelait la fonction onEdit(e)
à partir de l'éditeur de script. Le script fonctionne bien lorsqu'il est appelé à partir d'un événement d'édition.
L'erreur
Impossible de lire une propriété quelque chose de non définie. (ligne quelque chose )
sur des fonctions simples telles que onOpen
et onEdit
, ainsi que sur toute autre fonction spécifiée avec un argument, comme e
sur function onEdit(e) {...}
, se produit lorsqu'elles sont exécutées directement à partir de l'éditeur de script car L'éditeur de script n'affecte pas d'objet à l'argument. Ainsi, dans l'exemple précédent, e
est undefined
.
Lorsque nous voulons tester quelque chose comme function onEdit(e){...}
directement à partir de l'éditeur de script, nous devons ajouter une fonction attribuant un objet à l'argument, puis appeler la fonction à tester, à peu près comme suit:
function test_onEdit(){
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
// Create the object to be passed as an argument
var e = {
range: spreadsheet.getActiveRange(),
source: spreadsheet
}
onEdit(e); // This is the call to the function that we want to test/debug
}
Le script ci-dessus suppose que nous souhaitons tester la fonction onEdit en prenant la plage active en tant que plage modifiée.
Ensuite, dans le sélecteur de fonctions déroulantes de l’éditeur de script, sélectionnez test_onEdit
et cliquez sur le bouton Exécuter.
Sur les fonctions onEdit
plus complexes simples ou installables à tester, il peut être nécessaire d'inclure d'autres propriétés pour émuler correctement l'objet événement. Disons que nous n'avons besoin de la propriété value de l'objet event que lorsque la plage modifiée a une taille de 1 x 1 (une seule cellule).
function test_advanced_onEdit(){
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var range = spreadsheet.getActiveRange();
var values = range.getValues();
var e = {
range: range,
source: spreadsheet
}
/**
* The value property is included only when the edited range has a size of 1 x 1 (one cell)
* The oldValue property is included only when one cell is edited and it before and
* after of the edit it is'n a black cell.
*/
if(values.length === 1 && values[0].length === 1) {
e.value = values[0][0];
e.oldValue = 1; // Set the old value as you need it.
}
onEdit(e); // This is the call to the function that we want to test/debug
}