Apps Script公式リファレンス: Apps Script Reference |障害・課題追跡: IssueTracker |Google Workspace: Status Dashboard - Summary

2021年4月30日金曜日

[Spreadsheet] 列ごとに値をユニークにしてオブジェクト化したい(2列目は配列で持つ)


以下のような処理を実現したくて書きました。


スプレッドシートのA、B列に以下のようなデータがある時
prefecturecity
東京新宿
東京新宿
東京渋谷
東京渋谷
東京品川
東京品川
東京品川
東京品川
神奈川横浜
神奈川横浜
神奈川横浜
神奈川横浜
神奈川川崎
神奈川川崎


それぞれの列で重複する値をユニークにして
以下のようなオブジェクトにしたい。

 {東京=[新宿, 渋谷, 品川], 神奈川=[横浜, 川崎]}

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を実行すると以下のようなログが出力されます。

Latest post

Google Apps Scriptの障害時はIssueTrackerを見てみる - Incidents for Apps Script are reported on Issue Tracker

IssueTracker > Apps Script issues https://issuetracker.google.com/savedsearches/566234 Google Apps Scriptの障害時は IssueTracker に課題が上がっていることが...