2
votes

Existe-t-il un moyen plus simple d'implémenter la méthode manquante "getNamedRange (....)"?

Dans Google Apps Script, une méthode getNamedRanges () sur les feuilles de calcul et les feuilles de calcul renvoie une LISTE de plages nommées. Mais il n'y a pas de getNamedRange ("Name") qui renvoie une SEULE plage nommée.

Cela me semble étrange.

Pour contourner cela, j'utilise ce processus alambiqué:

function testing()
{
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var nameOfNamedRange = "NameOfMyNamedRange";

  var namedRanges = ss.getNamedRanges();

  /* ###### THIS IS WHAT I HAVE TO DO ######### */
  for (i = 0; i<namedRanges.length; ++i)
  { var nRange = namedRanges[i];
    if ( nRange.getName() == nameOfNamedRange )
      {
        /* Process nRange
        doSomething(nRange);
        */
        Logger.log(nRange.getName());
      }
  }

/* ############ THIS IS WHAT I'D LIKE TO DO (or something similar) ##########
    var nRange = ss.getNamedRange("NameOfMyNamedRange") // ...Range   not ...Ranges

*/
}

Existe-t-il un moyen plus simple de le faire? Je ne peux pas m'empêcher de penser qu'il me manque quelque chose d'évident.


0 commentaires

3 Réponses :


1
votes

Par exemple, que diriez-vous d'utiliser la méthode de getRangeByName () ?

Script modifié:

var ss = SpreadsheetApp.getActiveSpreadsheet();
var nameOfNamedRange = "NameOfMyNamedRange";
var nRange = ss.getNamedRanges().filter(function(e) {return e.getName() === nameOfNamedRange})[0]; // Added

Référence:

Edit:

Lorsque vous voulez récupérer une seule plage nommée, qu'en est-il de l'exemple de script suivant, car il n'y a pas de méthode pour récupérer directement la seule? Le nom de la plage nommée est un seul dans la feuille de calcul. Cela peut être utilisé. Veuillez considérer ceci comme l’une des nombreuses réponses.

var ss = SpreadsheetApp.getActiveSpreadsheet();
var nameOfNamedRange = "NameOfMyNamedRange";
var nRange = ss.getRangeByName(nameOfNamedRange); // Added


3 commentaires

Malheureusement pas. L'indice est dans le nom de la méthode getRange ..... Il renvoie un Range, pas un Named Range. Il me semble que getNamedRange (...) est tout simplement manquant.


@Alex Goodall Je suis désolé pour la gêne occasionnée. J'ai mis à jour ma réponse. Pouvez-vous le confirmer?


Cela fonctionne très bien. Beaucoup plus compact que ma méthode maladroite. Merci @Tanaike.



1
votes

Malheureusement, aucune fonction ne permet de renvoyer un seul NamedRange instance. Mais vous pouvez nettoyer votre solution actuelle et l'envelopper dans une fonction utilitaire comme suit:

var ss = SpreadsheetApp.getActive();
var nameOfNamedRange = "[NAME_OF_NAMED_RANGE]";

var namedRange = Utils.getNamedRangeByName(ss, nameOfNamedRange);

Ajoutez simplement le script ci-dessus à votre projet, puis appelez-le comme suit: p >

(function(scope){
    const Utils = scope.Utils || (scope.Utils = {});

    /**
     * Filter function
     */
    function filterByName(namedRange) {
        return this.name === namedRange.getName();
    }

    /**
     * Gets named range by name.
     *
     * @param {Spreadsheet|Sheet} context - An instance of Spreadsheet or Sheet.
     * @param {String}               name - The name of a NamedRange.
     *
     * @return {NamedRange} A NamedRange or null if not found.
     */
    function getNamedRangeByName(context, name) {
        if (!context || !context.getNamedRanges) {
            throw new Error("Invalid context object; must implement getNamedRanges()");
        }

        var filtered = context.getNamedRanges().filter(filterByName.bind({name:name}));

        return filtered.length ? filtered[0] : null;
    }

    Utils.getNamedRangeByName = getNamedRangeByName;
})(this);


1 commentaires

Merci pour cela, Dimu Designs. Je suis revenu à faire de la programmation après BEAUCOUP de décennies - et à utiliser Javascript pour la première fois. J'apprécie donc beaucoup le professionnalisme de votre solution - j'ai beaucoup à apprendre. Cependant, la solution de @ Tanaike répond toujours le mieux à mes besoins immédiats.



0
votes

En fait, il existe un moyen d'obtenir une plage nommée. Disons que j'ai une plage nommée A1: B3 appelée "Test".

var spread = SpreadsheetApp.getActiveSpreadsheet();
var range = spread.getRange("Test");
spread.setNamedRange("Other",range);

Renverra les valeurs de A1: B3. Ou plus simplement.

  var values = SpreadsheetApp.getActiveSpreadsheet().getRange("Test").getValues();

Si l'objectif est de changer le nom, essayez ceci.

var values = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1").getRange("Test").getValues();


2 commentaires

Certains noms de plages posent des problèmes. AFAIK la documentation officielle ne mentionne aucune limitation.


Encore une fois, cela renvoie une plage, pas une plage nommée. C'est bien pour obtenir les valeurs, mais pas pour changer le nom ou pour déplacer la plage nommée vers une feuille différente, par exemple.