LANG SELRCT

Google Apps Scriptのコードを書く場所  (新規作成: スプレッドシート | スクリプトエディタ

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

2021年4月25日日曜日

テキストの改行を削除したい


改行を含むテキストから改行を削除したくて書いたコードです。

ここでは

text.replace(/\n/g, "")

で改行を削除しています。


デモアプリ
上のテキストエリアにテキストを貼り付けると
改行が削除されたテキストが下に出力されます。






コード.gs
function doGet() {
  return HtmlService.createHtmlOutputFromFile("index");
}
意訳
この機能がやること
指定したHTMLファイルを表示する




index.html
<!DOCTYPE html>
<html>
<body>
  <textarea id="ta" style="width:30vw; height:30vh"></textarea>
  <br>
  <textarea id="result_ta" style="width:30vw; height:30vh"></textarea>

<script>
document.getElementById("ta").onkeyup = taKeyup;

function taKeyup() {
  var text = document.getElementById("ta").value;
  var result = text.replace(/\n/g, "");
  document.getElementById("result_ta").value = result;
}

</script>
</body>
</html>





最新の投稿

GASでWebアプリを作ってローカルファイルをGoogleドライブにアップしたい(アプリを開くユーザーとファイルをアップロードするユーザーを分けたい)

Google Driveに複数ファイルをアップロードしたい(submitボタン使わない) の応用です。 GASでWebアプリを作ってローカルファイルをGoogleドライブにアップしたい 以下の条件を満たすもの 条件 アップロード先はGoogleドライブの共有フォルダ そのフォルダ...