indexOf retournent -1 en dépit de l'objet dans le tableau Javascript dans Google feuille de calcul des Scripts
Je suis en train d'écrire un script pour une feuille de calcul Google Docs à lire une liste de directeurs et de les ajouter à un tableau si elles ne figurent pas déjà dans les.
Cependant, je ne peux pas sembler obtenir indexOf pour revenir à autre chose que de -1 pour les éléments qui sont contenus dans le tableau.
Quelqu'un peut me dire ce que je fais de mal? Ou m'indiquer un moyen plus facile de faire cela?
C'est mon script:
function readRows() {
var column = SpreadsheetApp.getActiveSpreadsheet().getRangeByName("Director");
var values = column.getValues();
var numRows = column.getNumRows();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var directors = new Array();
for (var i = 0; i <= numRows - 1; i++) {
var row = values[i];
if (directors.indexOf(row) == -1) {
directors.push(row);
} else {
directors.splice(directors.indexOf(row), 1, row);
}
}
for (var i = 2; i < directors.length; i++) {
var cell = sheet.getRange("F" + [i]);
cell.setValue(directors[i]);
}
};
Le bloc else semble redondant. Il remplace ligne avec ligne.
Je vais aussi ajouter que la "définition" de valeurs qui peut être fait de manière plus efficace, à savoir avec setValues() plutôt que setValue() à l'intérieur d'une boucle. Mais je ne voulais pas compliquer ma réponse trop. Si vous êtes incapable de travailler sur la façon de faire (ou de trouver un Q&A sur ce forum qui traite de), vous pouvez poster une nouvelle question.
Je vais aussi ajouter que la "définition" de valeurs qui peut être fait de manière plus efficace, à savoir avec setValues() plutôt que setValue() à l'intérieur d'une boucle. Mais je ne voulais pas compliquer ma réponse trop. Si vous êtes incapable de travailler sur la façon de faire (ou de trouver un Q&A sur ce forum qui traite de), vous pouvez poster une nouvelle question.
OriginalL'auteur thrgamon | 2013-06-11
Vous devez vous connecter pour publier un commentaire.
Lorsque vous récupérer des valeurs dans le Script Google Apps avec getValues(), vous aurez toujours à faire avec un 2D Javascript array (indexé par ligne puis colonne), même si la plage en question est une colonne de large. Donc, dans votre cas particulier, et l'extension de +RobG l'exemple de votre
values
tableau va réellement ressembler à quelque chose comme ceci:[['fred'], ['sam'], ['sam'], ['fred']]
De sorte que vous devez changer
à
En aparté, il peut être intéressant de noter que vous pouvez utiliser une feuille de calcul de la fonction native de Feuilles pour atteindre cet (saisies directement dans une cellule de feuille de calcul):
=UNIQUE(Director)
Cela permettra de mettre à jour dynamiquement le contenu de la gamme nommée
Director
changements. Cela étant dit, il peut y avoir une bonne raison que vous vouliez l'utiliser Google Apps Script pour cette.OriginalL'auteur AdamL
Cela ressemble à un problème de GAZ et de pas le JS. J'ai toujours eu du mal avec getValues(). Même si le la documentation dit que c'est un tableau à deux dimensions, vous ne pouvez pas comparer avec elle comme vous attendrait. Bien que si vous utilisez une indexation déclaration comme
values[0][1]
vous obtiendrez un type de base de données. La solution (j'espère qu'il ya une meilleure façon d') est à force de cet objet dans un Chaîne de caractères() et puis split() de retour dans un tableau que vous pouvez utiliser.Voici le code que j'ai utiliser:
Si myDirector est dans les valeurs, vous obtiendrez un certain nombre != -1. Cependant, les virgules dans vos données de causer des problèmes. Et cela ne fonctionnera qu'avec des tableaux 1D.
Dans votre cas:
var row = values[i];
ligne est un objet et non pas la chaîne que vous souhaitez comparer. Convertir tous vos valeurs à un tableau comme j'ai ci-dessus et votre comparaison les opérateurs devraient travailler. (essayez d'imprimer ligne à la console pour voir ce qu'il dit:Logger.log(row)
)OriginalL'auteur billmanH
Parce que nous travaillons avec un tableau 2D,
2dArray.indexOf("Search Term")
doit avoir un ensemble de 1D tableau en tant que terme de recherche. Si nous voulons chercher une seule valeur de la cellule à l'intérieur de ce tableau, nous devons spécifier la ligne qui nous voulons regarder dans.Cela signifie que nous utilisons
2dArray[0].indexOf("Search Term")
si notre terme de recherche n'est pas un tableau. En faisant cela indique que nous voulons voir dans la première "ligne" dans le tableau.Si nous étions à la recherche à un 3x3 plage de cellules et nous avons voulu chercher la troisième ligne nous voudrions utiliser
2dArray[2].indexOf("Search Term")
Le script ci-dessous obtient la ligne dans la feuille de calcul et la transforme en un tableau. Il utilise ensuite la
indexOf()
méthode de recherche de la ligne pour"Search Term"
OriginalL'auteur Cassiopeia
J'ai rencontré un problème similaire avec une fonction de feuille de calcul qui a pris une plage comme un objet. Dans mon cas, je voulais faire une simple recherche pour un ensemble fixe de valeurs (dans un tableau).
Le problème est que votre "colonne" de la variable ne contient pas de colonne -- il contient un tableau 2D. Par conséquent, chaque valeur est propre ligne (lui-même un tableau).
Je sais que je pourrais accomplir l'exemple suivant utilise la fonction existante dans la feuille de calcul, mais c'est un bon démo de traiter avec le tableau 2D à la recherche d'une valeur:
Donc, puisque je voulais tout simplement une recherche sur l'ensemble de la gamme de l'existence d'une valeur, j'ai juste rasée dans un seul tableau. Si vous êtes vraiment affaire avec la 2D plages, alors ce type d'aplatissement et de l'accaparement de l'index peuvent ne pas être très utile. Dans mon cas, j'ai été à la recherche à travers une colonne de trouver l'intersection de deux ensembles.
OriginalL'auteur AggieEric
Si quelqu'un vient à travers ce post, vous pouvez envisager d'utiliser la bibliothèque ci-dessous. On dirait qu'il va travailler pour moi. J'ai été faire '-1' retour même en essayant les exemples (merci pour les suggestions!).
Après l'ajout de la Matrice Lib (version 13), et en utilisant find() de la fonction, j'ai eu la bonne ligne!
C'est le projet de la clé que j'ai utilisé: MOHgh9lncF2UxY-NXF58v3eVJ5jnXUK_T
Et les références:
https://sites.google.com/site/scriptsexamples/custom-methods/2d-arrays-library#TOC-Using
https://script.google.com/macros/library/d/MOHgh9lncF2UxY-NXF58v3eVJ5jnXUK_T/13
J'espère que cela aidera quelqu'un d'autre aussi.
OriginalL'auteur Starfield Screensaver