3

我正在使用 Google 电子表格进行税务管理。我一年内完成的所有财务交易都在电子表格中。由于我所在国家/地区的税收规则非常复杂,因此我开发了许多 JavaScript 函数来帮助我进行计算。我的电子表格中有很多行,大约 1000 行。每一行都有对这些 JavaScript 函数的多个引用。

该系统以前运行良好,但今天我发现 Google 在 Google 电子表格中安装了某种运行时限制系统,导致我的许多列中止并出现以下错误:

Service invoked too many times in a short time: exec maxSimultaneous.
Try Utilities.sleep(1000) between calls.

经过一番调查,似乎这个时间限制是为了防止脚本运行时间过长。我的情况不同:我的脚本都很短,O(1) 算法除了计算一些数字什么都不做。一个典型的脚本如下所示:

// Calculates the total amount excluding Value Added Tax, given
// an amount including Value Added Tax, and other sorts of information.
function ex_btw(inc_btw, commentaar, soort, btw_verlegd, btw_pct) {
  Utilities.sleep(1000);
  var soort = soort.toLowerCase();
  if (soort == 'eten en drinken'
   || commentaar.match(/treinkaartje/i)
   || commentaar.match(/treinticket/i)
   || commentaar.match(/taxi/i)
   || commentaar.match(/ boek /i))
  {
    return inc_btw / 1.06;
  } else if (soort == 'priveonttrekking'
   || soort == 'boete'
   || soort == 'belasting'
   || commentaar.match(/postzegel/i)
   || btw_verlegd == 'Ja')
  {
    return inc_btw;
  } else {
    return inc_btw / (1 + btw_pct);
  }
}

然后从单元格中调用该脚本,如下所示:

=IF(B6<>""; ex_btw(B6;D6;E6;J6;S6); "")

也许我的问题是我有太多的脚本调用。每一行调用大约 6 个这样的脚本,因此对于 1000 行,每个电子表格我调用 6000 次。

我该如何解决这个问题?有没有办法增加执行限制,或者有没有办法让脚本运行得更慢,这样它们就不会达到执行限制?正如您在示例代码中看到的那样,我已经尝试过 inserting Utilities.sleep(1000),但这似乎并不能解决问题。我不在乎脚本是否运行缓慢,我只在乎它们完成时没有错误。

我可以付款以提高限额吗?几天后我需要交税。

我考虑过的其他替代方案,但这是不可行的。

  • 使用非 JavaScript 函数。不可行,因为:他们不支持像 Google 电子表格那样的协作。我经常和同事一起检查电子表格,检查我们是否犯了任何错误。这有助于我们双方立即看到对方所做的任何更改。
  • 拥有一个可遍历行并填充单元格的庞大 JavaScript 函数。不可行,因为:

    1. 太容易出错了,和我现在的方法相比很容易出错。
    2. 在我重新运行脚本之前不会自动更新单元格。我想在更新其他单元格后立即查看任何计算,就像电子表格应该做的那样。
  • 使用 Excel 和 OpenOffice Calc 等其他电子表格。不可行,因为:它们似乎没有提供相同的脚本功能。
  • 编写我自己的融资应用程序。不可行,因为:需要太多,这不是我的核心业务,而且税收规则几乎每年都在变化,所以我必须不断更新应用程序。我可以非常快速地更新电子表格,但编写融资应用程序需要太多时间。
4

2 回答 2

8

我通过让每个函数随机休眠来解决它,如下所示:

Utilities.sleep(Math.random() * 5000);

重要的是睡眠时间是随机的,而不是恒定的。显然,谷歌限制了可能同时使用 CPU 的函数的最大数量。

于 2013-01-30T17:08:48.997 回答
1

自定义函数的替代方法可能是使用 onEdit 函数触发器,然后仅处理输入的数据或整列数字,并将函数的结果作为数字放在目标单元格中​​。

可能会更快

于 2013-01-30T18:13:24.340 回答