google-apps-script - 从另一个单元格调用公式,NOT 值,并在新单元格中执行公式

标签 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

附加:

正如我所说,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);

Ruben 与 Luiz 的比较(未更改):

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

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

正如我所说,我对这个和“(/=\w+((.))/i)”和“/cellformula((.));/g”部分不熟悉完全超出了我的理解范围。我试图搜索该语法以更好地理解它,但没有成功。

最佳答案

As I said, I am new to this and the "(/=\w+((.))/i)" and "/cellformula((.));/g" parts are completely over my head. I tried to search for that syntax to understand it better but had no luck.

它们是 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?

关于google-apps-script - 从另一个单元格调用公式,NOT 值,并在新单元格中执行公式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53622712/

相关文章:

date - 谷歌表格中过去 7 天的平均值公式

google-sheets - 在 Google 表格中使用 GOOGLETRANSLATE 函数时出现 "Google Translate internal error"

google-apps-script - 使用正则表达式的方法 findText

replace - Google表格中的自动查找和替换脚本 - 删除某些特定单元格内容 - 全局替换

google-apps-script - Google Apps Script 中是否有办法设置行高以适合数据

google-sheets - Google 表格查询 : Adding Arithmetic Sequence Creating #N/A

google-sheets - 需要预测公式

javascript - 如何使用 Google Apps 脚本上的电子表格一次更新一行的所有列?

google-sheets - 如何检测唯一值并计算具有重复数据的单元格数量

api - 是否可以将 Google Sheets API 配额限制提高到每个帐户 2500 个以上和每个用户 500 个以上?