Di Google Spreadsheet, menemukan rumus apa yang mereferensikan nilai yang diberikan


17

Saya ingin mengetahui sel mana yang memiliki dependensi rumus dalam spreadsheet besar. Saya mencari cara untuk melakukan sesuatu seperti OpenOffice

Alat> Detektif> Lacak tanggungan

dan

Edit> Temukan & Ganti> Cari dalam formula

atau cara untuk membuat pemicu dalam GAS yang dipanggil ketika nilai sel tertentu dirujuk dan dapat mengidentifikasi sumber referensi.

Jawaban:


12

Kode berikut akan menambahkan menu ke Spreadsheet:

Detektif> Lacak Tanggungan

Memilih ini akan menambahkan catatan ke sel aktif dengan semua referensi sel tergantung.

(menambahkan pencarian untuk referensi statis seperti yang disarankan oleh Graham di bawah)

Anda bisa menambahkan fungsi serupa ke fungsi traceDependents untuk mencari teks di dalam sel aktif untuk fungsi Search in Formulas. Saya akan meninggalkan itu sebagai latihan untuk Anda.

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

Ini luar biasa. Saya pikir Anda dapat menghapus baris tambahan: var output = "Dependents:";
jaredcohe

Tertangkap dengan baik. Saya sudah menghapusnya. Terima kasih untuk mata elang.
Tom Horwood

Saya sangat suka ini! Apakah saya melihatnya dengan benar sehingga tidak mendukung Named Ranges? Dan jika itu masalahnya, apakah sederhana / rumit untuk menambahkan dukungan?
Wizek

2
Bagaimana cara menggunakan kodenya?
Ferrybig

1
mengapa garis menuEntries.push({name: "Trace Dependents", functionName: "traceDependents"});muncul dua kali dalam kode?
ThomasMcLeod

4

Ini super dan telah menyelamatkan saya banyak pekerjaan - terima kasih.
Namun jawaban di atas tidak menemukan referensi yang menggunakan fixer baris atau kolom $.
Perubahan kecil berikut untuk kode mencapai itu:

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

Terima kasih; ini agak membantu. Bagaimana cara membuatnya bekerja di seluruh lembar kerja?
wizonesolutions

Terima kasih Graham - Saya telah memasukkan perubahan Anda. Untuk bekerja di lembar kerja, kode ini perlu sedikit penyesuaian untuk memasukkan nama lembar dan kemudian loop melalui masing-masing lembar
Tom Horwood
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.