【GAS】スプレッドシートの最終行に追加、コピー、自動追加する方法まとめ【Google Apps Script】

GAS自動連携・効率化
この記事は約11分で読めます。

GASで最終行にデータを追加したり、他の場所からコピーして最終行に挿入したり、
自動で最終行に追加していく方法を解説しています。

この記事で解説しているメソッド

appendRow()
flat()
getLastRow()
push()

GASで最終行に追加する方法

スポンサーリンク

GASでスプレッドシートの最終行に追加する方法は3つあります。
・配列に入力する値を格納して最終行に追加入力する
・配列に入力する値を格納して、配列にデータ追記して入力する
・最終行を取得してそこにデータを追記入力する

上2つは配列を使用するため、ちょっと難しいかもしれませんが、
わかってしまえば簡単にできます。

一番下の追記方法は意識して配列を使用せずに、
setValue等で追記することができるのでわかりやすいですが、
追記するデータの範囲を取得する必要があります。

順番に解説していきます!

配列に値を格納して最終行に追加する


例えば、シート1のA2〜D9のデータを、シート2の最終行に追加したいとします。

最終行に追加するには、appendRow() メソッドを使用しますが、
appendRow() メソッドは1行ずつしか追加できないため、
1行ずつ順番に処理します。

function myFunction() {

  //シート1を読み込み
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート1');
  //シート2を読み込み
  var sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート2');

  //シート1のデータがある最終行列を取得
  var lastRow = sheet.getLastRow();
  var lastCol = sheet.getLastColumn();

  for(let n=2; n<=lastRow; n++){
    //表のデータを取得して変数に格納
    value = sheet.getRange(n,1,1,lastCol).getValues();

    //2次元配列を1次元配列に変更
    value = value.flat();

    //シート2の最終行に挿入
    sheet2.appendRow(value);
  }
}

まず、元となるデータがあるシート1の最終行列を取得します。

  //シート1のデータがある最終行を取得
  var lastRow = sheet.getLastRow();
  var lastCol = sheet.getLastColumn();

そこからfor文で、1行ずつデータを取得して追加していきます。

  for(let n=2; n<=lastRow; n++){
    //表のデータを取得して変数に格納
    value = sheet.getRange(n,1,1,lastCol).getValues();

    //2次元配列を1次元配列に変更
    value = value.flat();

    //シート2の最終行に挿入
    sheet2.appendRow(value);
  }

1行分のデータを変数に格納すると、2次元配列として格納されてしまいます。
appendRow()メソッドは2次元配列だとエラーになってしまうので、
flat()メソッドで1次元に変換しています。
「value = value.flat();」

そして、appendRow()メソッドで最終行にデータを追加しています。

配列がよくわからない場合、また別の記事で解説していきますが、
そういうものだと思っておいてください!
コピペで動くので最終行に追加するだけなら深く考えなくても大丈夫です。

配列にデータを追加して最終行に追加する


配列に追加して最終行に追加する場合は、
シート2の最終行も取得しておく必要があります。

function myFunction() {

  //シート1を読み込み
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート1');
  //シート2を読み込み
  var sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート2');

  //シート1のデータがある最終行列を取得
  var lastRow = sheet.getLastRow();
  var lastCol = sheet.getLastColumn();

  //シート2のデータがある最終行を取得
  var lastRow2 = sheet2.getLastRow();

  var value = [];

  for(let n=2; n<=lastRow; n++){
    //表のデータを取得して変数に格納
    value.push(sheet.getRange(n,1,1,lastCol).getValues().flat());
  }

  //シート2の最終行に挿入
  sheet2.getRange(lastRow2+1,1,value.length,value[0].length).setValues(value);
  
}

まず、データを格納する変数を定義します。

  var value = [];

配列データを入れるので[]をつけておきます。

value.push(sheet.getRange(n,1,1,lastCol).getValues().flat());

ここでは、シート1のデータを配列で変数valueに格納しています。
格納する時に1次元への変更も同時に行なっています。

sheet2.getRange(lastRow2+1,1,value.length,value[0].length).setValues(value);

データの取得ができたら後は最終行に追記するだけです。

「value.length」で配列の行数、「value[0].length」で配列の列数を取得して範囲を指定しています。

最終行を取得してそこにデータを追記入力する

配列とかよくわからん!!という場合は、
データの範囲を取得して最終行に追記することもできます。

function myFunction() {

  //シート1を読み込み
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート1');
  //シート2を読み込み
  var sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート2');

  //シート1のデータがある最終行列を取得
  var lastRow = sheet.getLastRow();
  var lastCol = sheet.getLastColumn();

  //シート2のデータがある最終行を取得
  var lastRow2 = sheet2.getLastRow();

  var value = sheet.getRange(2,1,lastRow,lastCol).getValues();

  //シート2の最終行に挿入
  sheet2.getRange(lastRow2+1,1,lastRow,lastCol).setValues(value);

}

データを入力する場合、getRange()で範囲を指定する必要があるので、
取得した最終行や最終列を使用して、範囲を指定しています。

最終行にデータをコピーするサンプルデータ


