从另一个单元格调用公式(不是值),然后在新单元格中执行公式

时间:2018-12-04 23:00:23

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

我试图找到一种方法来将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)的工作根本不适合我,尽管看起来他似乎在尝试做我想要的事情。我摆弄着它,但是无论如何我都无法使它工作。其他建议都没有。

这是我制作的一张测试纸,用以说明我要寻找的东西:

Call Formula Test Sheet

其他:

正如我说的那样,鲁本的代码按预期的那样完美地工作,路易斯表示自己进行了一些调整,以使公式在新单元格中执行。但是复制和粘贴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);

在鲁本(Ruben)的影片中与路易兹(Luiz)的发现(不变):

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

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

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

1 个答案:

答案 0 :(得分:0)

  

正如我所说,我是新手,“(/ = \ 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?

进行测试,