【问题标题】:How do you get the formula from a cell instead of the value?您如何从单元格中获取公式而不是值?
【发布时间】:2014-12-18 18:42:43
【问题描述】:

如何从单元格中获取文字值(公式)而不是结果值?

所需示例:

  • A2:“富”
  • B3:“=A2” - 所以它显示“Foo”
  • C3:“=CELL("formula", B3)" 显示“=A2”

当然,CELL() 不支持“公式”参数,这只是为了演示意图。我查看了函数列表,但没有任何反应。

用例:
我想引用另一行,并根据该引用从该行中获取其他单元格。放置明确的行号将不起作用(例如 B3 = "2"),因为在修改行时它不会自动更正。具体来说,我希望一行中的多个列与另一行中的列相关,并且能够在一个位置更改相对行,而无需编辑每一列。

通常,要使一行相对于另一行,您可以这样放置列值:“=A2+5”和“=B2+10”。这意味着A列是“相对行值+5”,B列是“相对行值+10”。如果要更改相对行(例如更改为第 56 行),则需要将每一列更改为“=A56+5”和“=B56+10”。如何通过仅编辑一个字段来完成此操作?

举一个实际的例子,考虑一个包含任务列表的工作表,每个工作表都可能被标记为“跟随”另一个,以便计算结束日期,但您希望能够更改参考任务并支持任务之间的 N:1 关系。

[更新]

实际上,我确实有针对特定用例的解决方案。但我仍然对最初的问题感到好奇:获取单元格中值背后的公式。

解决方案 1: - A2:“=行()” - B2:“富” - C3:“=A2”显示“2”并在添加/删除行时自动调整以保持引用

解决方案 2:

另一种解决方案是添加一个唯一的“id”列并按 id 存储引用,然后使用 LOOKUP() 查找该行。

【问题讨论】:

  • 我仍然在努力理解您的用例,并希望听到您对它进行一些扩展。但是有两件事:1. 无法使用本机电子表格函数访问与单元格关联的公式,以及 2. 我不确定 INDIRECT 函数是否对您有用。
  • 1.这回答了我的问题,谢谢,但是我如何使用脚本 API 访问它? 2. 一旦你有了行号,INDIRECT 很有用,如果你想为特定列加上前缀,但不想得到公式。用例:我扩展了问题描述。
  • 所以你不能拥有=INDIRECT("A"&A1)+5=INDIRECT("B"&A1)+10等?
  • 差不多。一项要求是只能在一处更改参考行。因此,如果“1”是您希望第 2 行引用的行,那么您将执行B2: =A1C2: =INDIRECT("C"&B2)+5D2: =INDIRECT("D"&B2)+10,其中A1: =ROW()。然后,如果您想将第 2 行的值更改为相对于第 42 行,那么您只需更改一处B2: =A42
  • 那么也许只是 B2:=ROW(A42)?

标签: google-sheets google-sheets-formula


【解决方案1】:

我遇到了同样的问题并尝试使用 Rubén 创建的公式,但有一个限制。我不能在另一个公式中使用这些公式(我试图制作一个 mid())。 所以采取了一种不同的方法:

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

【讨论】:

    【解决方案2】:

    使用这个:function =FORMULATEXT("cell")

    【讨论】:

    • 虽然这并没有回答问题的用例,但它确实完美地回答了问题的标题,这就是把我带到这里并解决我的问题的原因。跨度>
    【解决方案3】:

    编辑:此答案适用于问题描述中的用例,要求仅使用本机功能(无脚本)。

    根据从 AdamL 到问题的 cmets,答案是您无法从单元格(而不是值)中获取公式。

    但是,对于我试图解决的实际用例,=ROW(A42) 可用于获取对特定行的引用,该行将随着行的更改而自动更新。

    【讨论】:

    • 对方第一个说法是错误的(看你自己的评论stackoverflow.com/questions/26522305/…),第二个说法没有回答问题,假设标题概括了。
    • 在问题中,我忽略了强调在不添加脚本的情况下执行此操作的要求(仅使用内置函数)。我确实在后续评论中声明了这一点:“我如何在没有脚本的情况下访问它”?我同意有答案表明它可以通过脚本来完成。鉴于此,此答案中的第一条语句是正确的 - 没有内置函数来获取公式。第二个陈述是所描述用例的正确解决方案。再一次,原标题被误导了。
    【解决方案4】:

    使用getFormula()getFormulaR1C1() 方法获取单元格的公式。

    示例改编自https://webapps.stackexchange.com/a/92156/88163

    以下自定义函数将返回引用单元格的公式,但如果引用无效,则会返回错误消息。

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

    上述自定义函数的使用示例

    A2:FOO
    B3:公式=A2,值FOO
    C3:公式=CELLFORMULA(B3),值=A2

    【讨论】:

      【解决方案5】:

      尝试使用=formula(2,3),其中坐标为(行号,列号)

      Google 表格示例位于:https://docs.google.com/spreadsheets/d/1A1l0qdnNSHlJB-5DARGKDeIsbuCCLGuoYWm8sR29UTA/edit?usp=sharing

      显示公式...

      这是它的渲染方式...

      注意:有时加载公式需要一点时间,在此期间您会​​收到“正在加载数据...”之类的错误消息。

      另请注意:我不知道为什么会这样,因为formula 不是 google 表格的列出函数,但我一直在我的电子表格中使用它。也许尝试这个的想法来自 Excel 或其他东西,我不记得了。

      【讨论】:

      • 公式不是 Google 表格的功能。它在这里工作是因为它是通过脚本编辑器作为自定义函数实现的。 function formula(r,c) { return SpreadsheetApp . getActiveSheet() . getRange(r,c) . getFormula() ; }。在大型电子表格中太慢了,不实用,但确实可以强调可以使用自定义脚本解决问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多