web-dev-qa-db-fra.com

Comment obtenez-vous la formule d'une cellule au lieu de la valeur?

Comment obtenez-vous la valeur littérale (la formule) d'une cellule au lieu de la valeur de résultat?

EXEMPLE SOUHAITÉ:

  • A2: "Foo"
  • B3: "= A2" - il affiche donc "Foo"
  • C3: "= CELLULE (" formule ", B3)" affiche "= A2"

Bien sûr, CELL () ne prend pas en charge un paramètre "formule", c'est juste pour démontrer l'intention. J'ai parcouru la liste des fonctions et rien ne me saute aux yeux.

CAS D'UTILISATION:
Je voudrais faire une référence à une autre ligne, et en fonction de cette référence obtenir d'autres cellules de la ligne. Mettre un numéro de ligne explicite ne fonctionnera pas (par exemple B3 = "2"), car il ne se corrigera pas automatiquement lorsque les lignes sont modifiées. Plus précisément, je voudrais que plusieurs colonnes d'une ligne soient relatives aux colonnes d'une autre ligne et que je puisse modifier la ligne relative à un endroit sans avoir à modifier chacune de ces colonnes.

Normalement, pour faire une ligne par rapport à une autre, vous devez mettre des valeurs de colonne comme ceci: "= A2 + 5" et "= B2 + 10". Cela signifie que la colonne A est "valeur de ligne relative +5" et la colonne B est "valeur de ligne relative + 10". Si vous souhaitez modifier la ligne relative (par exemple, la ligne 56), vous devez modifier chacune des colonnes en "= A56 + 5" et "= B56 + 10". Comment y parvenir en modifiant un seul champ?

Pour un exemple pratique, considérez une feuille qui est une liste de tâches et chacune peut être marquée comme "en suivant" une autre aux fins du calcul des dates de fin, mais vous souhaitez pouvoir modifier la tâche de référence et prendre en charge un N: 1 relation entre les tâches.

[Mettre à jour]

En fait, j'ai une solution au cas d'utilisation spécifique. Mais je suis toujours curieux de savoir quelle est la question d'origine: accéder à la formule derrière la valeur dans une cellule.

SOLUTION 1: - A2: "= ROW ()" - B2: "Foo" - C3: "= A2" affiche "2" et s'ajuste automatiquement pour conserver la référence lorsque des lignes sont ajoutées/supprimées

SOLUTION 2:

Une autre solution serait d'ajouter une colonne "id" unique et de stocker les références par id, puis de trouver la ligne à l'aide de LOOKUP ().

15
Denis P

EDIT: Cette réponse est pour le cas d'utilisation dans la description du problème, avec l'exigence de le faire avec uniquement des fonctions natives (pas de script).

Sur la base des commentaires d'AdamL à la question, la réponse est que vous ne pouvez pas obtenir la formule à partir d'une cellule (au lieu de la valeur).

Cependant, pour le cas d'utilisation réel que j'essayais de résoudre, = ROW (A42) peut être utilisé pour obtenir une référence à une ligne spécifique qui se mettra à jour automatiquement avec les modifications apportées aux lignes.

2
Denis P

Utilisez les méthodes getFormula() ou getFormulaR1C1() pour obtenir la formule d'une cellule.

Exemple adapté de https://webapps.stackexchange.com/a/92156/8816

La fonction personnalisée suivante renverra la formule de la cellule référencée mais si la référence n'est pas valide, elle renverra un message d'erreur.

function CELLFORMULA(reference) {
  var ss = SpreadsheetApp;
  var sheet = ss.getActiveSheet();
  var formula = ss.getActiveRange().getFormula();
  var args = formula.match(/=\w+\((.*)\)/i);
  try {
    var range = sheet.getRange(args[1]);
  }
  catch(e) {
    throw new Error(args[1] + ' is not a valid range');
  }
  return range.getFormula();
}

Exemple d'utilisation de la fonction personnalisée ci-dessus

A2: FOO
B3: Formule =A2, Valeur FOO
C3: Formule =CELLFORMULA(B3), valeur =A2

12
Rubén

J'ai eu le même problème et j'ai essayé d'utiliser la formule créée par Rubén, mais j'avais une limitation. Je ne pouvais pas utiliser ces formules à l'intérieur d'une autre (j'essayais de faire un mid ()). Donc, une approche différente a fonctionné:

function CELLFORMULA(reference) {
  var ss = SpreadsheetApp;
  var sheet = ss.getActiveSheet();
  var formula = ss.getActiveRange().getFormula();
  re = /cellformula\((.*)\);/g;
  args = re.exec(formula);
  try {
    var range = sheet.getRange(args[1]);
  }
  catch(e) {
    throw new Error(args + ' is not a valid range');
  }
  return range.getFormula();
}

Utilisez ceci: function =FORMULATEXT("cell")

1
bob