3

税務管理にGoogleスプレッドシートを使用しています。私が1年間に行ったすべての金融取引は、スプレッドシートにあります。私の国の税法は非常に複雑なので、計算に役立つ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回呼び出します。

この問題を解決するにはどうすればよいですか?実行制限を増やす方法はありますか、それとも実行制限に達しないようにスクリプトの実行を遅くする方法はありますか?サンプルコードでわかるように、私はすでに挿入を試みましUtilities.sleep(1000)たが、それは問題を解決していないようです。スクリプトの実行速度が遅いかどうかは関係ありません。エラーなしで終了することだけを気にします。

限度額を引き上げるために支払うことはできますか?数日で税金を渡す必要があります。

私が検討した他の代替案ですが、それは実現可能ではありません。

  • JavaScript以外の関数を使用する。実現不可能な理由:GoogleSpreadsheetのようにコラボレーションをサポートしていません。私は定期的に同僚とスプレッドシートを調べて、間違いがないかどうかを確認します。これは、お互いが行った変更をすぐに確認できるようにするのに役立ちます。
  • 行を繰り返し処理してセルにデータを入力する巨大なJavaScript関数を1つ用意します。次の理由で実行できません:

    1. エラーが発生しやすいので、現在の方法に比べて間違いを犯しやすいです。
    2. スクリプトを再実行するまで、セルは自動的に更新されません。スプレッドシートと同じように、他のセルを更新した直後に計算を確認したいと思います。
  • ExcelやOpenOfficeCalcなどの他のスプレッドシートを使用する。次の理由で実行可能ではありません:同じスクリプト機能を提供していないようです。
  • 私自身の資金調達アプリを書く。実行不可能な理由:時間がかかりすぎる、それは私のコアビジネスではなく、税法はほぼ毎年変更されるため、アプリを常に更新する必要があります。スプレッドシートは非常にすばやく更新できますが、財務アプリの作成には時間がかかりすぎます。
4

2 に答える 2

8

次のように、すべての関数をランダムな期間スリープさせることで解決しました。

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

睡眠時間が一定ではなくランダムであることが重要です。どうやら Google は、同時に CPU を使用できる機能の最大数を制限しています。

于 2013-01-30T17:08:48.997 に答える
1

カスタム関数の代わりに、onEdit関数トリガーを使用して、入力されたデータのみまたは数値の列全体を処理し、関数の結果を数値としてターゲットセルに配置することもできます。

速いかもしれません

于 2013-01-30T18:13:24.340 に答える