Trong Bảng tính Google, tìm công thức nào tham chiếu giá trị đã cho


17

Tôi muốn tìm ra các ô có phụ thuộc công thức trong một bảng tính lớn. Tôi đang tìm cách để làm một cái gì đó như OpenOffice

Công cụ> Thám tử> Người phụ thuộc dấu vết

Chỉnh sửa> Tìm & Thay thế> Tìm kiếm trong công thức

hoặc một cách để tạo một kích hoạt trong GAS được gọi khi một giá trị ô đã cho được tham chiếu và có thể xác định nguồn của tham chiếu.

Câu trả lời:


12

Đoạn mã sau sẽ thêm một menu vào Bảng tính:

Thám tử> Người phụ thuộc dấu vết

Chọn mục này sẽ thêm ghi chú vào ô hiện hoạt với tất cả các tham chiếu ô phụ thuộc.

(thêm tìm kiếm cho các tham chiếu tĩnh theo đề xuất của Graham bên dưới)

Bạn có thể thêm một hàm tương tự vào hàm trackDependents để tìm kiếm văn bản trong ô hiện hoạt cho hàm Tìm kiếm trong Công thức. Tôi sẽ để nó như một bài tập cho bạn.

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

Điều này thật tuyệt vời. Tôi nghĩ bạn có thể xóa dòng phụ: var output = "Dependents:";
jaredcohe

Cũng bị bắt. Tôi đã loại bỏ nó. Cảm ơn đôi mắt đại bàng.
Tom Horwood

Tôi rất thích điều này! Tuy nhiên, tôi có thấy chính xác rằng nó không hỗ trợ Phạm vi được đặt tên không? Và nếu đó là trường hợp, nó sẽ đơn giản / phức tạp để thêm hỗ trợ?
Wizek

2
Làm thế nào để sử dụng mã?
Ferrybig

1
Tại sao dòng menuEntries.push({name: "Trace Dependents", functionName: "traceDependents"});xuất hiện hai lần trong mã?
ThomasMcLeod

4

Đây là siêu và đã tiết kiệm cho tôi nhiều công việc - cảm ơn.
Tuy nhiên, câu trả lời ở trên không tìm thấy bất kỳ tài liệu tham khảo nào sử dụng trình sửa lỗi hàng hoặc cột $.
Thay đổi nhỏ sau đây để mã thực hiện rằng:

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

Cảm ơn; Điều này đã giúp phần nào. Làm thế nào một người sẽ làm cho nó hoạt động trên các bảng tính?
wizonesolutions

Cảm ơn Graham - Tôi đã kết hợp các thay đổi của bạn. Để làm việc trên các bảng tính, mã sẽ cần một chút điều chỉnh để kết hợp tên trang tính và sau đó lặp qua từng trang tính
Tom Horwood
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.