it-swarm.com.de

Suchen Sie in der Google-Tabelle, welche Formeln auf einen bestimmten Wert verweisen

Ich möchte herausfinden, welche Zellen in einer großen Tabelle Formelabhängigkeiten haben. Ich suche nach einer Möglichkeit, etwas wie OpenOffice zu machen

Extras> Detektiv> Abhängige verfolgen

und

Bearbeiten> Suchen & Ersetzen> In Formeln suchen

oder eine Möglichkeit, einen Trigger in GAS zu erstellen, der aufgerufen wird, wenn auf einen bestimmten Zellenwert verwiesen wird, und die Quelle der Referenz identifizieren kann.

15
MetaEd

Der folgende Code fügt dem Arbeitsblatt ein Menü hinzu:

Detective> Abhängige verfolgen

Wenn Sie dies auswählen, wird der aktiven Zelle eine Notiz mit allen abhängigen Zellreferenzen hinzugefügt.

(Suche nach statischen Referenzen hinzugefügt, wie von Graham unten vorgeschlagen)

Sie können der Funktion traceDependents eine ähnliche Funktion hinzufügen, um nach dem Text in der aktiven Zelle für eine Funktion zum Suchen in Formeln zu suchen. Ich lasse das als Übung für Sie.

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

Das ist super und hat mir viel Arbeit erspart - danke.
Die obige Antwort enthält jedoch keine Referenzen, die den Zeilen- oder Spaltenfixierer $ verwenden.
Die folgende geringfügige Änderung am Code bewirkt Folgendes:

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