1

行3〜15の複数の列にデータがあります。そのデータセット内のすべての一意の値を見つけて、1つの列に出力したいと思います。

ユニークな関数は一度に1つの列しか実行しないため、私の目的には機能しません。

新しいシートを開き、値をコピーして同じ列に貼り付けるスクリプトを作成しています(複数の列のデータを1つの長い列に結合します)。次に、すべてのデータを含む単一の列で一意の関数を実行して、元のデータセットのすべての一意の値の出力を取得します(Items!B3:Z15)

コードを記述しましたが、文字をインクリメントする方法がわかりません。これを達成するためのより良い方法があれば、私は提案を受け入れますが、文字を増やすことが可能かどうかも興味があります。

助けてくれてありがとう、これが私の現在のコードです:

function uniqueIngredients() {

  var book = SpreadsheetApp.getActiveSpreadsheet();
  var r=1;  // starting with row 1 new sheet
  var d='B';
  for (i=1; i<4; i++){  //testing by running 3 iterations
    var m = 'Ingredients!A'+r;  //Intially return Ingredients!A1 then incremented by 11 ex A12
    var c = 'Items!'+d+'4:'+d+'15';  // Initially return Items!B3:B15 then incremented by letter ex Items!C3:C15
    r = r+12;  // add 12 spaces before next copy (max number of ingredients for each item)
    d++;
    book.getRange(c).copyTo(book.getRange(m), {contentsOnly:true});
  }
};
4

1 に答える 1

6

getRange()メソッドの代替パラメーター指定を使用できます。これは、A1文字列表記ではなく列番号を使用します。これはインクリメントするのが簡単です。

そうは言っても、値のみをコピーしているので、ブロック内のソース範囲を取得し、Javascriptを使用して1列の配列に変換してから、値を設定する方がおそらく(より効率的に)なります。

function uniqueIngredients() {
  var ss = SpreadsheetApp.getActive();
  var sourceValues = ss.getSheetByName('Items').getRange('A3:D15').getValues();
  var target = ss.getSheetByName('Ingredients');
  var result = [];
  for (var i = 0; i < sourceValues[0].length; i++) {
    for (var j = 0; j < sourceValues.length; j++) {
      result.push([sourceValues[j][i]]);
    }
  }
  target.getRange(1, 1, result.length, 1).setValues(result); 
}

そうは言っも、スプレッドシート関数のみを使用して最終結果を提供するために、少し回避策を使用することができます。

=ArrayFormula(UNIQUE(TRANSPOSE(SPLIT(CONCATENATE('Items'!A3:D15&CHAR(9));CHAR(9)))))
于 2012-09-18T23:03:29.987 に答える