複数のデータでマッチングして新規シートに転記する
function myfanction() {
var objDIC = {}; //辞書オブジェクトを作成
var myKey;
var i;
//アクティブシート:キーとアイテム取得
var sheet1 = SpreadsheetApp.getActiveSheet();
var range1 = sheet1.getDataRange();
var data1 = range1.getValues();
for (i = 1; i < data1.length; i++) {
objDIC[data1[i][0]] = data1[i][1] + "," + data1[i][4] + "," + data1[i][19];
}
//アクティブシートの右隣のシート:キーとアイテム取得
var sheet2 = sheet1.getNextSibling();
var range2 = sheet2.getDataRange();
var data2 = range2.getValues();
for (i = 1; i < data2.length; i++) {
objDIC[data2[i][0]] = data2[i][2] + "," + data2[i][4] + "," + data2[i][6];
}
//「objDIC」からkeyを、配列変数(一次)に取り出す
myKey = Object.keys(objDIC);
//新規シートへ出力
var newSheet = SpreadsheetApp.getActive().insertSheet();
newSheet.setName(sheet1.getName() + "_" + Utilities.formatDate(new Date(), "JST", "h時mm分ss秒"));
for (i = 0; i < myKey.length; i++) {
newSheet.getRange(i + 2, 1).setValue(myKey[i]);
var items = objDIC[myKey[i]].split(",");
newSheet.getRange(i + 2, 2, 1, 3).setValues([items]);
}
SpreadsheetApp.flush();
Browser.msgBox("完了");
}
解説
- アクティブシート:キーとアイテム取得の箇所の解説
- 最初に、
getActiveSheet()
メソッドを使用して、現在アクティブなシートのオブジェクトを sheet1
という変数に格納しています。
- その後、
getDataRange()
メソッドを使用してシート内のすべてのセル範囲を取得し、 getValues()
メソッドを使用してその範囲内のデータを取得しています。これらのデータは data1
という二次元配列に格納されます。
- 次に、
for
ループを使用して、data1
配列の各行に対して、キーとアイテムを objDIC
という辞書オブジェクトに追加します。具体的には、objDIC[data1[i][0]]
に data1[i][1]
と ,
と data1[i][4]
と ,
と data1[i][19]
を結合した文字列を格納しています。data1[i][0]
は、現在処理中の行の最初の列の値であり、これが objDIC
のキーになります。data1[i][1]
、data1[i][4]
、data1[i][19]
は、それぞれ現在処理中の行の2番目、5番目、20番目の列の値であり、これらが objDIC
のアイテムになります。
- 新規シートへ出力のfor~の解説
先ほど取得した辞書オブジェクト objDIC
の中からキーを一つずつ取り出し、新規に作成したシートに書き込む処理を行っています。
- まず
for
ループの条件式 i < myKey.length
は、配列 myKey
の要素数分だけループを回します。ここで myKey
は、先ほど Object.keys()
メソッドを使って objDIC
のキーの一覧を取得したものです。
newSheet.getRange(i + 2, 1).setValue(myKey[i])
: newSheet
の指定したセルに、辞書オブジェクトのキーを書き込みます。ここでは i
に 2
を加えているのは、先頭行に列名があるためです。
- var items = objDIC[myKey[i]].split(“,”)
: 辞書オブジェクトのキーを使用して、対応するアイテムを取得し、カンマ区切りで分割して items
に代入します。
- newSheet.getRange(i + 2, 2, 1, 3).setValues([items])
: newSheet
の指定したセルに、アイテムを書き込みます。ここでは i
に 2
を加えているのは、先頭行に列名があるためです。また、setValues()
メソッドには配列を引数として渡していますが、[items]
とすることで一次元配列を二次元配列に変換しています。そして、第1引数で指定したセルに対して、第2引数で指定した大きさのセル範囲を作成し、そこにアイテムを書き込んでいます。
コメント