Google E-Tablo'da, hangi formüllerin belirli bir değere başvurduğunu bulma


17

Hangi hücrelerin büyük bir e-tabloda formül bağımlılıklarına sahip olduğunu bulmak istiyorum. OpenOffice gibi bir şey yapmanın bir yolunu arıyorum

Araçlar> Dedektif> İz bağımlıları

ve

Düzen> Bul ve Değiştir> Formüllerde ara

veya GAS'ta belirli bir hücre değerine başvurulduğunda çağrılan ve başvurunun kaynağını tanımlayabilen bir tetikleyici oluşturmanın bir yolu.

Yanıtlar:


12

Aşağıdaki kod, E-tabloya bir menü ekleyecektir:

Dedektif> İz Bağımlıları

Bunu seçtiğinizde, aktif hücreye tüm bağımlı hücre referanslarını içeren bir not eklenir.

(Graham tarafından önerilen statik referanslar için arama eklendi)

Etkin hücredeki metni Formüllerde Ara işlevini aramak için traceDependents işlevine benzer bir işlev ekleyebilirsiniz. Bunu senin için bir egzersiz olarak bırakacağım.

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

Bu müthiş. Ben ekstra satır kaldırabilirsiniz: var output = "Bağımlılar:";
jaredcohe

İyi yakalanmış. Kaldırdım. Kartal gözleri için teşekkürler.
Tom Horwood

Bunu çok seviyorum! Yine de Adlandırılmış Aralıkları desteklemediğini doğru mu görüyorum? Ve eğer durum buysa, destek eklemek basit / karmaşık olur mu?
Wizek

2
Kod nasıl kullanılır?
Ferrybig

1
neden menuEntries.push({name: "Trace Dependents", functionName: "traceDependents"});kodda iki kez görünüyor?
ThomasMcLeod

4

Bu süper ve beni çok işten kurtardı - teşekkürler.
Ancak yukarıdaki yanıt, satır veya sütun sabitleyiciyi kullanan hiçbir başvuru bulamamaktadır $.
Koddaki aşağıdaki küçük değişiklik bunu başarır:

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

Teşekkürler; bu biraz yardımcı oldu. Kişi çalışma sayfalarında nasıl çalışır?
wizonesolutions

Teşekkürler Graham - Değişikliklerinizi dahil ettim. Çalışma sayfalarında çalışma konusunda, kodun sayfa adını dahil etmek ve daha sonra sayfaların her birini döngüye sokmak için biraz ayarlanması gerekir
Tom Horwood
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.