web-dev-qa-db-fra.com

Dans Google Spreadsheet, recherche des formules faisant référence à une valeur donnée

Je voudrais savoir quelles cellules ont des dépendances de formule dans une grande feuille de calcul. Je cherche un moyen de faire quelque chose comme OpenOffice

Outils> Détective> Dépister les personnes à charge

et

Édition> Rechercher et remplacer> Rechercher dans les formules

ou un moyen de créer un déclencheur dans GAS qui est appelé lorsqu'une valeur de cellule donnée est référencée et peut identifier la source de la référence.

15
MetaEd

Le code suivant va ajouter un menu à la feuille de calcul:

Detective> Trace Dependents

Sélectionnez cette option pour ajouter une note à la cellule active avec toutes les références de cellules dépendantes.

(ajout de la recherche de références statiques suggérées par Graham ci-dessous)

Vous pouvez ajouter une fonction similaire à la fonction traceDependents pour rechercher le texte dans la cellule active pour une fonction de recherche dans les formules. Je vais laisser cela comme un exercice pour vous.

function onOpen() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var menuEntries = []
  menuEntries.Push({name: "Trace Dependents", functionName: "traceDependents"});
  menuEntries.Push({name: "Trace Dependents", functionName: "traceDependents"});
  ss.addMenu("Detective", menuEntries);
}

function traceDependents(){
  var dependents = []
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var currentCell = ss.getActiveCell();
  var currentCellRef = currentCell.getA1Notation();
  var range = ss.getDataRange();

  var regex = new RegExp("\\b" + currentCellRef + "\\b");
  var formulas = range.getFormulas();

  for (var i = 0; i < formulas.length; i++){
    var row = formulas[i];

    for (var j = 0; j < row.length; j++){
      var cellFormula = row[j].replace(/\$/g, "");
      if (regex.test(cellFormula)){
        dependents.Push([i,j]);
      }
    }
  }

  var dependentRefs = [];
  for (var k = 0; k < dependents.length; k ++){
    var rowNum = dependents[k][0] + 1;
    var colNum = dependents[k][1] + 1;
    var cell = range.getCell(rowNum, colNum);
    var cellRef = cell.getA1Notation();
    dependentRefs.Push(cellRef);
  }
  var output = "Dependents: ";
  if(dependentRefs.length > 0){
    output += dependentRefs.join(", ");
  } else {
    output += " None";
  }
  currentCell.setNote(output);
}
11
Tom Horwood

C'est super et m'a épargné beaucoup de travail - merci.
Cependant, la réponse ci-dessus ne trouve aucune référence utilisant le correcteur de lignes ou de colonnes $.
La légère modification suivante apportée au code accomplit cela:

function onOpen() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var menuEntries = []
  menuEntries.Push({name: "Trace Dependents", functionName: "traceDependents"});
  ss.addMenu("Detective", menuEntries);
}

function traceDependents(){
  var dependents = []
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var currentCell = ss.getActiveCell();
  var currentCellRef = currentCell.getA1Notation();
  var range = ss.getDataRange();

  var regex = new RegExp("\\b" + currentCellRef + "\\b");
  var formulas = range.getFormulas();

  for (var i = 0; i < formulas.length; i++){
    var row = formulas[i];

    for (var j = 0; j < row.length; j++){
      var cellFormula = row[j].replace(/\$/g, "");
        if (regex.test(cellFormula)){
          dependents.Push([i,j]);
      }
    }
  }

  var dependentRefs = [];
  for (var k = 0; k < dependents.length; k ++){
    var rowNum = dependents[k][0] + 1;
    var colNum = dependents[k][1] + 1;
    var cell = range.getCell(rowNum, colNum);
    var cellRef = cell.getA1Notation();
    dependentRefs.Push(cellRef);
  }
  var output = "Dependents: ";
  if(dependentRefs.length > 0){
    output += dependentRefs.join(", ");
  } else {
    output += " None";
  }
  currentCell.setNote(output);
}
4
Graham