LANG SELRCT

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

2016年6月21日火曜日

選択した範囲のデータを一列にして書き出す

前回の 選択した列のデータを配列にして取得する では対象の列に入力されているデータすべてを取得しましたが、今回は指定した範囲内のデータだけを取得するということをやってみます。そしてそれを一列にしてシートに入力するということもやってみました。

事前準備
今回のコードを実行するため、例としてA〜C列にa1からc6までのデータを入力しておきます。



まずは選択した範囲のデータを配列で取得するコードを書きました。

ポイント

選択範囲のデータを取得するコードを書きます。
var value = range.getA1Notation();
var values = sh.getRange(value).getValues();


コード.gs
function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getActiveSheet();
  var range = sh.getActiveRange();
  var value = range.getA1Notation();
  var values = sh.getRange(value).getValues();
  Browser.msgBox("[" + values + "]");
}


コードを実行する

A2からC4を範囲選択して、myFunctionを実行してみると、

選択した範囲のデータが配列で取得できます。



次に、取得した配列を一列にしてシートに入力するということをやってみます。

ポイント

1. 例では、選択した隣の列に書き出します。
 var col = values[0].length + 1;

2. 行の数だけ、列の数を繰り返します。
for (var i = 0; i < values.length; i++) {
        for (var j = 0; j < values[i].length; j++) {
            sh.getRange(row, col).setValue(values[i][j]);
            row++;
        }
    }


コード.gs
function set_range_values() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sh = ss.getActiveSheet();
    var range = sh.getActiveRange();
    var value = range.getA1Notation();
    var values = sh.getRange(value).getValues();
    var col = values[0].length + 1;
    var row = 1;
    for (var i = 0; i < values.length; i++) {
        for (var j = 0; j < values[i].length; j++) {
            sh.getRange(row, col).setValue(values[i][j]);
            row++;
        }
    }
}


コードを実行する

A2からC4を範囲選択して、set_range_valuesを実行してみると、


A2からC4のデータが、D列に入力されます。


おまけ

例では配列の順番がa2, b2, c2となっています。
これを a2, a3, a4としたいと思い、そのコードも書いてみました。

ポイント
列の数だけ行の数を繰り返すという風にコードを書き換えます。 
for (var i = 0; i < values[0].length; i++) {
        for (var j = 0; j < values.length; j++) {
            sh.getRange(row, col).setValue(values[j][i]);
            row++;
        }
    }


コード.gs
function set_range_values2() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sh = ss.getActiveSheet();
    var range = sh.getActiveRange();
    var value = range.getA1Notation();
    var values = sh.getRange(value).getValues();
    var col = values[0].length + 1;
    var row = 1;
    for (var i = 0; i < values[0].length; i++) {
        for (var j = 0; j < values.length; j++) {
            sh.getRange(row, col).setValue(values[j][i]);
            row++;
        }
    }
}


コードを実行する

A2からC4を範囲選択して、set_range_valuesを実行してみると、

期待通りの結果が得られました。




空白セルを含む場合に空白を除いてくっつける


A, B, Cそれぞれの列で値の数が違う場合


空白セルの分を詰めたい

ifで囲んで空白セルは書き出さないようにする

if(values[j][i] != ""){
  sh.getRange(row, col).setValue(values[j][i]);
  row++;
}



コード.gs
function set_range_values2() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sh = ss.getActiveSheet();
    var range = sh.getActiveRange();
    var value = range.getA1Notation();
    var values = sh.getRange(value).getValues();
    var col = values[0].length + 1;
    var row = 1;
    for (var i = 0; i < values[0].length; i++) {
        for (var j = 0; j < values.length; j++) {
          if(values[j][i] != ""){
            sh.getRange(row, col).setValue(values[j][i]);
            row++;
          }
        }
    }
}