我最近看到了一篇关于这个错误的帖子,因为无法重现该错误,所以帖子被关闭了。我昨晚也遇到了同样的错误,而且很容易重现。我不确定这两者之间有什么联系,但以下是我遇到的情况。
我试图确定可到达的最远行。例如,即使你的工作表只有默认的 1000 行,你也可以写入=ROW(OFFSET(A1,9999,))
reach A10000
。它会返回 10000。经过反复试验,我发现可以使用嵌套的 来获取最远行OFFSET
。
=row(offset(offset(offset($A$1,B1,),C1,),D1,))
最后可到达的行是第 行2,147,483,647
。如果我尝试转到2,147,483,649
或更远,就会出现OFFSET 计算结果为超出范围的错误。但就在那之前,我发现了一个虫洞。没错,我尝试2,147,483,648
使用到达第 行=row(offset(offset(offset($A$1,700000000,),700000000,),747483647,))
,结果返回的是-2,147,483,648
。您可以在下面看到结果(E 列包含用于启用或禁用公式的复选框)。
B | 碳 | D | 埃 | F | 格 |
---|---|---|---|---|---|
7亿 | 7亿 | 747483646 | 真的 | 2147483647 | =if(E1,行(偏移量(偏移量(偏移量($A$1,B1,),C1,),D1,)),) |
7亿 | 7亿 | 747483647 | 真的 | -2147483648 | =if(E2,行(偏移量(偏移量(偏移量($A$1,B2,),C2,),D2,)),) |
7亿 | 7亿 | 747483648 | 真的 | #参考! | =if(E3,行(偏移量(偏移量(偏移量($A$1,B3,),C3,),D3,)),) |
它就像虫洞一样,通向纸张宇宙的另一边。我可以在那一行左右移动,甚至可以回到这一边,但我无法在那一边上下移动任何行。确实很奇怪,但没什么危害,我打算报告。
然而,后来当我尝试打开我的个人插件时,出现了以下运行时错误。异常:访问 ID 为 #### 的文档时,服务电子表格失败。[行:77,函数:myGlobalConfig,文件:core/lib/Config。
在费尽心思寻找问题根源之后,我突然冒出个念头,想看看虫洞是不是问题根源。结果也确实如此。我激活那个特定公式时收到了错误提示。禁用那个公式后,问题就消失了。
我甚至在绑定脚本中创建了一个基本函数,用于检索工作表的名称并使用 Toast 显示它。当激活中间那个公式时,出现了相同的错误,得出了负行的值。关闭后,错误就消失了。
这与之前提到的另一篇文章有联系吗?有人知道为什么这一行是负数吗?
2,147,483,647 等于 2^(31 - 1)。你的数字用 32 位表示,例如
并且您可以用您喜欢的数基(可能是十进制)以数字形式表示它们,如下所示:
这个数字可以用无符号或有符号的方式表示。当我们将其视为无符号数时,B31被视为该数字的二进制部分,实际上是 2^31。在这种情况下,您可以表示 [0, 2^32) = [0, 4294967296) = [0, 4294967295] 之间的整数。
但是,如果数字表示为有符号数,则数字的第一位就是所谓的符号位,因此 B31 不代表数字的绝对值,而是表示其符号,0 表示正数,1 表示负数。这样,就可以表示 [-2147483648, 2147483647] 之间的整数。
由于 2147483647 是最后一个要表示的数字,因此作为二进制数它看起来像这样:
现在,如果你给它添加一个数字,那么你就会得到
其符号位为 1,因此它是一个负数,等于 -2^(-31) = -2147483648。
因此,如果你在有限位上将最大正数加一,那么你增加的是一个以 0(符号位)开头、后面全为 1 表示的数,这会溢出为一个以 1(符号位)开头、后面全为 0 表示的负数。这就是你的工作表中发生的情况。
从问题
公式如果抛出行数,或者试图达到大于 10,000,000 的行数,那么在实际应用中是没有意义的,因为 Google Sheets 电子表格中所有工作表的最大单元格数就是这个数字。参考: https://support.google.com/drive/answer/37603 ?hl= en 。
在调试 Google Sheets / Apps 脚本时,您最终可能会发现某些情况下的错误消息无法提供任何有用的故障排除信息。因此,创建一个最小完整示例 (MCE) 非常有助于查找公式/脚本是否存在问题,或者问题是否出在 Google 方面。
关于 MCE 的创建,可能发现的问题之一是,它超出了一个众所周知的限制,但 Google 端的故障也可能是导致问题的原因。经验发现的问题之一是,繁忙的电子表格可能会由于版本历史记录功能的“限制”而失败。
尝试自行寻找云平台限制时要小心,因为这可能会引发可能阻止您的帐户甚至网络的标志。
在这种特定情况下,您可能希望从 Google Sheets 帮助菜单向 Google 提交有关您的公式的反馈。
在我看来,OFFSET 不允许数字大于 10,000,000,原因如上所述。
至于这是否与另一篇帖子“异常:访问电子表格时服务电子表格失败”相关,由于该帖子的原帖作者没有提供足够的详细信息,我们唯一可以确定的是,错误消息是相似的。另一个问题不太可能与使用嵌套 OFFSET 尝试访问无法获取的行有关,或者与获取超出最后一个数字的数字以二进制数表示有关(如上一个答案所述) 。