У електронній таблиці Google знайдіть, які формули посилаються на задане значення


17

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

Інструменти> Детектив> Залежні сліди

і

Редагувати> Знайти та замінити> Пошук у формулах

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

Відповіді:


12

Наступний код додасть меню до електронної таблиці:

Детектив> Залежні сліди

Вибравши це, додасте примітку до активної комірки з усіма залежними посиланнями комірок.

(додано пошук статичних посилань, як запропонував Грехем нижче)

Ви можете додати аналогічну функцію до функції 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 = "Залежні:";
jaredcohe

Добре спійманий. Я її зняв. Дякую за орлині очі.
Том Хорвуд

Мені це дуже подобається! Чи правильно я бачу, що він не підтримує названі діапазони? І якщо це так, чи було б просто / складно додати підтримку?
Візек

2
Як користуватися кодом?
Феррібіг

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

Дякую Грем, я включив ваші зміни. Що стосується роботи на робочих аркушах, код потребує трохи коригування, щоб включити назву аркуша, а потім провести цикл через кожен з аркушів
Том Хорвуд,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.