В Google Spreadsheet можно найти, какие формулы ссылаются на данное значение.

17

Я хотел бы выяснить, какие ячейки имеют зависимости формулы в большой электронной таблице. Я ищу способ сделать что-то вроде OpenOffice

Инструменты> Детектив> Отслеживание зависимостей

и

Правка> Найти и заменить> Поиск в формулах

или способ создания триггера в GAS, который вызывается при ссылке на заданное значение ячейки и может идентифицировать источник ссылки.

MetaEd
источник

Ответы:

12

Следующий код добавит меню в электронную таблицу:

Детектив> Trace Dependents

Выбор этого добавит примечание к активной ячейке со всеми зависимыми ссылками ячейки.

(добавлен поиск статических ссылок, как предложено Грэмом ниже)

Вы можете добавить аналогичную функцию в функцию traceDependents для поиска текста в активной ячейке для функции поиска в формулах. Я оставлю это как упражнение для вас.

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);
}
Том Хорвуд
источник
Это потрясающе. Я думаю, что вы можете удалить лишнюю строку: var output = "Dependents:";
Jaredcohe
Хорошо пойман. Я удалил это. Спасибо за орлиные глаза.
Том Хорвуд
Мне это очень нравится! Правильно ли я вижу, что он не поддерживает именованные диапазоны? И если это так, будет ли просто / сложно добавить поддержку?
Визек
2
Как использовать код?
Ferrybig
1
почему строка menuEntries.push({name: "Trace Dependents", functionName: "traceDependents"});появляется дважды в коде?
ThomasMcLeod
4

Это супер и сэкономило мне много работы - спасибо.
Однако ответ выше не находит ссылок, использующих фиксатор строк или столбцов $.
Следующее небольшое изменение в коде выполняет это:

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);
}
Грэхем
источник
Благодарность; это помогло несколько. Как можно заставить его работать на рабочих листах?
wizonesolutions
Спасибо, Грэм, я включил твои изменения. Что касается работы с листами, код должен был бы быть немного скорректирован, чтобы включить имя листа, а затем
Том Хорвуд,