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.
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
menuEntries.push({name: "Trace Dependents", functionName: "traceDependents"});
zweimal im Code?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:
quelle