9

Google ドキュメント スプレッドシートのスクリプトを作成して、取締役のリストを読み取り、配列にまだ表示されていない場合はそれらを追加します。

ただし、配列内に含まれる要素に対して -1 以外の値を返すように indexOf を取得することはできないようです。

誰が私が間違っているのか教えてもらえますか? または、これを行う簡単な方法を教えてください。

これは私のスクリプトです:

function readRows() {
var column = SpreadsheetApp.getActiveSpreadsheet().getRangeByName("Director");
var values = column.getValues();
var numRows = column.getNumRows();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];

var directors = new Array();

for (var i = 0; i <= numRows - 1; i++) {
    var row = values[i];
    if (directors.indexOf(row) == -1) {
        directors.push(row);
    } else {

        directors.splice(directors.indexOf(row), 1, row);

    }
}

for (var i = 2; i < directors.length; i++) {
    var cell = sheet.getRange("F" + [i]);
    cell.setValue(directors[i]);
}
};
4

6 に答える 6

6

Google Apps Script でgetValues()を使用して値を取得する場合、問題の範囲が 1 列幅であっても、常に 2D Javascript 配列 (行、列でインデックス付け) を処理します。したがって、特定のケースで +RobG の例を拡張すると、values配列は実際には次のようになります。

[['fred'], ['sam'], ['sam'], ['fred']]

したがって、変更する必要があります

var row = values[i];

var row = values[i][0];

余談ですが、スプレッドシートにネイティブなスプレッドシート関数を使用してこれを実現できることに注意してください (スプレッドシートのセルに直接入力します)。

=UNIQUE(Director)

これは、名前が付けられた範囲の内容が変更されると動的に更新されDirectorます。そうは言っても、これに Google Apps Script を使用したかったのには十分な理由があるかもしれません。

于 2013-06-11T21:38:26.263 に答える
2

オブジェクトとして範囲を取るスプレッドシート関数で同様の問題に遭遇しました。私の場合、(別の配列で) 固定された値のセットを簡単に検索したいと考えていました。

問題は、「列」変数に列が含まれていないことです。2D 配列が含まれています。したがって、各値は独自の行 (それ自体が配列) です。

スプレッドシートの既存の関数を使用して次の例を実現できることはわかっていますが、これは 2D 配列を処理して値を検索する適切なデモです。

function flatten(range) {
  var results = [];
  var row, column;

  for(row = 0; row < range.length; row++) {
    for(column = 0; column < range[row].length; column++) {
      results.push(range[row][column]);
    }
  }
  return results;
}

function getIndex(range, value) {
  return flatten(range).indexOf(value);
}

したがって、範囲全体で値の存在を単純に検索したかったので、それを 1 つの配列にフラット化しました。実際に 2D 範囲を扱っている場合、このタイプの平坦化とインデックスの取得はあまり役に立たないかもしれません。私の場合、列を調べて 2 つのセットの交点を見つけました。

于 2013-09-05T08:46:25.453 に答える