【问题标题】:Google Sheets Script: Function to Find Text Including in FormulasGoogle表格脚本:查找包含在公式中的文本的功能
【发布时间】:2020-12-11 09:01:55
【问题描述】:

由于我在分析电子表格中使用了大量公式,因此我需要能够在所有工作表的所有单元格中搜索具有指定搜索文本的任何单元格中的公式,最好不区分大小写。

例如,搜索“ce-z”,找到所有具有以下公式的单元格: "=vlookup(round(D29,0),Sails_Sheet, match("CE-z",Sails_Sheet_Headers, 0),false)"

很遗憾,TextFinder 类不这样做。

有没有办法遍历每张纸中的每个单元格并检查它的功能?

【问题讨论】:

  • 什么意思:搜索"ce-z", and find all cells that has the formula: "=vlookup(round(D29,0),Sails_Sheet, match("CE-z",Sails_Sheet_Headers, 0),false)"。你想搜索ce-z 还是这个公式?
  • 对不起,我想在公式中找到字符串“CE-z”。但是,正如我作为答案发布的那样,我所要做的就是将“.matchFormulaText(true)”添加到 creatTextFinder。还是谢谢。

标签: google-apps-script google-sheets


【解决方案1】:

在 TextFinder 类中找到了一个完全符合我要求的方法:matchFormulaText(boolean)。完整的功能如下,它从我的自定义菜单中调用一个对话框,正如@Tanaike 所发布的那样,还有我的一个补充:

function c_FindText() {
// Author: Tanaike : tanaikech.github.io/2020/06/26/search-dialog-sample-using-textfinder-with-google-apps-script/
// Date: 20102-12-10
// Purpose: Find text in all sheets, eg a NamedRange, cell reference (eg 'BF133'), custom function, etc
  const htmlStr = `
  <input type="text" id="searchText" name="searchText">
    <button id="previous" onclick="googleScript(c > 0 ? c - 1 : 0)">PREVIOUS</button>
    <button id="next" onclick="googleScript(++c)">NEXT</button>
    <script>
      let c = -1;
  const googleScript = (i) =>
    google.script.run.withSuccessHandler(cc => c = cc).searchText(document.getElementById("searchText").value, i);
  </script>
`;
  const htmlObj = HtmlService.createHtmlOutput(htmlStr)
    .setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL)
    .setWidth(350)
    .setHeight(50);
  SpreadsheetApp.getUi().showModelessDialog(htmlObj, "Find Text");
}
function searchText(searchValue, c) {
  const ranges = SpreadsheetApp.getActiveSpreadsheet()
    .createTextFinder(searchValue)
    .matchFormulaText(true)         // MH: added to also search Formulas
    .findAll();
  if (c < ranges.length) {
    ranges[c].activate();
    return c;
  }
  return --c;
}

【讨论】:

    【解决方案2】:

    您可以简单地检查每个工作表中的每个单元格以获得所需的值。为此,您可以使用类似的东西:

    片段

    function checkCells() {
        var spreadsheet = SpreadsheetApp.openById('SPREADSHEET_ID');
        var sheets = spreadsheet.getSheets();
        for (let i = 0; i < sheets.length; i++) {
            let range = sheets[0].getDataRange();
            for (let j = 0; j < range.getLastRow(); j++)
                for (let k = 0; k < range.getLastColumn(); k++)
                    if (range[j][k].getValue() == "VALUE" || range[j][k].getFormula() == "A1_NOTATION_FORMULA")
                        // do things 
    
        }
    
    }
    

    说明

    上面的脚本循环遍历电子表格所有工作表中的所有单元格。为了获得所有工作表,使用了getSheets() 方法。至于检查每个单元格的内容,这是通过使用获取单元格的值来完成的:

    • getValue() - 如果您需要单元格的特定值;

    • getFormula() - 如果您需要单元格的公式;

    参考

    【讨论】:

    • 我从这条轨道开始,然后当我作为答案发布时,我所要做的就是将“.matchFormulaText(true)”添加到 creatTextFinder。还是谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多