5
votes

Comment créer une chaîne de tableau INDIRECT de plusieurs références de feuille dans Google Sheets?

J'essaie d'utiliser une requête pour afficher des données provenant de plusieurs feuilles de calcul Google. Je crée une nouvelle feuille chaque semaine avec un nom de feuille spécifique, par exemple Semaine du 13/01 , Semaine du 01/06 et ainsi de suite.

Voici d'où mon idée est née pour référence:

J'ai une feuille récapitulative qui utilise COUNTA (INDIRECT ("'" & A5 & "'! E4: E", vrai)

A5 étant une cellule qui concatène une date et des mots pour reproduire le noms de feuille.

La ligne de la feuille récapitulative ne se remplit pas avant B5

Je suis donc en mesure de le définir et de l'oublier et la feuille continuera à donne-moi mes données hebdomadaires au fur et à mesure que les jours avancent et garde les draps propres jusqu'à ce que la semaine soit arrivée.

En bref, j'ai une requête que j'utilise qui me donne toutes les données dont j'ai besoin avec un paramètre spécifique mais je dois mettre à jour manuellement le tableau de syntaxe des données avec les nouveaux noms de feuille chaque semaine. p>

'Week of 01/06'!A:P;'Week of 01/13'!A:P

Je voudrais créer une référence à un tableau qui remplira automatiquement une concaténation en fonction du jour.

Exemple de structure de référence

En utilisant le code suivant, je peux demander à la concaténation de me donner le tableau dont j'ai besoin,

=QUERY(I1,"Select *")

mais quand j'essaye de le saisir dans la fonction de requête, il renvoie simplement le texte concaténé:

=if(H4<=today(),CONCATENATE("'",H$1,text(H4,"mm/dd"),"'!A:P;",),"")

=QUERY({'Week of 01/13'!A:P;'Week of 01/06'!A:P;'Week of 12/30'!A:P;'Week of 12/23'!A:P;'WEEK OF 12/16'!A:P;'WEEK OF 12/09'!A:P;'WEEK OF 12/02'!A:P;'WEEK OF 11/25'!A:P;'WEEK OF 11/18'!A:P;'WEEK OF 11/11'!A:P;'WEEK OF 11/04'!A:P;'WEEK OF 10/28'!A:P;'WEEK OF 10/21'!A:P;'WEEK OF 10/14'!A:P;'WEEK OF 10/07'!A:P;'WEEK OF 09/30'!A:P;'WEEK OF 09/23'!A:P;'WEEK OF 09/16'!A:P;'WEEK OF 09/09'!A:P;'WEEK OF 09/02'!A:P},
 "Select * where Col11 = 'RD' order by Col2 desc",0)

J'ai essayé avec et sans les accolades sans succès.

Je voudrais que la feuille puisse s'actualiser et voir que c'est le bon jour, le nouveau nom de feuille est renseigné et la requête est mise à jour.

J'ai besoin d'aide pour faire fonctionner I1 .

Lien vers la feuille de requête de test


1 commentaires

J'ai ajouté une feuille de test pour donner une compréhension de base de ce que j'essaie de faire


3 Réponses :


1
votes

Si vous essayez de mettre à jour les données que votre requête recherche et que vous lui fournissez une chaîne, vous devez placer cette chaîne dans la fonction indirect (). Cela interprétera votre chaîne comme une référence de données et pointera votre requête () dans la bonne direction.

Donc, pour cela, vous auriez probablement

=QUERY(INDIRECT(I1),"Select *")


2 commentaires

J'ai tenté cela mais il semble que les citations le rendent invalide, cela ajoutera un guillemet simple à la fin ou un guillemet double au début.


Votre indirect () fait référence à F2, où vous avez actuellement une faute de frappe dans votre référence de cellule. {'Semaine du 01/06'! A: C; "Semaine du 13/01"! A: C "Semaine du 20/01"! A: C} - il vous manque le point-virgule après votre deuxième plage.



0
votes

Si vous avez vraiment, vraiment besoin d'utiliser I1, essayez la formule suivante

