【GAS】appendRowメソッドの使い方|スプレッドシートの最終行に書き込む
Google Apps Script(GAS)には、あるスプレッドシートの最終行に行を追加する方法としてappendRowメソッドが用意されています。この記事ではappendRowメソッドの基本的な使い方や注意点、よくある活用方法などをご紹介します。
appendRow以外のスプレッドシートの最終行に書き込む方法は下記の記事でも詳しく解説しています。
appendRowメソッドとは
appnedRowは引数として与えた一次元配列を、スプレッドシートに追加できるメソッドです。GASのスプレッドシートサービスでは、Spredsheet > Sheet > Range > Value(Values)という明確な階層構造になっていますが、このSheetクラスに対して、既存データが格納されている最終行の次の行に値を挿入できます。
実際には挿入位置はデータが格納されている範囲にも依存するわけですが、メソッドの実行はSheetクラスに対して行えるということ、他のスプレッドシート関連のメソッドでは一度スプレッドシートからデータを読み込みプログラム上で処理してから再度スプレッドシートに書き込まなければならない場合が多い中、appendRowメソッドは直接書き込めるというのが特徴でしょう。
今回は上記のような店舗ごとの売上/来店客数データに対して、追加で店舗のデータを挿入する処理を実行してみます。
appendRowメソッドの基本構文と引数
Sheet.appendRow(rowContents)
- rowContents(array):シート最終行へ挿入する一次元配列
引数は行挿入したい一次元配列です。
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// 追加用の配列データを用意
const shopE = [ 'E', 120394, 5 ] ;
const shopF = [ 'F', 543011, 24 ] ;
//最終行にデータを追加
sheet.appendRow(shopE);
sheet.appendRow(shopF);
実行後のスプレッドシートを見てみると問題なく書き込めているようでした。
appendRowメソッドは関数も挿入できる
範囲を指定してSUM関数を適応
テキストで記述すれば関数も機能します。下記はB列の2~4行目、C列の2~4行目を合計するSUM関数の挿入です。
const kansuu = [ null, '=SUM(B2:B4)', '=SUM(C2:C4)'] ;
sheet.appendRow(kansuu);
存在するすべての行の値にSUM関数を適応
前述の例だといちいち行範囲を指定しなければなりません。実際にプログラムする場面では存在するすべての行で合計処理することが多いでしょうから、既存データの最終行までを自動的に含めてくれるように記述したいですね。
既存データが格納されている最終行はgetLastRowメソッドで取得できます。これを関数内に埋め込めば最終行まで含むSUM関数を記述できました。
//最終行の行番号を取得
const lastrow = sheet.getLastRow()
// 列合計計算用の配列
const soukei = [ '総計', '=SUM(B2:B'+lastrow+')', '=SUM(C2:C'+lastrow+')'] ;
sheet.appendRow(soukei);
getLastRowメソッドの詳細は下記の記事で解説しています。
appendRowメソッドの列指定
まず、appendRowメソッドでは列番号を指定するような機能は用意されていません。若干手間ではありますが、nullも挿入できるという特徴を活用してある程度近しい処理ができます。
ここでは、上記のようなシートを想定しデータが格納されている最終列の次の列と最終行の次の行に売上金額の合計を挿入することにします。
まずは行数と列数をそれぞれgetLastRowメソッドとgetLastColumnメソッドで取得しておきます。取得した列数を使って、空の配列に列数分のnull値を格納しておき、最後に本来挿入したい値や関数(ここでは売上を表すC列の合計金額)を格納してappendRowメソッドを実行すれば完了です。
// 最終行を取得
const lastrow = sheet.getLastRow();
// 最終列を取得
const lastcol = sheet.getLastColumn();
// 挿入用の配列
let total = [] ;
//[最終列+1]の列に挿入したいのでlastcol+1をインデックスに指定
total[lastcol+1] = '=SUM(C2:C'+lastrow+')';
//挿入実行
sheet.appendRow(total);
上記のスクリプトでは配列のインデックスを飛ばして代入すると間の要素がnullになるという、配列の特性を利用しています。配列の他の特徴も下記の記事で確認できます。
上記のように少し頭をひねった処理をするくらいであれば、普通にsetValueで行列番号を指定して値を挿入したほうがシンプルです。参考までに上述の処理をsetValueパターンで記述してみます。実行結果は全く一緒です。
const lastrow = sheet.getLastRow();
const lastcol = sheet.getLastColumn();
//[最終行+1]行、[最終列+1]列に値を挿入
sheet.getRange(lastrow+1,lastcol+1).setValue('=SUM(C2:C'+lastrow+')');
setValueメソッドを使った方が圧倒的に楽ですね。appendRowはあくまで行の一括追加を素早く行うための機能だと理解しておいた方が良さそうです。
appendRowメソッドの複数行追加
列指定の時と同様に欲しい機能ですが、appendRowメソッドでは複数行挿入は一度に行うことはできません。二次元配列を引数としてappendRowを実行しようとするとエラーになります。
複数行を最終行に挿入したい場合は回数を分けてappendRowを繰り返し実行するか、または一度スプレッドシート上のデータを配列に格納して複数要素を追加後に一括してデータを書き込むことになります。
基本構文ではappendRowメソッドを2回実行して2行挿入しました。下記では一度配列に格納する方法のサンプルコードを記載していますが実行結果は全く同じです。
const sheet = SpreadsheetApp.getActiveSheet();
const values = sheet.getDataRange().getValues();
// 行追加したい配列
const shopE = [ 'E', 120394, 5 ] ;
const shopF = [ 'F', 543011, 24 ] ;
//変数の最終要素にデータに追加
values.push([shopE,shopF]);
//最終行と最終列を取得
const column = sheet.getDataRange().getLastColumn();
const row = values.length;
//スプレッドシートに書き出し
sheet.getRange(1, 1, row, column).setValues(values);
まとめ
appendRowメソッドの基本構文、注意点、活用方法等をご紹介しました。便利メソッドですが制約も多く場合によっては他の処理方法を検討したほうがよさそうです。
- appendRowメソッドは引数として与えた一次元配列を、スプレッドシートに追加できるメソッド
- Sheet.appendRow(rowContents)で記述できる
- appendRowメソッドは関数も挿入できる
- 挿入位置の列指定や複数行の一括挿入はできない