14

Google Apps Script を使用して、スプレッドシートのカスタム関数を作成したいと考えています。私は非常に単純な関数を作りました:

function foo(){
    return "bar";
};

問題は、数百のセルでこの関数が必要なことです。関数をこれらすべてのセルに貼り付けると、関数=foo()はいくつかのセルで機能しますが、ほとんどの場合、「サービスが呼び出されすぎています: スプレッドシート。Utilities.sleep(1000)呼び出しの間に試してください。」

[スクリーンショットはこちら]

この単純な関数が、スプレッドシート サービスの呼び出しと見なされる理由が理解できないと思います。私はデータを要求していません(関数自体を除く)。それが問題ですか?もしそうなら、回避策はありますか?カスタム関数は、Google スプレッドシートを無限に強力にすることができますが、この問題は、複数のセルでカスタム関数を使用する可能性を妨げます. 提案?

(PS --Utilities.sleep()エラー メッセージで示唆されているように関数を使用しても、すべてのセルが関数を同時に呼び出す場合はまったく役に立ちません。個々のセルが関数を繰り返し呼び出す速度が遅くなるだけです。)

4

2 に答える 2

27

Apps Script 関数ガイドの最適化セクションによると、次のようになります。

スプレッドシートでカスタム関数が使用されるたびに、Google スプレッドシートは Apps Script サーバーを個別に呼び出します。スプレッドシートに数十 (または数百、数千!) のカスタム関数呼び出しが含まれている場合、このプロセスは非常に遅くなる可能性があります。

したがって、カスタム関数を広い範囲のデータに対して複数回使用する予定がある場合は、2 次元配列の形式で入力として範囲を受け入れ、次のことができる 2 次元配列を返すように関数を変更することを検討してください。適切なセルにオーバーフローします。

これを行うには、返したい配列のサイズを表す入力を渡します。関数の実行を開始するときに、入力パラメーターが の配列であるかどうかを確認しますinput.map。そうであれば、各項目で関数を呼び出して、そのコレクション全体を返すことができます。

したがって、あなたの場合は次のようになります。

function foo(){
    return "bar";
};

次のように関数を更新できます。

function foo(input){
  if (input.map) {         // Test whether input is an array.
    return input.map(foo); // Recurse over array if so.
  } else {
    // do actual function work here
    return "bar";
  }
};

そして、次のように呼び出します。

スクリーンショット

于 2015-04-15T18:29:35.847 に答える
3

スプレッドシートで関数を呼び出すことにより、サーバーに往復して関数の結果を実行するように依頼することで、スプレッドシート サービスを呼び出します。その結果、非常に短期間に数百件のリクエストを作成しました。

回避策の 1 つは、一度にいくつかのセルを関数に追加することです。もちろん、後でシートを再度開くと、同じ問題が発生する可能性があります。

関数が何を達成しようとしているのかによっては、組み込みのスプレッドシート関数を使用する価値があるかもしれません。そこには大きな力があります。単一のセルではなく、値の範囲に作用する関数を作成することは、別のより良いオプションかもしれません。カスタム メニュー項目またはスクリプト マネージャーを使用してトリガーできます。

スプレッドシートでの作業に関しては、バッチ アクションが最良の友であることを覚えておいてください。

于 2012-12-20T14:19:54.050 に答える