我正在尝试在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:$D,Sheet1!$A:$A=A10,Sheet1!$E:$E=E10))))
    < 0,
    1 +
    timevalue(Sheet1!$D10)-timevalue(min(filter(Sheet1!$D:$D,Sheet1!$A:$A=A10,Sheet1!$E:$E=E10))))
    ,
    timevalue(Sheet1!$D10)-timevalue(min(filter(Sheet1!$D:$D,Sheet1!$A:$A=A10,Sheet1!$E:$E=E10))))
)


我正在尝试使它看起来更短,更易于管理,例如:

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


评论

@ pnuts,Hmm,变量是公式的组成部分。将单元作为临时变量进行黑客攻击感觉像是一个肮脏的解决方案,因为单元是用于存储业务数据而不是ram。

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

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

#1 楼

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

评论


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

–起搏器
2015年11月12日,0:47

#2 楼

简短答案
目前,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 Apps脚本中的自定义函数)
Google JavaScript样式指南


评论


是否可以使用Google表格的功能(而不是JS的)来定义自定义功能?我没有在这个方向找到任何东西,所以我对此表示怀疑。

–相信
16年1月22日,下午3:15

@anderstood:目前无法实现。见stackoverflow.com/questions/3686061/…

–鲁本♦
16年1月22日在9:38

#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不能正确地将包装的变量存储到变量中[]

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

var variables = ["test"];

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


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


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

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

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