ใน Google Spreadsheet ให้ค้นหาว่าสูตรใดอ้างอิงถึงค่าที่กำหนด


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

จับได้ดี ฉันลบมันแล้ว ขอบคุณสำหรับดวงตาอินทรี
Tom Horwood

ฉันชอบสิ่งนี้มาก! ฉันเห็นอย่างถูกต้องหรือไม่ว่าไม่รองรับช่วงการตั้งชื่อ และถ้าเป็นเช่นนั้นมันจะง่าย / ซับซ้อนหรือไม่ในการเพิ่มการสนับสนุน?
Wizek

2
วิธีใช้รหัส
Ferrybig

1
เหตุใดบรรทัดจึงmenuEntries.push({name: "Trace Dependents", functionName: "traceDependents"});ปรากฏขึ้นสองครั้งในรหัส
ThomasMcLeod

4

นี่คือสุดยอดและช่วยให้ฉันทำงานหนักมาก - ขอบคุณ
แต่คำตอบดังกล่าวข้างต้นไม่พบการอ้างอิงใด ๆ ที่ใช้ row- $หรือคอลัมน์ผู้ให้บริการ
การเปลี่ยนแปลงเล็กน้อยในรหัสต่อไปนี้บรรลุว่า:

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

ขอบคุณ Graham - ฉันได้รวมการเปลี่ยนแปลงของคุณ ในการทำงานกับแผ่นงานรหัสจะต้องมีการปรับเล็กน้อยเพื่อรวมชื่อแผ่นงานแล้ววนรอบแผ่นงานแต่ละแผ่น
Tom Horwood
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.