作为一名程序员,在尝试使用Google Spreadsheets时,我感到有些沮丧,因为似乎没有明确的描述可用于公式化的语法。例如,我读过我可以使用F3:F从第3行开始向下引用F列,但是我在Google参考文档中找不到它提到的地方,而且它似乎并不总是有效。我可能做错了,但这就是这个问题的重点。

我不想遍历五种不同的教程来尝试猜测规则!是否有语法和语义的简明描述?如果没有,也许有人可以在这里进行总结。

评论

docs.google.com/support/bin/…不知道这是否有任何帮助(这就是为什么在评论中加注:))
谢谢,这是图片的有用部分,但是为什么他们不能记录整个内容呢?!

没问题,不知道为什么不这样做,但是它与excel非常相似,并且语法上仅有一些更改。如果您遇到困难,可以随时在这里询问:)

#1 楼

这是从这里摘录的一些文字。我已经把它贴在这里了。如果知道这一点与Google Spreadsheets中的公式有何不同的任何人都可以发表评论,那么也许我们可以得到一个很好的答案。

Formulas

Formulas让您可以在表格单元格中执行计算。每个公式可以以命名空间前缀开头,该前缀指定公式中使用的语法和语义。如果没有前缀,则使用如下所述的默认公式语法和语义。其后是一个等号,然后是公式本身。实现可以接受多种公式语法,并且可以接受对默认公式语法的各种扩展。但是,所有接受公式的实现都必须接受此处所述的默认公式语法和语义。他们也可以接受它的扩展。

实现严格模式的文档不能使用公式名称空间前缀(因为不能保证其他接收系统也可以处理它),并且不能使用以下描述的语义和语法的任何扩展。:
在默认公式语法中,在初始等号之后,公式必须是表达式。表达式可以是数字,常量字符串,命名范围,由二进制运算符连接的一对表达式,以一元运算符为前缀的表达式,逻辑运算符,函数调用,单元格地址或由括弧。函数调用和逻辑运算符可能具有零个或多个以分号分隔的参数,并且每个参数必须为表达式。这些语法的语法如下:


数字。使用“ C”语言环境(使用“。”十进制分隔符且不使用千位分隔符),setlocale(LC_NUMERIC,“ C”)或等效方法以这种格式写入和读取数字。数字可以以%结尾,该数字将该数字除以100。“%”不会更改其他运算符的含义,因此2 + 10%为2.1(不是2.2)。请注意,前导-和+号允许作为一元运算符,如下所述。写者必须写出与模式匹配的数字(注意,它必须以数字开头):[0-9] +(。[0-9] +)?([eE] [+-]?[0-9] + )?%?读者必须能够阅读这些数字,并且必须接受以“。”开头的数字,因此他们必须能够阅读以下形式的数字:((。[0-9] +)|([0- 9] +(。[0-9] +)?([eE] [+-]?[0-9] +)?))%%常量字符串。常量字符串被双引号引起;要嵌入双引号,则两次使用双引号字符。字符串以UTF-8格式存储。请注意,由于所有内容都存储为XML,因此公式中的所有双引号实际上都存储为XML中的“。常量字符串匹配以下模式:\“([^”] | \“ \” \“)* \”
命名范围/字段。命名范围/字段是指单独的定义值或值集(在电子表格中,通常是指单元格地址或地址集)。名称不区分大小写,因此“ a”和“ A”指的是同一范围。实现必须至少接受与以下模式匹配的命名范围:[A-Za-z] [A-Za-z0-9 _] *
运算符。接受普通的infix和prefix运算符。这些具有以下关联性和优先级(从最低优先级到最高优先级):

Associativity Operator(s)        Comments
left          <,=,>,<=,>=,<>     Less than, equal to, greater than,
                                     less than or equal to, greater than or equal to,
                                     not equal to.
left          +,-,&                  Add, subtract, string concatenation. Note that
                                     unary (prefix) + and – has a different priority.
left          *,/                    Multiply, divide. Division does not truncate, so
                                     1 / 2 is equal to 0.5.
right         ^                      Power (2^3 is 8).  Readers SHOULD also accept “**”.
none          +,-                    Prefix unary operators, e.g., -5 or -[.A1].
                                     Note that these have a difference precedence than
                                     add and subtract.


可以使用括号覆盖优先级,因此“ = 2 + 3 * 4”计算为14,而“ =(2 + 3)* 4”计算为20。请注意,+,-,*,/,^可转换任何字符串或二进制值他们在计算之前使用数字;请注意&(字符串串联)在将它们连接之前将任何值转换为字符串。逻辑运算符。逻辑运算符的语法与函数调用相同;它们的名称不区分大小写,参数之间用分号分隔,并且名称后必须带有括号。逻辑运算符为:

Operator           Parameter count           Comment
TRUE()             0                         This is a boolean constant, though its syntax makes it appear like a function
FALSE()            0                         This is a boolean constant
NOT(expression)    1                         If expression is TRUE() returns FALSE(), else returns TRUE()
AND(e1; e2 [; e]*) 2 or more                 If all expressions are TRUE() returns TRUE(), else returns FALSE()
OR(e1; e2 [; e]*)  2 or more                 If all expressions are FALSE() returns FALSE(), else returns TRUE()
IF(condition; true_exp; false_exp)
                   3                         Evaluates condition. If it's true, return true_exp, else return false_exp


