スプレッドシートで大量のデータを扱うとき、セルごとに値を書き換えると処理が遅くなり、時間がかかってしまうことがあります。そんなときに役立つのが、Apps ScriptのsetValuesメソッドを使った一括処理です。setValuesを使えば、配列データを一気にシートに書き込めるため、処理速度が大幅に向上します。この記事では、選択範囲の内容をsetValuesで一括変換する具体的な方法を、コード例を交えて解説します。
【要点】setValuesで一括変換を効率化する方法
- setValuesメソッド: 二次元配列で範囲を一括指定し、ループ処理を避けて高速に書き込みます。
- getValuesとの組み合わせ: 既存のセル範囲を配列として取得し、変換後にsetValuesで書き戻します。
- 配列のサイズと範囲の一致: 書き込む配列の行数・列数が範囲と完全に一致している必要があります。
ADVERTISEMENT
目次
Apps ScriptのsetValuesでできること
setValuesは、配列に格納されたデータをスプレッドシートの指定範囲に一括で書き込むメソッドです。通常のsetValueは1セルずつしか書き込めませんが、setValuesを使えば複数のセルを一度に更新できます。このため、スクリプトの実行時間を大幅に短縮できます。例えば、1000行のデータをループで1セルずつ書き込むと数秒かかるところが、setValuesなら一瞬で終わります。また、選択範囲の内容を変換する場合も、まずgetValuesで配列として読み込み、加工した後にsetValuesで書き戻すという流れが基本です。
選択範囲の内容をsetValuesで一括変換する手順
基本的な書き方:選択範囲を読み込んで書き戻す
- スプレッドシートとシートを取得する
スクリプトエディタを開き、以下のコードでアクティブなスプレッドシートとシートを取得します。var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet(); - 選択範囲を取得する
アクティブな範囲はgetActiveRange()で取得します。var range = sheet.getActiveRange();このrangeオブジェクトに対してgetValuesを呼びます。 - データを配列として読み込む
var data = range.getValues();これで二次元配列が得られます。data[row][col] で各セルの値にアクセスできます。 - 配列の内容を変換する
例として、すべての値を大文字に変換する場合、二重ループで各要素にtoUpperCaseを適用します。for (var i = 0; i < data.length; i++) {
for (var j = 0; j < data[i].length; j++) {
if (typeof data[i][j] === 'string') {
data[i][j] = data[i][j].toUpperCase();
}
}
} - 変換した配列をsetValuesで書き込む
range.setValues(data);これで元の範囲に一括書き込みされます。配列のサイズが範囲と一致している必要があります。
応用例:数値の倍にする・日付形式を変換する
- 数値を2倍にする
データが数値の場合、data[i][j] = data[i][j] * 2;のように演算します。ただし数値以外のセルがあるとエラーになるため、typeofでチェックしてください。 - 日付の書式を変換する
getValuesで日付を取得するとJavaScriptのDateオブジェクトになります。Utilities.formatDateを使って文字列に変換し、setValuesで書き戻します。data[i][j] = Utilities.formatDate(data[i][j], Session.getScriptTimeZone(), 'yyyy/MM/dd');
setValues使用時の注意点とよくあるエラー
配列のサイズが範囲と合わない場合
setValuesでは、書き込む二次元配列の行数と列数が、指定した範囲の行数・列数と完全に一致していなければエラーになります。例えば、3行4列の範囲に対して2行4列の配列を渡すと、「範囲のサイズがデータのサイズと一致しません」というエラーが表示されます。この問題を防ぐには、getValuesで取得した範囲サイズをそのまま使うか、配列の次元を範囲に合わせて調整する必要があります。
値の型が原因で予期しない結果になる
setValuesに渡す配列の要素は、文字列・数値・日付・ブール値などスプレッドシートで扱える型である必要があります。オブジェクトや関数を入れるとエラーになります。また、空のセルを表現するには空文字列”やnullを使いますが、nullはセルを空にします。逆にundefinedを入れるとエラーになるため注意してください。
パフォーマンスを最大限に引き出すコツ
setValuesは1回のAPI呼び出しで範囲全体を更新するため、setValueをループで呼ぶより圧倒的に高速です。ただし、スクリプト内で何度もsetValuesを呼ぶと逆に遅くなるため、可能な限り1回のsetValuesにまとめましょう。例えば、複数の範囲を更新する必要がある場合でも、一つの大きな配列にまとめて書き込めないか検討します。また、SpreadsheetApp.flush()を適宜使うことで、書き込みを確実に反映できます。
| 比較項目 | setValue | setValues |
|---|---|---|
| 書き込み速度 | 遅い(セルごとに1回のAPI呼び出し) | 高速(範囲全体を1回で更新) |
| コードの簡潔さ | ループが必要で複雑 | 配列操作のみで簡潔 |
| エラーリスク | 低い(1セルずつなので範囲ミスが起きにくい) | 配列のサイズ不一致によるエラーに注意 |
| 大規模データへの適性 | 不向き(時間制限に引っかかる可能性あり) | 適している(一括処理で高速) |
ADVERTISEMENT
まとめ
setValuesを使うことで、スプレッドシート上の大量データを一括変換する処理が格段に高速になります。基本的な流れは、getValuesで選択範囲を配列として取得し、変換ループを実行してからsetValuesで書き戻すだけです。注意点として、配列のサイズと範囲の一致、データ型の確認を忘れないでください。このテクニックを応用すれば、複数シートの同時更新や条件付き変換など、さらに複雑な処理も効率化できます。ぜひ実際のスクリプトに組み込んで、処理時間の短縮を体感してください。
ADVERTISEMENT
超解決 第一編集部
疑問解決ポータル「超解決」の編集チーム。正確な検証と、現場視点での伝わりやすい解説を心がけています。
Googleスプレッドシートの人気記事ランキング
- 【Googleスプレッドシート】GOOGLEFINANCE関数で株価・為替を取得!リアルタイムデータの呼び出し
- 【Googleスプレッドシート】印刷範囲を指定して印刷!特定範囲だけPDFや紙に出す手順
- 【Googleスプレッドシート】新しいスプレッドシートを作成する3つの方法!ドライブ・URL・テンプレート
- 【Googleスプレッドシート】数値の連続データを自動入力!オートフィルの活用
- 【Googleスプレッドシート】ダークモードを有効にする!目に優しい配色への切替
- 【Googleスプレッドシート】株価APIで株式データを自動取得!GOOGLEFINANCE超え活用
- 【Googleスプレッドシート】共有相手が編集できない時のチェック!権限と許可状態の確認
- 【Googleスプレッドシート】ページ設定で用紙サイズと向きを調整!印刷レイアウトの基本
- 【Googleスプレッドシート】Excelファイルxlsxをインポートする手順!ドラッグ&ドロップで取り込み
- 【Googleスプレッドシート】条件付き書式をコピーする!書式のみペーストの活用
