在Google电子表格中,查找哪些公式引用了给定值


17

我想找出大型电子表格中哪些单元格具有公式依赖性。我正在寻找一种类似OpenOffice的方法

工具>侦探>跟踪依赖

编辑>查找和替换>在公式中搜索

或一种在GAS中创建触发器的方法,当引用给定的单元格值并可以识别引用的来源时调用该触发器。

Answers:


12

以下代码将向电子表格添加一个菜单:

侦探>跟踪相关者

选择此项将为带有所有相关单元格引用的活动单元格添加注释。

(添加了下面的Graham建议的对静态引用的搜索)

您可以在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 2013年

好抓。我已将其删除。感谢鹰眼。
汤姆·霍伍德2013年

我很喜欢这个!我是否正确地看到它不支持命名范围?如果是这样,增加支持是否简单/复杂?
Wizek 2015年

2
如何使用代码?
Ferrybig '18年

1
为什么该行在menuEntries.push({name: "Trace Dependents", functionName: "traceDependents"});代码中出现两次?
ThomasMcLeod

4

这非常好,为我节省了很多工作-谢谢。
但是,以上答案找不到使用row-fixer或column-fixer的任何引用$
对代码进行以下微小更改即可完成此任务:

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 2015年

谢谢格雷厄姆-我已将您的更改纳入其中。至于跨工作表,代码需要进行一些调整以合并工作表名称,然后遍历每个工作表
Tom Horwood
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.