8

次の形式のスプレッドシートがあります。

 A   B   C  D
abc abc abc 1
def ghi jkl 1
mno pqr stu 3
vwx yza bcd 4
mno pqr stu 5
mno pqr stu 5
vwx yza bcd 5
mno pqr stu 1

最初の 3 列は文字列型のデータです。列 D には、数値が繰り返される整数があります。私の質問は、次のように 5 番目の列を出力する方法です。

 A   B   C  D E
abc abc abc 1 1
def ghi jkl 1 3
mno pqr stu 3 4
vwx yza bcd 4 5
mno pqr stu 5
mno pqr stu 5
vwx yza bcd 5
mno pqr stu 1

列 D からの一意の番号のみを出力します。

for または while ループで if/else ステートメントを実行して、"D" の各セルをチェックし、以前に "見られなかった" 値を配列に格納することを想像しました。次に、列 E に配列を出力します。

これを行うためのより効率的な方法があるかどうか疑問に思っていました。また、上記はほんの一例です。ほとんどの場合、データ範囲は 400 の範囲です。(行単位。列は、新しい出力列を含めて 4 または 5 のみです。)

前もって感謝します。

PSここでこれを検索しましたが、重複する行の削除に関連する質問しか得られません。すでにこれを尋ねる質問がある場合は、私にリンクしてください。

4

4 に答える 4

2

現在、V8 エンジンでは、これを行う最も簡単な方法はSetを使用することです。

/**
 * @returns {Object[]} Gets unique values in a 2D array
 * @param {Object[][]} array2d
 * @private
 */
const getUnique_ = array2d => [...new Set(array2d.flat())];

/**
 * Gets Values from a column, makes it unique and sets the modified values
 *   to the next column
 * @param {string} sheetName
 * @param {number} column Number of the column to uniquify
 * @param {number} headers Number of headers
 * @returns void
 */
const uniquifyAColumn = (sheetName = 'Sheet1', column = 3, headers = 1) => {
  const sh = SpreadsheetApp.getActive().getSheetByName(sheetName),
    rg = sh.getRange(1 + headers, column, sh.getLastRow() - headers, 1),
    values = rg.getValues(),
    uniqueValues = getUnique_(values).map(e => [e]);
  rg.offset(0, 1, uniqueValues.length).setValues(uniqueValues);
};
于 2020-10-08T17:04:59.620 に答える