以下のような処理を実現したくて書きました。
それぞれの列で重複する値をユニークにして
以下のようなオブジェクトにしたい。
{東京=[新宿, 渋谷, 品川], 神奈川=[横浜, 川崎]}
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を実行すると以下のようなログが出力されます。