Google Apps Scriptを使ってスプレッドシートを操作していると、セルへの値の書き込みには「setValue」と「setValues」の2つのメソッドがあることに気づきます。どちらもよく似ていますが、使い方やパフォーマンスに大きな違いがあります。この記事では、setValueとsetValuesの違いを詳しく解説し、状況に応じた使い分けができるようになります。
【要点】setValueとsetValuesの使い分けのポイント
- setValue: 単一セルに1つの値を書き込む際に使用します。簡潔で直感的ですが、大量のセルに使うと遅くなります。
- setValues: 複数セルに2次元配列を一括で書き込む際に使用します。ループを使わず高速にデータを書き込めるため、バッチ処理に適しています。
- 使い分けの基準: 書き込むセルが1つのみならsetValue、複数セルならsetValuesを使い、setValueのループは避けることで処理速度が向上します。
ADVERTISEMENT
setValueとsetValuesの基本的な違い
setValueとsetValuesは、どちらもRangeオブジェクトのメソッドです。setValueは1つのセルに1つの値を設定するのに対し、setValuesは複数のセルに2次元配列(配列の配列)を一度に設定します。ここでは、構文と動作の違いを説明します。
setValueの構文と動作
setValueは引数に任意の値を1つだけ取ります。指定したRangeが単一セルの場合、そのセルに値が書き込まれます。Rangeが複数セルを指している場合は、先頭セル(左上)だけに値が書き込まれ、他のセルは空白になるか、元の値が消える可能性があるため注意が必要です。
setValuesの構文と動作
setValuesは引数に2次元配列を取ります。配列の行数と列数は、対象のRangeの行数と列数に一致しなければなりません。一致しない場合はエラーになります。setValuesはスプレッドシートAPIへの呼び出し回数が1回で済むため、大量データの書き込みに適しています。
具体的な使用例とパフォーマンス比較
実際のコード例を使って、setValueとsetValuesの使い方とパフォーマンスの違いを確認します。シートにデータを書き込む典型的なシナリオで比較します。
setValueを使ったループ書き込み
- 単一セルへの書き込み
次のコードは、A1セルに「Hello」と書き込みます。SpreadsheetApp.getActiveSheet().getRange('A1').setValue('Hello'); - ループによる複数セルへの書き込み
下の例では、A1からA10まで1から10の数値をループで書き込んでいます。1セルずつsetValueを呼び出すため、10回のAPI呼び出しが発生します。for (let i = 1; i <= 10; i++) { sheet.getRange(i, 1).setValue(i); }
setValuesによる一括書き込み
- 2次元配列の作成
まず、書き込むデータを2次元配列で用意します。行と列の構造を持ちます。const data = [];
for (let i = 1; i <= 10; i++) { data.push([i]); // 1列の場合 } - setValuesで一括書き込み
対象範囲を指定し、setValuesに配列を渡します。sheet.getRange(1, 1, data.length, data[0].length).setValues(data);
これで1回のAPI呼び出しで10セルに書き込めます。
パフォーマンスの違い
スプレッドシートAPIへの呼び出し回数は、setValueをループで使うとセル数分だけ増えます。一方、setValuesは1回で済むため、特に100セル以上の大量データでは処理時間に顕著な差が出ます。計測例では、1000セルへの書き込みでsetValueループが約2秒かかるのに対し、setValuesは0.1秒未満という結果がよく報告されています。
注意点とよくあるエラー
setValueとsetValuesを使う際に陥りやすいミスと、その対処法を説明します。特に配列のサイズ不一致や型の扱いに注意してください。
setValuesの配列サイズがRangeと合わない
setValuesに渡す配列の行数と列数が、指定したRangeの行数・列数と一致しないとエラーになります。例えば、Rangeが5行3列なのに4行2列の配列を渡すと「The number of rows or columns in the data does not match the number of rows or columns in the range.」というエラーが発生します。事前に配列の長さとRangeのサイズを確認するコードを入れましょう。
setValueで複数セル指定したときの挙動
setValueを複数セルのRangeに対して使うと、先頭セル(左上)だけに値が設定され、他のセルはクリアされます。誤って広い範囲を指定すると、意図しないデータ消失を招く恐れがあります。必ず単一セルを指定するか、getRangeの引数に行と列を1つずつ渡すようにします。
日付や通貨の書式設定
setValueやsetValuesで値を書き込むと、セルの書式は自動判定されます。日付の文字列を入れてもシリアル値として認識されない場合があります。日付として正しく表示したい場合は、setNumberFormatなどで明示的に書式を設定するか、Dateオブジェクトを直接書き込みます。setValuesでも同様です。
ADVERTISEMENT
setValueとsetValuesの比較表
| 項目 | setValue | setValues |
|---|---|---|
| 書き込むセル数 | 1セル(単一値) | 複数セル(2次元配列) |
| 引数 | 任意の値(数値、文字列、日付など) | 2次元配列(Array of Arrays) |
| API呼び出し回数 | 1回の呼び出しにつき1回 | 1回の呼び出しにつき1回(複数セルまとめて) |
| パフォーマンス | ループで多数使うと低速 | 一括設定で高速 |
| エラー発生条件 | 複数セルRangeに使うと先頭以外消去 | 配列サイズとRangeサイズ不一致 |
| 推奨用途 | 単一セルの更新、少量データ | 大量データの一括書き込み、バッチ処理 |
まとめ
セルへの値書き込みには、単一セルにはsetValue、複数セルにはsetValuesを使い分けるのが基本です。setValueのループで多数のセルを更新するよりも、setValuesで一括処理する方がスクリプトの実行時間を大幅に短縮できます。また、setValuesを使う際は配列のサイズとRangeのサイズを必ず一致させる必要があります。この使い分けをマスターすることで、効率的なスプレッドシート操作が可能になります。
ADVERTISEMENT
超解決 第一編集部
疑問解決ポータル「超解決」の編集チーム。正確な検証と、現場視点での伝わりやすい解説を心がけています。
Googleスプレッドシートの人気記事ランキング
- 【Googleスプレッドシート】GOOGLEFINANCE関数で株価・為替を取得!リアルタイムデータの呼び出し
- 【Googleスプレッドシート】印刷範囲を指定して印刷!特定範囲だけPDFや紙に出す手順
- 【Googleスプレッドシート】複合グラフで棒と折れ線を同時表示!2軸グラフの作り方
- 【Googleスプレッドシート】FILTER関数で条件に合う行だけ抽出!数式1つで動的な絞り込み
- 【Googleスプレッドシート】フィルタ表示で他の人の表示を変えずに絞り込み!共有時の使い分け
- 【Googleスプレッドシート】重複データを抽出して表示!COUNTIFと条件付き書式の併用
- 【Googleスプレッドシート】新しいスプレッドシートを作成する3つの方法!ドライブ・URL・テンプレート
- 【Googleスプレッドシート】ARRAYFORMULAで列全体に数式を一括適用!セル分の入力を不要に
- 【Googleスプレッドシート】データ範囲を動的に伸縮させる!INDIRECTと参照範囲のコツ
- 【Googleスプレッドシート】共有解除と権限の取り消し!アクセスを完全に閉じる手順