=QUERY({INDIRECT(INDEX(SPLIT(I1,";"),1,1));INDIRECT(INDEX(SPLIT(I1,";"),1,2))},"Select *")

I2 a une formule qui renvoie cette valeur 'Semaine du 01/06'! R: P; 'Semaine du 13/01'! A: P . C'est une valeur de texte ayant deux adresses de plage séparées par un point-virgule.

La formule ci-dessus utilise SPLIT pour séparer chaque adresse, elle utilise INDEX pour prendre la partie correspondante à utiliser comme argument de INDIRECT qui renvoie un tableau de valeurs. Ces tableaux de valeurs sont utilisés pour construire un autre tableau de valeurs qui est utilisé comme premier argument de QUERY.


0 commentaires

1
votes

Les mecs qui ont copié-collé la fonction INDIRECT dans Google Sheets n'ont complètement pas compris le potentiel de celle-ci et n'ont donc fait aucun effort pour l'améliorer et couvrir la logique évidente qui est cruciale à l'ère de

en d'autres termes, INDIRECT ne peut pas prendre plus d'un tableau:

function onEdit() { 
var sheet = SpreadsheetApp.getActive().getSheetByName('Master Sheet');  
var src = sheet.getRange("A1");
var str = src.getValue(); 
var cell = sheet.getRange("C5"); 
cell.setFormula(str);
}

ni convertir une chaîne matricée en référence active, ce qui signifie que toute tentative de concaténation est également vaine:

=ARRAYFORMULA("=QUERY({"&TEXTJOIN("; ", 1, 
 IF(A3:A<>"", "'Week of "&LEFT(A3:A, 5)&"'!A1:D5", ))&
 "}, ""where Col1 is not null"", 1)")

le seul moyen possible est d'utiliser INDIRECT pour chaque terminer chaque plage comme:

=QUERY(
 {IFERROR(INDIRECT("Sheet1!A1:B5"), {"",""}); 
  IFERROR(INDIRECT("Sheet2!A1:B5"), {"",""}); 
  IFERROR(INDIRECT("Sheet3!A1:B5"), {"",""}); 
  IFERROR(INDIRECT("Sheet4!A1:B5"), {"",""})}, 
 "where Col1 is not null", 0)

ce qui signifie que le mieux que vous puissiez faire est de préprogrammer votre tableau comme ceci si seulement une partie des feuilles / tabs est existant (ayons un scénario où seulement 2 feuilles sont créées sur un total de 4):

={INDIRECT("Sheet1!A:B"); INDIRECT("Sheet2!A:B")}

donc, même si les noms de feuille sont prévisibles (ce qui ne le sont pas toujours ) préprogrammer plus de 100 feuilles comme cela serait douloureux (même s'il existe plusieurs façons sournoises d'écrire une telle formule en moins de 30 secondes)


une alternative serait d'utiliser un script pour convertir la chaîne et l'injecter comme la formule

A1 le ferait soit une formule qui traite une chaîne qui ressemble à une vraie formule:

=INDIRECT(MasterSheet!A1:A10)
————————————————————————————————————————————————————————————————————————————————————
=INDIRECT("{Sheet1!A:B; Sheet2!A:B}")
————————————————————————————————————————————————————————————————————————————————————
={INDIRECT("Sheet1!A:B"; "Sheet2!A:B")}
————————————————————————————————————————————————————————————————————————————————————
=INDIRECT("{INDIRECT("Sheet1!A:B"); INDIRECT("Sheet2!A:B")}")

un remplissage supplémentaire de A6: A développera la chaîne automatiquement

alors ce script prendra la chaîne de la cellule A1 et il la collera comme formule valide dans la cellule C5:

=INDIRECT("Sheet1!A:B"; "Sheet2!A:B")

 0

bien sûr , le script peut être changé en déclencheur onOpen ou avec un nom personnalisé déclenché à partir du menu personnalisé ou via un bouton (cependant il n'est pas possible d'utiliser la fonction personnalisée comme formule directement)


0 commentaires