Googleスプレッドシートで、特定の値を参照する式を見つける


17

大きなスプレッドシートで、どのセルに数式の依存関係があるかを調べたいと思います。OpenOfficeのようなことをする方法を探しています

ツール>探偵>トレース依存

そして

[編集]> [検索と置換]> [数式で検索]

または、特定のセル値が参照されたときに呼び出され、参照のソースを識別することができるトリガーをGASで作成する方法。

回答:


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

よく釣れた。削除しました。ワシの目をありがとう。
トム・ホーウッド

私はこれがとても好きです!ただし、名前付き範囲をサポートしていないことが正しくわかりますか?その場合、サポートを追加するのは簡単/複雑ですか?
ウィゼク

2
コードの使用方法
フェリービッグ

1
menuEntries.push({name: "Trace Dependents", functionName: "traceDependents"});コードに行が2回表示されるのはなぜですか?
ThomasMcLeod

4

これはすばらしく、多くの作業を節約してくれました-ありがとう。
ただし、上記の回答では、row-または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

ありがとう、グラハム-あなたの変更を取り入れました。ワークシートを横切って作業するように、コードは、シート名を組み込むために調整のビットを必要とし、その後、シートのそれぞれをループ
トム・ホーウッド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.