web-dev-qa-db-fra.com

Existe-t-il un moyen d'utiliser IMPORTRANGE dans une formule matricielle et que cela soit dynamique?

J'essaie d'extraire les ID de feuille de calcul d'une plage d'une autre feuille avec des dimensions égales, puis de les utiliser pour extraire des données de feuilles de calcul portant ces ID. Je souhaite utiliser une formule matricielle pour remplir automatiquement une colonne avec les données dont j'ai besoin avec les critères suivants:

  • Si l'ID de la feuille de calcul est vide, renvoyez "ID manquant"
  • Mettre à jour les valeurs à mesure qu'elles changent dans leurs feuilles de calcul parent

Alors disons que j'ai un tableur comme celui-ci:

  \ __A__|__B__|__C__
_1_|_ID1_|_____|_____
_2_|_ID2_|_____|_____
_3_|_ID3_|_____|_____

Chacun de ces identifiants mène à une feuille de calcul comme celle-ci:

  \ __A__|__B__|__C__
_1_|DATE1|_____|_____
_2_|DATE2|_____|_____
_3_|DATE3|_____|_____

Je vais importer la colonne A de la feuille de calcul ID à partir d'une autre feuille, puis exécuter IMPORTRANGE sur la plage importée pour obtenir les dates. J'ai essayé la formule suivante (arguments de remplissage pour IMPORTRANGE):

    =ARRAYFORMULA(IF(ISBLANK(IMPORTRANGE(ABC, DEF)), "ID missing", IMPORTRANGE(IMPORTRANGE(ABC, DEF), GHI)))

Tous les champs avec des identifiants manquants sont remplis correctement. Cependant, ceux avec des ID peuplent tous avec la même valeur (la première valeur renvoyée par IMPORTRANGE, pour être exact). C'est comme si elles étaient appliquées à la toute première cellule encore et encore. J'ai essayé INDEX, VLOOKUP, OFFSET, QUERY, mais il semble qu'aucun d'entre eux ne fonctionne avec ARRAYFORMULA.

Pour le moment, j'ai eu recours à une fonction personnalisée et à une combinaison plutôt étrange d'arguments pour extraire les données pertinentes (je dois trouver la date la plus récente dans chacune des plages). La fonction personnalisée dans Google Apps Script est la suivante:

/**
 * Imports a range from each spreadsheet given an array of spreadsheet IDs
 *
 * @param {range} IDs An array of spreadsheet IDs
 * @param {string} Range The range to import from each spreadsheet
 * @param {[string]} JavaScript Optional JavaScript code to run on the returned values
 * @return The desired range
 * @customfunction
 */
function IMPORTRANGES(IDs, Range, JavaScript) {
  return IDs.map(function (ID) {
    if (ID[0]) {
      var Values = SpreadsheetApp.openById(ID[0]).getRange(Range).getValues();
      return JavaScript ? function () { return eval(JavaScript); }.call(Values) : Values;
    }
  });
}

Et ma formule passe à:

=ARRAYFORMULA(IF(ISBLANK(IMPORTRANGE(ABC, DEF)), "Log missing", IMPORTRANGES(IMPORTRANGE(ABC, DEF), "Dates", "new Date(Math.max.apply(null, this.filter(function () { return arguments[0][0] instanceof Date; }).map(function () { return arguments[0][0]; })))")))

Cela fonctionne parfaitement bien maintenant, mais le problème est que, puisque tout le traitement est effectué via une fonction personnalisée, les résultats sont mis en cache et ne seront pas automatiquement mis à jour pour refléter les modifications apportées à leurs feuilles de calcul respectives, ce qui était l'un des critères que j'avais.

N'y a-t-il vraiment aucun moyen d'utiliser IMPORTRANGE avec une formule matricielle?

J'aimerais vraiment éviter d'utiliser un déclencheur GAS installable, si possible.

1
Hao Zhang

Il n’existe vraiment aucun moyen d’utiliser IMPORTRANGE dans une formule matricielle et il n’existe pas non plus pour IMPORTDATA et IMPORTXML. Voir mon réponse à Google Sheets: Comment puis-je combiner plusieurs résultats ImportXML pour plusieurs URL dans une seule colonne? .

Une autre question connexe:

2
Rubén