AND(),OR()和IF()的实现必须短路,也就是说,它们必须从左到右求值。 -依次,并且仅求值它们必须求值才能计算出结果的表达式。一个实现可以选择评估更多,但前提是这些表达式没有副作用。 AND()和OR()的实现应接受任意数量的参数,但每次使用都必须至少接受30个参数。操作NOT(),AND()和OR()以及IF()中的条件适用于布尔值;如果使用其他类型的表达式,则实现不应将0视为false并将任何其他数值视为true,并且不应将零长度字符串视为false并将任何其他字符串值视为true。如果为表达式计算了错误值,则该第一个错误是逻辑运算的结果。

函数调用。函数调用的函数名称与模式[A-za-z] [A-Za-z0-9 _] *相匹配,后接左括号,零个或多个参数和右括号。参数用分号(而不是逗号)分隔,尽管读者也可以选择使用逗号作为分隔符来接受函数调用。函数名称不区分大小写,因此“ sum”和“ SUM”是同一函数。如果有参数,则每个参数都必须是一个表达式,并且任何一个都不能为空,因此X(;)不是合法的函数调用,而RAND()是完全合法的。如果参数是可选的,则可以省略,但如果省略,则也必须省略其分隔符(功能说明应说明哪些参数是可选的,省略它们的含义)。典型的实现将具有许多内置函数,并且大多数实现还支持一种或多种创建用户定义函数的方式。常见功能包括:


SUM(list)-汇总list范围内的所有数字。
COUNT(list)-计算其中的数字数量列表的范围

AVERAGE(列表)-计算平均值,等于SUM(列表)/ COUNT(列表)

MAX(列表)-列表最大值(n)–将n舍入到最接近的整数。
ISEVEN(n)–如果n为偶数,则返回TRUE(),否则返回FALSE()。
SUBSTITUTE(text; searchtext; newtext;用文本替换搜索文本中的newtext(出现次数(如果始终省略出现,则始终))。

包含数字的单元格地址。地址可以是相对的或绝对的。相对地址由列字母和行号组成。用$前缀行字母或列号可使行或列成为绝对。

在默认公式语法中,空格(空格,制表符,换行符和回车符)将被忽略,除了字符串常量的内容以及在单元格范围地址列表中多个单元格范围地址的分隔符。

实现的用户界面可以选择接受和显示公式,与以这种数据格式交换公式的方式不同。例如,他们可以使用当前语言环境的格式接受和显示数字,他们可以始终将特定的语言环境用于数字格式,他们可以使用逗号而不是分号作为参数分隔符,并且他们可以接受并显示单元格地址而无需使用方括号。但是实现的用户界面应尽可能接受默认格式作为输入,例如,实现的界面应接受符合“ C”语言环境要求(以及当前语言环境)的数字,并且应接受带括号的单元格地址。另外,实现的用户界面应该纠正可能的错误,可能需要进行对话。例如,如果某个实现通常将参数分隔符显示为分号,则该实现应尝试检测用户是否使用逗号作为函数参数分隔符而非分号,并进行更正。

以下是一个简单公式的示例:

=sum(A1:A5)

此公式计算范围为“ .A1:.A5”的所有单元格的值之和。该功能为“求和”。参数以“(”开头和结尾处“”)标记。如果一个函数包含多个参数,则参数之间用“;”分隔。
以下是上面显示的公式的变体:

=sum(A1;A2;A3;A4;A5)

该公式的结果相同。公式中使用的组件取决于您使用的应用程序。

评论


好答案,@ rog。您是否知道Google函数文档为何使用逗号而不是分号来分隔参数?它们在我的任何测试中均不起作用。

–Jpsy
16 Mar 3 '16 at 16:09

@Jpsy:参数分隔符取决于电子表格设置。当逗号是小数点分隔符时,使用分号。

–鲁本♦
17年6月16日在11:18

在Google表格中使用数组

–鲁本♦
17年6月16日在12:05

“ AND(),OR()和IF()的实现必须短路” ---不幸的是,在撰写本文时,我没有在Google Spreadsheets中看到它。我尝试了“ AND(FALSE,类型不匹配的表达式)”,而不是忽略第二部分,结果是来自第二个操作数的错误。幸运的是,有一个关于stackoverflow的解决方法:stackoverflow.com/a/16926642/2184166

–ob-ivan
18/09/11在20:02

#2 楼

经过一番搜索后,我发现


Google电子表格公式遵循Microsoft Excel等实现了事实上的标准。
该标准似乎从未正确定义。 。

我发现最接近的全面定义是在此旧邮件列表帖子中:http://lists.oasis-open.org/archives/office-comment/200411/msg00000.html,包含yacc语法,词法标记器和语义的简短描述。 >
这似乎令人遗憾。此信息的任何进展将不胜感激。

评论


自从上述职位以来,取得了很大进展。关于OpenDocument,请参阅oasis-open.org/committees/tc_home.php?wg_abbrev=office上的说明。

–鲁本♦
17年6月16日在11:19

#3 楼

https://repository.tudelft.nl/islandora/object/uuid:d9d802af-9ebf-4524-9dbc-e7657d67921e/datastream/OBJ/download

David Hoepelman的硕士论文“工具辅助的电子表格重构和解析电子表格公式”(Delft工业大学)是迄今为止我对电子表格公式语法的最佳描述。 BNF,经验验证和所有修饰。
还足够简单,可以成为手工编码项目的良好指南。 XLParser是本文引用的同伴
GitHub开源项目。

好吧,这不是Excel表格,而是表格公式与Excel兼容,这是一个很好的起点。