Googleスプレッドシートで複数のシート間でデータを移動したい場面はよくあります。手作業でコピー&ペーストを繰り返すと、時間がかかるだけでなくヒューマンエラーも発生しやすいです。Apps Scriptを使えば、getRangeメソッドとsetValuesメソッドを組み合わせることで、シート間のデータ転送を自動化できます。この記事では、その基本的な書き方から注意点までをわかりやすく解説します。
【要点】getRangeとsetValuesでシート間データ移動を効率化する
- sourceRange.getValues(): 移動元の範囲を二次元配列として取得します。行数と列数が自動で決まります。
- targetRange.setValues(valuesArray): 取得した配列を一度に書き込みます。ループを使わないため高速です。
- getLastRow()とgetLastColumn(): データが存在する最終行・列を動的に取得し、範囲を自動調整します。
ADVERTISEMENT
目次
getRangeとsetValuesがデータ移動に適している理由
シート間のデータ移動には、大きく分けて二つの方法があります。ひとつはシートの組み込み関数(IMPORTRANGEなど)を使う方法で、もうひとつがApps Scriptを使う方法です。関数型はリアルタイム同期が可能ですが、大量データでは処理が重くなることがあります。一方、Apps ScriptではgetValues()でデータを二次元配列として一括取得し、setValues()で一括書き込みを行います。この方法はループ処理に比べて数十倍速く、特に数千行以上のデータ移動で威力を発揮します。また、スクリプト内でデータの加工(フィルタリングや並べ替えなど)を簡単に組み込めるのも大きなメリットです。
ただし、setValuesを使うには書き込み先の範囲が配列のサイズと完全に一致している必要があります。範囲が小さいとデータが欠落し、大きすぎると余分なセルが上書きされます。そのため、あらかじめ書き込み先の範囲を配列の行数・列数に合わせて正確に指定することが不可欠です。
シート間のデータ移動を実装する手順
ここでは、特定のシートから別のシートへ、すべてのデータをコピーする基本的なスクリプトを作成します。Googleスプレッドシートのメニューから「拡張機能」→「Apps Script」を開き、コードエディタに以下の手順で記述してください。
- スクリプトエディタを開く
スプレッドシートを開いた状態で、メニューバーの「拡張機能」→「Apps Script」をクリックします。すると新しいタブでエディタが開きます。プロジェクト名は任意の名前に変更して構いません。 - 関数を定義する
デフォルトのmyFunction()を削除し、以下のような関数を記述します。関数名はcopyDataBetweenSheetsなど、わかりやすい名前を付けてください。 - 移動元と移動先のシートを取得する
const ss = SpreadsheetApp.getActiveSpreadsheet();でアクティブなスプレッドシートを取得します。次にconst sourceSheet = ss.getSheetByName('元のシート名');とconst targetSheet = ss.getSheetByName('先のシート名');でそれぞれのシートを取得します。 - データ範囲を動的に取得する
const lastRow = sourceSheet.getLastRow();とconst lastCol = sourceSheet.getLastColumn();でデータが存在する最終行と最終列を取得します。これにより、固定範囲ではなくシートの内容に応じた範囲を指定できます。const sourceRange = sourceSheet.getRange(1, 1, lastRow, lastCol);として範囲を取得します。 - データを配列として取得する
const data = sourceRange.getValues();でセルの値を二次元配列として取得します。この配列はdata[row][col]の形式でアクセスできます。 - 書き込み先の範囲を指定して書き込む
移動先シートの同じサイズの範囲を用意します。const targetRange = targetSheet.getRange(1, 1, data.length, data[0].length);とします。data.lengthは行数、data[0].lengthは列数です。その後、targetRange.setValues(data);で一括書き込みを実行します。 - スクリプトを保存して実行する
エディタのファイルアイコンをクリックして保存します。初回実行時は権限の承認が必要です。承認後、実行したい関数を選択して再生ボタンを押すと処理が走ります。正しく動作すれば、移動先シートにデータが転記されます。
サンプルコード全体
function copyDataBetweenSheets() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sourceSheet = ss.getSheetByName('元のシート');
const targetSheet = ss.getSheetByName('先のシート');
const lastRow = sourceSheet.getLastRow();
const lastCol = sourceSheet.getLastColumn();
const sourceRange = sourceSheet.getRange(1, 1, lastRow, lastCol);
const data = sourceRange.getValues();
const targetRange = targetSheet.getRange(1, 1, data.length, data[0].length);
targetRange.setValues(data);
}
よくあるトラブルとその対処法
書き込み先の範囲がデータと一致しない場合
setValuesメソッドは、指定した範囲のサイズと配列のサイズが異なるとエラーになります。たとえば配列の行数が5で、指定した範囲の行数が3だと「範囲のサイズが一致しません」というエラーが発生します。これを防ぐには、配列の行数と列数をdata.lengthとdata[0].lengthで取得し、そのまま範囲指定に使ってください。ただしデータが空のシート(最終行=0)の場合、data[0]がundefinedになるので注意が必要です。そのような場合は事前にif (data.length === 0) return;などでガードすると安全です。
大量のデータで処理が遅くなる
getValuesとsetValuesは一括処理のため通常は高速ですが、数万行を超えるデータでは数十秒かかることもあります。その場合はSpreadsheetApp.flush()を適宜挿入して変更を強制適用すると、メモリ使用量が改善されることがあります。また、不要な書式や数式が含まれているとデータが重くなるため、値のみをコピーしたい場合はcopyToメソッドの使用も検討してください。
移動先シートの既存データが上書きされる
setValuesは範囲全体を置き換えます。既存のデータを残したい場合は、書き込み開始位置を空いている行にずらすか、appendRowメソッドを検討してください。ただしappendRowは一行ずつ書き込むためパフォーマンスが低下します。代替として、移動先の最終行を取得し、その次の行から書き込むように範囲を調整するのが良いでしょう。
ADVERTISEMENT
getValues/setValuesと個別ループの比較
| 操作 | メリット | デメリット |
|---|---|---|
| getValues + setValues | 一括読み書きで高速。コードが簡潔。データ加工が容易。 | 範囲指定のミスでエラー。メモリ消費が大きい。 |
| getValue + setValue(ループ) | セル単位の細かい制御が可能。条件分岐を入れやすい。 | 大量データで極端に遅い。コードが冗長。 |
まとめ
この記事では、Apps ScriptのgetRangeとsetValuesを使ったシート間のデータ移動方法を解説しました。動的に範囲を取得し、一括で読み書きすることで、ループ処理よりはるかに高速かつ簡潔なコードが書けます。最初はシート名や範囲指定で戸惑うかもしれませんが、サンプルコードを元に少しずつ試してみてください。次は、書き込み先の既存データを消さずに追加する方法や、条件に応じて特定の行だけコピーする応用にも挑戦してみると、さらに便利になります。
ADVERTISEMENT
超解決 第一編集部
疑問解決ポータル「超解決」の編集チーム。正確な検証と、現場視点での伝わりやすい解説を心がけています。
Googleスプレッドシートの人気記事ランキング
- 【Googleスプレッドシート】GOOGLEFINANCE関数で株価・為替を取得!リアルタイムデータの呼び出し
- 【Googleスプレッドシート】印刷範囲を指定して印刷!特定範囲だけPDFや紙に出す手順
- 【Googleスプレッドシート】新しいスプレッドシートを作成する3つの方法!ドライブ・URL・テンプレート
- 【Googleスプレッドシート】数値の連続データを自動入力!オートフィルの活用
- 【Googleスプレッドシート】ダークモードを有効にする!目に優しい配色への切替
- 【Googleスプレッドシート】株価APIで株式データを自動取得!GOOGLEFINANCE超え活用
- 【Googleスプレッドシート】共有相手が編集できない時のチェック!権限と許可状態の確認
- 【Googleスプレッドシート】ページ設定で用紙サイズと向きを調整!印刷レイアウトの基本
- 【Googleスプレッドシート】Excelファイルxlsxをインポートする手順!ドラッグ&ドロップで取り込み
- 【Googleスプレッドシート】条件付き書式をコピーする!書式のみペーストの活用
