0

私のシナリオは次のとおりです。範囲から最も低い3つの要素を削除し、Googleスプレッドシートで処理するために変更された範囲を返す関数を作成します。私はGoogleAppスクリプトをまったく使用したことがないので、非常に悪いコードは次のとおりです。

function removeWorse(range, n) {

  var data = [];

  for(var i = 1; i <= range.getNumColumns(); i++) {
    data.push(range.getCell(1, i).getValue());
  }
  data.sort();

  var range2;
  range.copyTo(range2);

  for(var i = data.length - 1; i >=n; i--) {
    range2.getCell(1, i).setValue(data[i]);
    Logger.log(2);
  }

  return range2;

}

11行目でスタックします:copyTo存在しません。

このコードを変更して実際にタスクを実行するにはどうすればよいですか?:)

4

2 に答える 2

3

範囲を値の配列として関数に渡し(スプレッドシートのセルに入力するなど=removeWorse(A1:K1;3))、Javascriptでその範囲を変更してから、変更した範囲を返すことをお勧めします。これにより、カスタム関数で使用するときに問題となるgetまたはset呼び出しを回避できます。水平範囲で作業しているように見えるので、次のように機能するはずです。

function removeWorse(values, n) {
  values[0].sort();
  values[0].splice(0, n);
  return values[0].reverse();
}

ただしsort()、引数なしで使用すると、字句ソートが返されることに注意してください(たとえば、9は81よりも「大きい」と見なされます)。sort()これに対処するための引数として単純な関数を使用できます。

function removeWorse(values, n) {
  values[0].sort(function(a, b) {return a - b});
  values[0].splice(0, n);
  return values[0].reverse();
}
于 2012-11-29T22:29:03.977 に答える
0

コードの問題は、range.copyTo関数がパラメーターとして別の範囲を予期していることです。上記で定義したrange2場合、それはRangeオブジェクトではありません。

于 2012-11-29T20:16:25.707 に答える