LANG SELRCT

コードを書く場所についてはこちら

2018年8月25日土曜日

スプレッドシートで特定の列の値を任意の個数で区切りたい


A列に10個のデータがあって


3つずつに区切ってこのようにしたい



コード.gs
function run(){
  var count = 3;
  split_str_by_count(count);
}

function split_str_by_count(count) {
  var sh = SpreadsheetApp.getActiveSheet();
  var range = sh.getDataRange();
  var values = range.getValues();
  var array = array_push_apply(values);
  var result = [];
  for(var i = 0; i < (values.length/count)-1; i++){
    var spliced = array.splice(0, count);
    result.push(spliced);
  }
  set_values(result);
  set_last_values(array, count);//set_values([result]);でも同じ
}

function array_push_apply(values){
  for(var i = 1; i < values.length; i++){
    Array.prototype.push.apply(values[0], values[i]);
  }
  return values[0];
}

function set_values(array){
  var sh = SpreadsheetApp.getActiveSheet();
  var last_row = sh.getLastRow();
  var start_row = last_row + 1;
  var start_col = 1;
  var num_rows = array.length;
  var num_cols = array[0].length;
  var range = sh.getRange(start_row, start_col, num_rows, num_cols);
  range.setValues(array); 
}

function set_last_values(array, count){
    var blanks = count - array.length;
    for(var j = 0; j < blanks; j++){
      array.push("");
    }
    set_values([array]);
}
意訳
この機能がやること
長さを決めて
split_str_by_countに渡す


この機能がやること
アクティブシートを取得して
データが入っている範囲を取得して
その範囲内の値たちを取得すると二次元配列なので
array_push_applyに渡して一次元配列にして
result配列を用意して
countの数で割り切れた分だけ以下を繰り返す
一次元配列からcountの分だけ取り出して
result配列に追加して

追加し終わったresult配列をset_valuesに渡してシートに入力する
countの数で割り切れなかった残りをset_last_valuesに渡して入力する


この機能がやること
受け取ったvaluesの数だけ以下を繰り返す
valuesの先頭の要素に後ろの要素を追加していく

追加し終わったら返す


この機能がやること
アクティブシートを取得して
受け取ったshの最後でデータが入っている最後の行を取得して
その次の行をstartにして
1列目をstartにして
arrayの要素数を取得して
array[0]内の要素数を取得して
入力する範囲を指定して
入力する


この機能がやること
受け取ったcount - arrayの長さ で空白にする要素数を取得して
その数だけ以下を繰り返す
arrayに空白を追加して

set_valuesに2次元配列にして渡して入力する



実行結果

実行したいシートで run() の countを決めて
run() を実行すると


例でみた10個のデータをこのように区切ることができる

区切った値を書き出す場所は
例では同じシートの最終行の下にしていますが
set_values(array) の中で任意の場所を指定できます