例文を使って繰り返し業務を時短

【GAS】シート間でマッチしたデータを新規シートに転記

【GAS】シート間でマッチしたデータを新規シートに転記する GAS

データを比較して、無いデータを新規シートに転記

アクティブシートと前のシートにあるデータを比較し、アクティブシートには存在しないものを新しいシートに転記するものです。

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オブジェクト)に格納するための処理を行います。

コメント

タイトルとURLをコピーしました