web-dev-qa-db-fra.com

Récupérer des lignes à partir des données d'une feuille de calcul à l'aide du script d'application Google

J'utilise le script d'application Google pour écrire des données de formulaire dans une feuille de calcul. Maintenant, je voudrais récupérer les valeurs d'Excel qui correspondent aux conditions (par exemple, filtrées par date, nom d'utilisateur) et les afficher avec le script d'application.

Ma feuille de calcul a

+-------------+-----------+----------------------+
| Date        | Username  | Comment              |
+-------------+-----------+----------------------+
| 2012-05-02  | palani    | My first comment     |
| 2012-05-02  | raja      | My second comment    |
| 2012-05-03  | palani    | My third comment     |
| 2012-05-03  | raja      | My fourth comment    |
+-------------+-----------+----------------------+

Maintenant, je veux filtrer les données pour 2012-05-02 À la date et raja sur le nom d'utilisateur et les afficher à l'aide d'étiquettes dans app-script (qui s'exécute en tant que service Web).

Toutes mes recherches renvoient une solution en utilisant SpreadsheetApp.getActiveSheet().getDataRange(); qui, à mon avis, n'est pas un moyen optimisé d'afficher un enregistrement sur plus de 1000 lignes dans la feuille.

[~ # ~] modifier [~ # ~]

Pour le moment, j'utilise uniquement .getValues(). Et les données présentées ici sont pour l'échantillon; ma vraie feuille a 15 colonnes et 5000+ lignes pour l'instant. Et finalement, il atteindra des millions car il s'agit d'une application de feuille de temps. Je me demande s'il existe un autre moyen de getValues() des lignes filtrées?

L'application de la formule =Filter Sur une cellule tmp sera également un problème, car le script pourrait être utilisé simultanément par un certain nombre de personnes.

24
palaniraja

La façon la plus simple, et celle que je connais, est de:
récupère les valeurs dans un tableau en utilisant

var data = SpreadsheetApp.getActiveSheet().getDataRange().getValues();

puis faire une boucle

for (i in data) {

dans cette boucle pour vérifier si la date (data[i][0]) est égal à celui que vous recherchez, et si le nom (data[i][1]) est égal à celui que vous recherchez également. Et poussez-le dans un tableau

var labels=new Array;
label.Push( [data[i][0], data[i][1], data[i][2]] );

puis avoir toutes vos données dans ce tableau, vous pouvez remplir une interface utilisateur panen avec une étiquette en utilisant une boucle for

for (i in labels) { ...
30
Cartman

Eh bien, vous pouvez envisager d'utiliser une cellule et d'utiliser la formule "Requête" dessus. Supposons que la date se trouve dans la colonne A, le nom d'utilisateur = la colonne B, le commentaire est la colonne C, tandis que la cellule vide est D1, votre script ressemblera à ceci:

SpreadsheetApp.getActiveSheet().getRange("D1").setFormula('Query(A:C,"SELECT A,B,C WHERE B="' + "SomeOne'" + ',1)'; //filter the data and populate to D1 onwards    
SpreadsheetApp.getActiveSheet().getRange("D:F").getValues();//this is the filtered data
9
kckoay