最近めっきりご無沙汰していたな。
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 はそれぞれの関数で引数に取らなくても大丈夫ということを理解したので、実際はそのように書き換えている。古いコードをどこかに残しておこうと思ってはてなダイアリーに貼り付けた次第。
参照したページ
- JavaScript - 配列の重複をはじく、もしくは重複を取り出す - Qiita
- 関数と関数スコープ - JavaScript | MDN
- JavaScript のスコープを理解する - tacamy.blog
- JavaScriptの引数でデフォルト値を設定する - Qiita
ちなみに、重複を除外するところは最初、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; }
というか、以下のエントリそのままかも。