最終行にデータコピー挿入するサンプルデータはこちらからダウンロードしてください。
【Copori】GASで最終行に追加サンプル

このサンプルデータは、行列取得の時に使用したサンプルデータなので、
行列取得のGASも入っています。

行列取得の記事はこちら
【GAS】スプレッドシートで行列取得まとめ、最終行列、getLastrow、getLastcol【Google Apps Script】

最終行に追加サンプルデータの使用方法

1、【Copori】GASで最終行に追加サンプルを開いてコピーしてください。

2、メニューから「拡張機能」⇨「Apps Script」を開きます。
※複数アカウントでログインしているとエラーで開けないので注意してください。

3、シート最終行取得のGASなどを一度実行して、権限取得を行なってください。
左の一覧表をシート2の最終行にコピー挿入のチェックを入れると表がシート2に追記されます。

スポンサーリンク

4、シート2の初期化する時は、「シート2の初期化」のチェックボックスをチェックしてください。
チェックすると、シート2が初期化され初期化チェックが外れます。

最終行に追加サンプルデータの詳細

「【CB】初期化+表データコピー挿入」という名前のGASが今回のメインコードです。

このサンプルコードでは、appendRow()メソッドを使用しているため、
2次元配列を1次元配列に変更してデータを取得し、
シート2の最終行に追加するようにしています。
(他の方法の最終行追加に関してはタスク管理シート(行追加サンプル)を参照してください)

メインの部分のコードはここだけ↓

        //シート1のデータがある最終行を取得
        var lastRow = sheet.getLastRow();
        //シート2を読み込み取得
        var sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート2');

        //シート1の見出し位置(A19)から最終行まで順番にデータ処理
        for(let n=19; n<=lastRow; n++){
          //表のデータを取得して変数に格納
          let value = sheet.getRange(n,1,1,4).getValues();
          //2次元配列を1次元配列に変更
          value = value.flat();
          //シート2の最終行に挿入
          sheet2.appendRow(value);
        }

これは最初に解説した方法と同じなので、
詳しくは配列に値を格納して最終行に追加する方法を参照してください。

最終行に追加するタスク管理シート


このタスク管理シートは内容を記入すると、自動で日付が入力されるようになっています。
【Copori】タスク管理シート(行追加サンプル)

GASを実行すると、完了したタスクが完了タスクのシートの最終行に移動し、
未完了のタスクだけ残るようになっています。

手動実行しているので日付が全部同じですが、
トリガー実行することによって、毎日自動でデータの移動が可能です。

完了タスクの上部の空白が多いのは、ここに月間データを作成中だからです。
完成したら記事にしていきますね!

タスク管理シートの使い方

1、【Copori】タスク管理シート(行追加サンプル)を開いて、コピーしてください。

2、タスク管理シートの下(A30〜A40)にタスクのジャンルを記入してください。
ここに記入したジャンルが選択できるようになります。

3、メニューから「拡張機能」⇨「Apps Script」を開きます。
※複数アカウントでログインしているとエラーで開けないので注意してください。

4、【権限取得用】日付表示用のGASを実行して、権限取得を行なってください。
取得方法はこちら

5、権限取得をすると、内容を記入したら日付が自動入力されるようになります。
DAY処理を実行すると、完了タスクが「完了タスクのシート」の最終行に追記されます。
日付トリガーで自動実行させると便利です。

【トリガーセット】自動で最終行にデータ追加を行う方法


GASエディタの左からトリガーを選択して開きます。


開くと、右下にトリガーを追加ボタンがあるのでそちらをクリック


下記のように設定していきます。

実行する関数:daydata
イベントのソースを選択:時間手動型
時間ベースのトリガーのタイプを選択:日付ベースのタイマー
時刻を選択:午前0時〜1時

設定ができたら下に保存ボタンがあるので、
そちらをクリックして保存。


トリガーが追加されていたらOKです。

これで毎日0時〜1時に自動実行されるようになりました。

トリガーについての詳細はこちら
【GAS】トリガーの作成・削除・一時停止、実行されない時の対処法【Google Apps Script】

最終行に追加のタスク管理シートのGASコード詳細


この記事でのメインとなるコードは、DAY処理のGASの50行目〜64行目です。

        //完了タスクシートの最終行を取得
        let lastRows = monthSheet.getLastRow();
        lastRows++;

        //コピーする範囲を取得
        let range = 'B'+i+':D'+i;
        //タスク内容を取得
        let values = taskSheet.getRange(range).getValues();
        //タスク内容をクリア
        taskSheet.getRange(range).clearContent();

        //完了タスクシートの最終行に「完了」を入力
        monthSheet.getRange(lastRows,1).setValue('完了')
        //完了タスクシートの最終行に取得したタスク内容を追記挿入
        monthSheet.getRange(lastRows,2,1,3).setValues(values);

まず、完了タスクシートのデータ最終行を取得して、
データが入っている次の空の行を取得したいので、「lastRows++;」で+1しています。

1行ずつコピーする範囲をfor文で指定してデータの取得を行い、
取得したらクリアして、完了タスクシートの最終行に追加しています。

そんなに難しくないので、実際に動かしてみて確認してみてください。

ありがとうございました!

スポンサーリンク

コメント

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