【问题标题】:Find all cells with escaped out formulas '=查找所有带有转义公式的单元格 '=
【发布时间】:2021-02-18 14:07:27
【问题描述】:

我有一张表格,上面有很多公式,这些公式已经用'= 进行了注释或转义(不确定哪个术语是否准确)。我现在正在尝试查找并删除',但没有任何运气。

我可以弄清楚公式的重写,这只是我要挂断的'=的定位。我不太确定这些if 语句中的... == 0) 部分是什么意思,所以这是我的第一个问题。但我确信我的keyword 也可能存在问题。

function resetFormula(sheet, range) {
  formulas = range.getFormulas();

  for (var r = 0; r < formulas.length; r++) {
    for (var c = 0; c < formulas[r].length; c++) {
      var formula = formulas[r][c];
      var value = sheet.getRange(r + 1, c + 1).getValue();
      var value = value + "";
      // var keyword = "'="; // no results
      // var keyword = "'"; // finds all cells with '.  Not that BEGIN with '
      var keyword = "'\="; // no results

      if (formula.indexOf(keyword) == 0) {
        console.log("(formula.indexOf(keyword) == 0)");
        console.log("formula = " + formula);
        // sheet.getRange(r + 1, c + 1).setFormula(formula);
      } else {
        if (value.indexOf(keyword) == 0) {
          console.log("(value.indexOf(keyword) == 0)");
          console.log("value = " + value);
          // sheet.getRange(r + 1, c + 1).setValue(value);
        }
      }
    }
  }
}

【问题讨论】:

    标签: javascript google-apps-script google-sheets escaping indexof


    【解决方案1】:

    解释:

    • 在无法查看文件本身的情况下调试您的代码对我来说真的很困难,但我认为不值得调试它而是创建一个新的解决方案,因为您当前的方法不遵循best practices ,即反复使用getRangegetValuesetValue 会降低性能,因此您必须重新设计逻辑。

    您的目标是从“公式”中删除 '=

    • 请记住,这样的公式实际上(如您所说)已被注释掉,这意味着它是一个简单的字符串:'=sum(B1)。因此,使用getFormulas 是行不通的,因为您感兴趣的值是strings 而不是公式。您需要改用getValues

    解决办法:

    假设以下表格带有随机数据:

    以下脚本将从包含 ' 的每个单元格中删除它:

    function myFunction1() {
      const ss = SpreadsheetApp.getActive();
      const sh = ss.getSheetByName("Sheet1");
      const charToDel = "'=";
      const range = sh.getDataRange();
      const [values, formulas] = [range.getValues(),range.getFormulas()];
    
      const new_vals=formulas.map((r,i)=>r.map((c,j)=>c==''?values[i][j]:c.toString().
                                   includes(charToDel)?c.replace(charToDel,''):c));
      range.setValues(new_vals);
    }
    

    执行脚本后的结果将是相关单元格中的公式:

    旁注:

    我认为更改我的代码以适应您的逻辑非常简单。而不是sh 使用sheet 并删除range,因为它是由函数传递的。当然是在函数中添加相关参数。

    参考资料:

    【讨论】:

    • 你是对的! getFormulas() 函数只是禁用我刚刚复制并试图反转的公式的相反函数的残余。所以我删除了那个。而且您的解决方案确实有效,但是,它似乎引起了一些 REF!复制公式结果并将其粘贴为静态数据时出错。稍后我会再弄乱它,看看它是否只是我需要在我的工作表中更改的东西。而且我没有发布指向我的工作表的链接,因为过去有人“谴责”我,声称这是“糟糕的做法”,而且我的代码应该足够清晰......
    • @TC76 感谢您的反馈和试用。我更新了我的代码。请再检查一次。现在应该 100% 正确。
    【解决方案2】:

    我相信你的目标如下。

    • 您想查找公式顶部有' 的公式。就像'=
    • 您想通过删除 ''= 替换为 =
    • 您希望使用 Google Apps 脚本实现此目的。

    在这个答案中,作为另一种方法,我想建议使用 TextFinder 来实现您的目标。示例脚本如下。

    示例脚本:

    function myFunction() {
      const sheetName = "Sheet1";  // Please set the sheet name.
    
      SpreadsheetApp
        .getActiveSpreadsheet()
        .getSheetByName(sheetName)
        .createTextFinder("\'\=")
        .matchFormulaText(true)
        .useRegularExpression(true)
        .replaceAllWith("=");
    }
    
    • 在这种情况下,“Sheet1”的所有公式中'=的值都被替换为=

    • 如果您想对电子表格中的所有工作表都使用此功能,也可以使用以下脚本。

        SpreadsheetApp
          .getActiveSpreadsheet()
          .createTextFinder("\'\=")
          .matchFormulaText(true)
          .useRegularExpression(true)
          .replaceAllWith("=");
      

    参考:

    【讨论】:

      【解决方案3】:

      我还没有尝试过@Tanaike 的解决方案,但这是我今天早些时候想出的。我正在寻找不必要的'

      var keyword = "=";

      function resetFormula(sheet, rangeValues, keyword) {
        for (var r = 0; r < rangeValues.length; r++) {
          for (var c = 0; c < rangeValues[r].length; c++) {
            var value = sheet.getRange(r + 1, c + 1).getValue();
            var value = value + "";
            if (value.indexOf(keyword) !== -1) {
              sheet.getRange(r + 1, c + 1).setValue(value);
            }
          }
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-19
        • 1970-01-01
        • 2021-12-07
        • 1970-01-01
        • 2017-09-04
        相关资源
        最近更新 更多