【问题标题】:Call formula, NOT value, from another cell, and execute formula in new cell从另一个单元格调用公式,而不是值,并在新单元格中执行公式
【发布时间】:2018-12-04 23:00:22
【问题描述】:

我正在尝试找到一种方法将 B3 中使用的公式(目前是一个简单的 AVERAGE 公式)调用到 G3 中并在那里使用它。绿色单元格是用于测试的静态值。如果我在 G3 中执行“=B3”,我将从 B3 中获得不是我想要的值。我想要F3和H3的平均值。基本上就像一个长范围的、可更新的复制/粘贴或 FormulaArray。如果这是有道理的。由于我将在其上实现此功能的工作表将包含许多公式实例,因此我希望能够在一个地方更改它们并自动进行更新,而无需复制/粘贴。我还将调用另一个文档中的公式。所以我想要一种方法,通过它我可以将 B3 更改为 MULTIPLY 公式,它会自动将该更改应用于 G 列中的单元格,当然引用相关单元格。这甚至可能吗?

我确实发现了一个与此非常相似的问题:

How do you get the formula from a cell instead of the value?

但是在这两个可行的解决方案中,Ruben 的 CELLFORMULA 设法将函数作为字符串拉入(就像在 G5 中一样),这很接近! Luiz's 根本不适合我,尽管看起来他确实在尝试做我想做的事。我摆弄它,但无论我做什么,我都无法让它工作。其他建议都不起作用。

这是我为说明我在寻找什么而制作的测试表:

Call Formula Test Sheet

补充:

正如我所说,Ruben 的代码按预期完美运行,Luiz 表示他自己做了一些调整,以便让公式在新单元格中执行。但是复制和粘贴 Luiz 的代码只会产生错误,并且尝试自己调整它是一个失败的原因,因为我最近才开始编写脚本和编码。我只是尽力将 Ruben 的原始代码与 Luiz 的更改代码进行比较和对比,并找出可能是错误的任何差异。像这样的:

function CELLFORMULA(reference) {
  var ss = SpreadsheetApp;
  var sheet = ss.getActiveSheet();
  var formula = ss.getActiveRange().getFormula();
  var re = /cellformula\((.*)\);/g;
  var args = re.exec(formula);
  try {
    var range = sheet.getRange(args[1]);
  }
  catch(e) {
    throw new Error(args[1] + ' is not a valid range');
  }
  return range.getFormula();
}

Luiz 似乎没有像 Ruben 那样指出变量?我不知道。但是这两个代码的根本区别似乎是:

var args = formula.match(/=\w+\((.*)\)/i);

在鲁本的与在路易斯的(未更改)中发现的内容:

 re = /cellformula\((.*)\);/g;
  args = re.exec(formula);

在我看来 re.exec(formula) 是 Luiz 的一段代码,它应该导致执行公式,而不是仅仅将其作为字符串放入单元格中,但我肯定是错的。

正如我所说,我对这个和“(/=\w+((.))/i)”和“/cellformula((.));/g”部分不熟悉完全在我头上。我试图搜索该语法以更好地理解它,但没有运气。

【问题讨论】:

  • 欢迎。添加您尝试根据您的特定目标调整参考答案的代码。

标签: google-apps-script google-sheets google-sheets-formula


【解决方案1】:

正如我所说,我对此并不陌生,“(/=\w+((.))/i)”和“/cellformula((.));/g”部分完全超出了我的想象。我试图搜索该语法以更好地理解它,但没有运气。

他们是regular expressions


为了能够用另一个公式替换单元格公式,不能使用自定义函数,但这可以通过可安装的编辑函数来完成。

为简单起见,以下代码将非常具体:如果 B3 上的公式发生更改,则 G7 上的公式将被更新。

function updateFormula(e) {
  var formula = e.range.getFormulaR1C1();
  if(e.range.rowStart == 3 && e.range.columnStart == 2 && formula != ""){
    var sheet = e.range.getSheet();
    var target = sheet.getRange('G7');
    target.setFormulaR1C1(formula);
  }
}

记得创建一个可安装的调用上述函数的编辑触发器,如果​​你想从脚本编辑器检查它How can I test a trigger function in GAS?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    相关资源
    最近更新 更多