In Google Spreadsheet, trova quali formule fanno riferimento a un determinato valore


17

Vorrei scoprire quali celle hanno dipendenze formula in un foglio di calcolo di grandi dimensioni. Sto cercando un modo per fare qualcosa come OpenOffice

Strumenti> Detective> Traccia dipendenti

e

Modifica> Trova e sostituisci> Cerca nelle formule

o un modo per creare un trigger in GAS che viene chiamato quando viene fatto riferimento a un dato valore di cella e può identificare l'origine del riferimento.

Risposte:


12

Il seguente codice aggiungerà un menu al foglio di calcolo:

Detective> Traccia dipendenti

Selezionandolo, verrà aggiunta una nota alla cella attiva con tutti i riferimenti di cella dipendenti.

(aggiunta ricerca di riferimenti statici come suggerito da Graham di seguito)

È possibile aggiungere una funzione simile alla funzione traceDependents per cercare il testo all'interno della cella attiva per una funzione Cerca nelle formule. Lo lascerò come esercizio per te.

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

Questo è fantastico. Penso che puoi rimuovere la riga aggiuntiva: var output = "Dependents:";
jaredcohe,

Ben colto. L'ho rimosso. Grazie per gli occhi d'aquila.
Tom Horwood,

Questo mi piace molto! Però vedo correttamente che non supporta i Named Ranges? E se fosse così, sarebbe semplice / complicato aggiungere supporto?
Wizek,

2
Come usare il codice?
Ferrybig

1
perché la riga menuEntries.push({name: "Trace Dependents", functionName: "traceDependents"});appare due volte nel codice?
ThomasMcLeod

4

Questo è super e mi ha risparmiato molto lavoro - grazie.
Tuttavia, la risposta sopra non trova alcun riferimento che utilizza il fissatore di riga o colonna $.
La seguente leggera modifica al codice consente di:

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

Grazie; questo ha aiutato un po '. Come si potrebbe farlo funzionare su fogli di lavoro?
wizonesolutions,

Grazie Graham - ho incorporato le tue modifiche. Per quanto riguarda il lavoro su fogli di lavoro, il codice avrebbe bisogno di un po 'di aggiustamento per incorporare il nome del foglio e poi scorrere attraverso ciascuno dei fogli
Tom Horwood
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.