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


17

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

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.

Antworten:


12

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

Detective> Abhängige verfolgen

Durch Auswahl dieser Option 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"});
  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);
}

Das ist großartig. Ich denke, Sie können die zusätzliche Zeile entfernen: var output = "Dependents:";
Jaredcohe

Gut gefangen. Ich habe es entfernt. Danke für die Adleraugen.
Tom Horwood

Ich mag das sehr gerne! Kann ich richtig sehen, dass es keine benannten Bereiche unterstützt? Und wenn dies der Fall ist, wäre es einfach / kompliziert, Unterstützung hinzuzufügen?
Wizek

2
Wie benutze ich den Code?
Ferrybig

1
Warum erscheint die Zeile menuEntries.push({name: "Trace Dependents", functionName: "traceDependents"});zweimal im Code?
ThomasMcLeod

4

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);
}

Vielen Dank; das hat etwas geholfen. Wie würde man dafür sorgen, dass es über Arbeitsblätter hinweg funktioniert?
Wizonesolutions

Danke Graham - Ich habe Ihre Änderungen übernommen. Um über Arbeitsblätter hinweg zu arbeiten, müsste der Code ein wenig angepasst werden, um den Namen des Arbeitsblatts einzubeziehen, und dann eine Schleife durch jedes der Arbeitsblätter
Tom Horwood,
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.