【问题标题】:Is there a way to automatically run a formula a single time?有没有办法自动运行一次公式?
【发布时间】:2021-05-04 18:45:27
【问题描述】:

假设我有一张桌子:

Quantity Item Value Fetched Item Suggestion
5 Meat Variable Meat ...

“值”列中的单元格有一个 VLOOKUP 公式来获取与“项目”同名的项目的值,如果不合适(这意味着有多个选项),则返回“变量”。 Suggestion 列中的 Cells 有一个 VLOOKUP 公式,用于获取与“Item”同名的类别中的最低值项目,如果没有这样的类别,则返回“”(这意味着该项目将在值列的搜索)。搜索后,表格如下:

Quantity Item Value Fetched Item Suggestion
5 Meat Variable Meat Cow Meat

现在,D 列和 E 列不会被使用,因此用户将 B 列更改为包含建议的项目。

Quantity Item Value Fetched Item Suggestion
5 Cow Meat 300 Meat Cow Meat

所以我不希望用户必须将“肉”放在“获取的项目”列中才能正常工作,所以假设该列中只有一个简单的 =B2 公式。工作表现在看起来像这样:

Quantity Item Value Fetched Item Suggestion
5 Cow Meat 300 Cow Meat

但是,建议公式引用的工作表会定期更新值,所以快进到现在牛肉比猪肉成本更高的地步。我希望表格看起来像这样:

Quantity Item Value Fetched Item Suggestion
5 Cow Meat 300 Meat Pig Meat

这样,用户可以相应地更新 B 列。这意味着我需要某种方式让 D 列自动复制 B 列的内容如果 C 列读取“变量”,同时忽略未来对 B 列的更改。

=IF($C5="Variable",[copy $B5],"")

我猜是这样的吧?我想最简单的表达方式是“有没有办法自动运行一次公式?”,这比我的旧标题“在引用单元格时获取数据的“快照”所以它不会如果引用的单元格改变了?”,所以我已经相应地改变了它。

【问题讨论】:

  • 没有。公式不能运行一次。您应该使用脚本。
  • 正如 Krzysztof 所说,您可能需要 Apps 脚本。你愿意用那个吗?如果是这种情况,您会考虑提供电子表格的副本吗?
  • 我以前从未使用过脚本,但我想我愿意尝试。 Here's the link 到一个你们都可以编辑的副本。
  • 我不确定我是否理解所需的行为。我猜只有第一次更新 B 列,D 列应该用 B 列的值更新吗?如果稍后更新 B 列,则应忽略此更新并且不将其复制到 D 列?
  • 没错。

标签: google-sheets google-sheets-formula


【解决方案1】:

使用 onEdit:

您可以使用 onEdit trigger,使用 Apps 脚本(单击 Tools > Script editor,复制下面的函数并保存项目)。

(为此,请创建一个新列 (G),该列将用于存储有关是否有以前的副本的信息。然后您可以将其隐藏。)

每次用户编辑电子表格时都会执行此函数,它会使用event object

  • 检查已编辑的列是否对应于Item,并且已编辑的列是您想要的工作表(您提供的电子表格中的C 列和工作表Recipe Cards)。
  • 如果是这种情况,请检查Value 列(D)是否等于VariableG 列是否等于某个字符串(在下面的示例中称为Avoid future updates)。
  • 如果是这种情况,请将值从C 设置为E,并将Avoid future updates 写入列G

代码sn-p:

function onEdit(e) {
  const range = e.range;
  const sheet = range.getSheet();
  const rowIndex = range.getRow();
  const colIndex = range.getColumn();
  const avoidUpdateColumn = 7;
  const itemColumn = 3;
  const valueColumn = 4;
  const fetchedItemColumn = 5;
  const copyValue = "Variable"; // Do not copy if column doesn't have this value
  const avoidUpdateValue = "Avoid future updates"; // Do not copy if column has this value
  const sheetName = "Recipe Cards";
  if (colIndex === itemColumn && sheet.getName() === sheetName) {
    const numCols = sheet.getLastColumn()-colIndex+1;
    const rowValues = sheet.getRange(rowIndex, colIndex, 1, numCols).getValues()[0];
    if (rowValues[valueColumn-itemColumn] === copyValue && rowValues[numCols-1] !== avoidUpdateValue) {
      sheet.getRange(rowIndex, fetchedItemColumn).setValue(rowValues[0]);
      sheet.getRange(rowIndex, avoidUpdateColumn).setValue(avoidUpdateValue);
    }
  }
}

参考:

【讨论】:

  • 我无法打开脚本编辑器。 “无法访问文件”错误。我相信你的答案会奏效,所以我会将其标记为正确。
  • @Octotroph 这很奇怪,你检查过其他电子表格是否会发生这种情况吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
  • 2020-03-21
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多