以下のような処理を実現したくて書きました。
それぞれの列で重複する値をユニークにして
以下のようなオブジェクトにしたい。
{東京=[新宿, 渋谷, 品川], 神奈川=[横浜, 川崎]}
A列はオブジェクトのkey。
B列は配列で持つ。
コード.gs
function myFunction() {
var categoriesObj = createCategoriesObj();
Logger.log(categoriesObj);
}
/************************************
オブジェクトを作成する
************************************/
function createCategoriesObj() {
var sheet = SpreadsheetApp.getActiveSheet();
var lastRow = sheet.getLastRow();
var categories = sheet.getRange(1, 1, lastRow, 1).getValues();
var subCategories = sheet.getRange(1, 2, lastRow, 1).getValues();
// ヘッダ行の要素は取り除いておく
categories.shift();
subCategories.shift();
// ここからオブジェクトを作っていく
var obj = {};
var array = [];
for(var i = 0; i < categories.length; i++) {
var category = categories[i][0];
var categoryPrev = categories[i-1];
if(obj[category] !== obj[categoryPrev]) {//categoryの値が変わった時に配列を初期化したい
array = [];// 初期化しないと要素が追加され続ける
}
array.push(subCategories[i][0]);
obj[category] = array.filter(returnUnique);// subCategoriesの値が重複してもここでuniqueにする
}
return obj;
}
/************************************
一次元配列の要素の値をユニークにする
************************************/
function returnUnique(value_i, index, array){
var value_i_index = array.indexOf(value_i);// 配列の何番目に要素があるかを先頭の要素から一つずつ確認して
var result = value_i_index === index;// 配列の要素のindexと同じなら
return result;// その値を返して配列に追加する(違うなら追加しない→2つ目以降は存在してもindexが異なるため追加されない)
}
|
myFunctionを実行すると以下のようなログが出力されます。
