読者です 読者をやめる 読者になる 読者になる

JavaScript で配列の要素から重複したものを除外する

最近めっきりご無沙汰していたな。
GoogleDocument Spreadsheet では JavaScript で自作した関数をシートで使えるので、組み込み関数だけではどうやったらいいのかわからないという場合でも JavaScript 頑張れば何とかなる。

/*
売上計上月, 申込受注日, 実施日, 申込者, 商品, 税別単価, 枠数, 税別売上
という構成のシートを想定
*/

// 指定月の申込者の配列を重複を除外して返す
// filter を使う -> a.filter(function (x, i, self) { return self.indexOf(x) === i;});
function getClientList(data, month) {
  var wholeList = [];
  var clientList = [];

  for (var i = 0; i < data.length; i++) {
    if (data[i][0] === month) {
      wholeList.push(data[i][3]);
      clientList = wholeList.filter(
        function (x, i, self) {
          return self.indexOf(x) === i;
        });
    }
  }
  return clientList;
}

// 税別売上がネットでプラスか判定する
function getSalesSum(data, month, name) {
  var clientRowIndexes = [];

  for (var i = 0; i < data.length; i++) {
    if (data[i][0] === month && data[i][3] === name) {
      clientRowIndexes.push(i);
    }
  }
  
  var sum = 0;
  for (var i = 0; i < clientRowIndexes.length; i++) {
    sum += data[clientRowIndexes[i]][7];
  }
  
  if (sum > 0) {
    return true;
  } else {
    return false;
  }
}

// その月の税別売上がプラスの人の配列を返す
function getNetClient(month){
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();

  var clientList = getClientList(data, month);
  var result = [];
  for (var i = 0; i < clientList.length; i++) {
    if (getSalesSum(data, month, clientList[i])) {
      result.push(clientList[i]);
    }
  }
  return result;
}

これ、関数をネストさせれば data はそれぞれの関数で引数に取らなくても大丈夫ということを理解したので、実際はそのように書き換えている。古いコードをどこかに残しておこうと思ってはてなダイアリーに貼り付けた次第。

参照したページ

ちなみに、重複を除外するところは最初、filter を使うのがわからなくて、以下のように書いていた。

// 重複をチェックする
function isExists(array, value) {
  for (var i = 0; i < array.length; i++) {
    if (value === array[i]) {
      return true;
    }
  }
  return false;
}

// 重複を排除しながら push する
function pushArray(array, value) {
  if (! isExists(array, value)) {
    array.push(value);
  }
  return true;
}

// その月の申込者の配列を返す
function getClientList(month) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var clientList = [];
  for (var i = 0; i < data.length; i++) {
    if (data[i][0] === month) {
      //clientList.push(data[i][3]);
      pushArray(clientList, data[i][3]);
    }
  }
  return clientList;
}

というか、以下のエントリそのままかも。