regex google app script:插入$仅用于行中的绝对引用

gv8xihay  于 2023-06-25  发布在  Go
关注(0)|答案(1)|浏览(85)

尝试使用GAS将长公式转换为绝对行引用,下面是一个简短的示例。
看看这个:=IFERROR((AW220-AW221)/(AW216*4)/1000+AW217)
下一篇:=IFERROR((AW$220-AW$221)/(AW$216*4)/1000+AW$217)
我需要所有的单元格引用都按行锚定。
我可以把它剥离出来formula.replace(/\$/g,""),不知道如何把它放回去。我只能使用[A-Z]+[0-9]+匹配,现在该怎么办?

5cnsuln7

5cnsuln71#

我相信你的目标如下。

  • 您希望实现以下转换。
=IFERROR((AW220-AW221)/(AW216*4)/1000+AW217)
=IFERROR((AW$220-AW$221)/(AW$216*4)/1000+AW$217)

我认为在这种情况下,当公式作为R1C1检索时,脚本可能会很简单。当这反映在示例脚本中时,下面的示例脚本如何?

示例脚本:

在使用此脚本之前,请将预期范围设置为A1Notation。

function myFunction() {
  const rangeA1Notation = "'Sheet1'!A1:C10"; // Please set your range as A1Notation.

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const range = ss.getRange(rangeA1Notation);
  const values = range.getValues();
  const newValues = range.getFormulasR1C1().map((r, i) => r.map((c, j) => c ? c.replace(/R\[(.*?)\]C\[(.*?)\]/g, (_, p2, p3) => `R${Number(p2) + i + 1}C[${Number(p3)}]`) : values[i][j]));
  range.setValues(newValues);
}
  • 运行此脚本时,脚本将搜索公式。并且,每个公式的范围被修改为像AW220AW$220
  • 当我测试=IFERROR((AW220-AW221)/(AW216*4)/1000+AW217)公式时,此脚本将其转换为=IFERROR((AW$220-AW$221)/(AW$216*4)/1000+AW$217)

参考资料:

  • getFormulasR1C1()
  • map()

相关问题