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