データを比較して、無いデータを新規シートに転記
アクティブシートと前のシートにあるデータを比較し、アクティブシートには存在しないものを新しいシートに転記するものです。
function myfunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var activeSheet = ss.getActiveSheet();
var searchSheet = activeSheet.getPreviousSibling();
var range1 = searchSheet.getRange("A2:A").getValues();
var dict = {};
// 検索シートの値を辞書に格納
range1.filter(String).forEach(function (row) {
if (!dict[row[0]]) {
dict[row[0]] = [row];
} else {
dict[row[0]].push(row);
}
});
var range2 = activeSheet.getRange(2, 1, activeSheet.getLastRow() - 1, activeSheet.getLastColumn()).getValues();
var results = [];
// 重複するデータを取得
range2.filter(String).forEach(function (row) {
var key = row[0];
if (dict[key]) {
dict[key].forEach(function (dup) {
results.push(row.concat(dup));
});
}
});
// 結果を新しいシートに貼り付け
var newSheet = ss.insertSheet(activeSheet.getName() + "_作成" + Utilities.formatDate(new Date(), 'JST', 'yyyy-MM-dd HH:mm:ss'));
newSheet.getRange(1, 1, results.length, results[0].length).setValues(results);
newSheet.activate();
SpreadsheetApp.getUi().alert("転記完了");
}
// 新しいシートに結果を転記
var newSheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet();
var sheetName = activeSheet.getName() + "_作成" + Utilities.formatDate(new Date(), "JST", "h時mm分ss秒");
newSheet.setName(sheetName);
newSheet.clearContents();
newSheet.getRange(1, 1, 1, cols).setValues(activeSheet.getRange(1, 1, 1, cols).getValues());
newSheet.getRange(2, 1, result.length, cols).setValues(result);
newSheet.activate();
SpreadsheetApp.getUi().alert("転記完了");
}
解説
function 検索シートのデータとアクティブシートの重複チェック() {
関数の宣言。var ss = SpreadsheetApp.getActiveSpreadsheet();
現在アクティブなスプレッドシートを取得。var activeSheet = ss.getActiveSheet();
現在アクティブなシートを取得。var searchSheet = activeSheet.getPreviousSibling();
検索対象となるシートを取得。getPreviousSibling()
メソッドは、指定されたシートの直前のシートを取得します。var range1 = searchSheet.getRange("A2:A").getValues();
検索シートのA列の範囲を取得し、その中身を二次元配列で取得。var dict = {};
検索対象となる値を格納するための空のオブジェクトを作成。range1.filter(String).forEach(function (row) {
検索シートの範囲内の値を、1行ずつ処理するためのループ。filter()
メソッドで、空白や0などの偽値ではない値のみを抽出している。String
を引数に指定しているので、行の中に文字列が含まれている場合- if (!dict[row[0]]) {
dictオブジェクトにrow[0]が存在しない場合は、新しいキーとその値(行)を追加します。 - row[0]は、2次元配列の各行の最初の要素を表します。
!dict[row[0]]は、dictオブジェクトにrow[0]が存在しない場合に真(true)を返します。つまり、dictオブジェクトにrow[0]が存在しない場合に、ifブロック内の処理が実行されます。 - dict[row[0]] = [row]; } else {
dictオブジェクトにrow[0]が存在する場合は、既存のキーに行(row)を追加します。既存のキーに対応する値は、2次元配列の行(row)を1要素とした配列(dict[row[0]])です。ここでは、2次元配列の行(row)を配列に追加するために、push()メソッドを使用しています。 - dict[row[0]].push(row); } });
上記のコードは、検索シートの値をキーとして、それに対応する行を格納する辞書(dictオブジェクト)を作成しています。検索シートの範囲(range1)に対して、String型のフィルター条件を指定し、条件を満たす行のみを抽出した2次元配列を取得します。その2次元配列の各行について、辞書(dictオブジェクト)に格納するための処理を行います。
コメント