如何在Google表格公式中保存临时变量?


19

我正在尝试在Google电子表格中创建一个公式,如下所示:

if (x < 0, x + 1, x)

这意味着如果x小于0,则返回x + 1,否则返回x

但是,x它本身是一个表达式,例如A1 + B1。所以我最终得到了:

if ((A1 + B1) < 0, (A1 + B1) + 1, (A1 + B1))

如何将表达式保存(A1 + B1)到临时变量中x以便可以执行此操作?:

x = (A1 + B1);
if (x < 0, x + 1, x);

电子表格中的当前表达式如下所示:

if(
    timevalue(Sheet1!$D10)-timevalue(min(filter(Sheet1!$D$2:$D$99,Sheet1!$A$2:$A$99=A10,Sheet1!$E$2:$E$99=E10))))
    < 0,
    1 +
    timevalue(Sheet1!$D10)-timevalue(min(filter(Sheet1!$D$2:$D$99,Sheet1!$A$2:$A$99=A10,Sheet1!$E$2:$E$99=E10))))
    ,
    timevalue(Sheet1!$D10)-timevalue(min(filter(Sheet1!$D$2:$D$99,Sheet1!$A$2:$A$99=A10,Sheet1!$E$2:$E$99=E10))))
)

我正在尝试使其看起来更短,更易于管理,如下所示:

x = timevalue(Sheet1!$D10) - timevalue(min(filter(Sheet1!$D$2:$D$99,Sheet1!$A$2:$A$99=A10,Sheet1!$E$2:$E$99=E10))));
if(
    x
    < 0,
    1 +
    x
    ,
    x
)

1
@ pnuts,Hmm,变量是公式的组成部分。窃取作为临时变量的单元格感觉像是一个肮脏的解决方案,因为单元格用于存储业务数据,而不是ram。
Pacerier 2014年

1
@pnuts,只要它不存储在单元格中,存储在哪里都没有关系。单元用于存储业务数据。
Pacerier 2014年

1
@pnuts,脚本解决方案可能是下一个最佳替代方案。只要数据不出现在单元格中,它就是可行的解决方案。
Pacerier,2014年

Answers:


6

我经常最终将单元格用作常用计算的变量,并且实际上使用“命名范围”来命名它们。它使您更容易考虑要开发的公式。如果您不希望看到这些单元格,则可以隐藏它们。


将以此作为选择的解决方案,直到出现更好的解决方案为止。
Pacerier,2015年

4

简短答案

目前,Google表格不具备为公式定义的变量(而不是单元格或范围引用)分配名称的功能。若要将公式与这些类型的变量一起使用,替代方法是使用自定义函数。

Google表格中的自定义功能

自定义功能是在Google Apps脚本绑定的项目或Google表格加载项中定义的。它们只能用于返回值,不能用于自动执行任务,例如发送电子邮件。

自定义函数类似于JavaScript函数,可以使用JSDOC添加内置函数功能(例如自动完成功能)并显示弹出式公式帮助器。还可以包含自定义错误消息。

在问题中出现的情况下,要在单元格中显示的公式的所需结构应具有以下结构

if(x < 0, 1 + x, x)

哪里x可能是自定义函数。

以下是使用JSDOC的自定义函数的简单示例。

/**
* Returns the cell value of the specified row in column A of Sheet1.
* @param {number}   row_number   Input the row number.
* @return The cell value of the specified row in column A of Sheet1.       
* @customfunction
*/
function z(row_number) {
  if(typeof(row_number) != 'number') 
    throw new Error("A row number is required");
  return SpreadsheetApp
           .getActiveSheet()
           .getRange("Sheet1!A"+row_number)
           .getValue();
}

将上述自定义函数与问题中指定的结构一起使用的公式将以以下方式显示

=if(z(10) < 0, 1 + z(10), z(10))

row() 可以代替常量使用输入放置公式的行作为输入。

为了“模拟”问题中显示的显式公式,应将内置公式替换为JavasScript / Google Apps Script函数。

参考文献


是否可以使用Google Sheet的函数(而不是JS的)定义自定义函数?我没有在这个方向上找到任何东西,所以我对此表示怀疑。
anderstood '16

@anderstood:目前无法。见stackoverflow.com/questions/3686061/...
鲁文

3

我正在为此做一些尝试(我同意这将是一个非常有用的功能,尤其是对于长公式而言。这是我到目前为止所写的内容:

//array to store variables
var variables = [];

//Wrap a formula with "D_VAR0()" for later use
function D_VAR0(formula) {
  variables.push(formula);
}

//Write "VAR0" to access the 0th element of variables[] (which could be a long formula)
function VAR0() {
  return variables[0];
}

从理论上讲,这对于简化复杂的单元格公式非常有用,例如:

=IF((A2+B2)/B3<16, (A2+B2)/B3, ((A2+B2)/B3)*45)

到这个:

=IF(D_VAR0((A2+B2)/B3)<16, VAR0, VAR0*45)

另外D_VAR#'sVAR#'s可以将其写入脚本以允许根据需要进行多个变量声明和调用。

但是,似乎D_VAR0没有正确地将包装的变量存储到variables []数组中。

如果我手动在数组中输入一个元素,则VAR0可以访问它并将其返回到活动单元格中。例如:

var variables = ["test"];

//results in the active cell being set to "test"
function VAR0() {
     return variables[0];
}

这给我留下了两个问题。如果有以下可能,那么我认为可以通过自定义函数声明和调用临时变量:

  1. 如果自定义函数可以访问数组元素,那么它们也可以元素存储到数组吗?如果是这样,怎么办?

  2. 如果自定义函数可以将元素存储到数组中,那么它们是否只能在同一单元格中的同一连续公式中访问?还是可以在不同的单元格中访问相同的存储变量?例:

Cell A1 = D_VAR0(sum(3,5))

Cell D4 = VAR0() //would this return 8 in cell D4? It hasn't worked in my testing.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.