GASでスプレッドシートを操作する第一歩が、セルの「読み書き」です。これは getRange で場所を指定し、getValue(読む)/ setValue(書く)で値をやり取りします。この記事では、コピペで動くコード例とつまずきポイントを、初めての方にも分かるように解説します。
この記事のポイント
- 場所を決める
getRange→ 読むgetValue/getValues→ 書くsetValue/setValuesの3点セット- 行・列の番号は 1始まり(
getRange(1, 1)がA1)- 1セルは
getValue/setValue、複数セル(範囲)はgetValues/setValues(2次元配列)- 大量データは1セルずつではなく範囲でまとめて読み書きすると速い
まずは結論:3つの基本形
セル操作はこの3パターンを押さえればOKです。
function basic() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// 読む:A1の値を取得
const v = sheet.getRange("A1").getValue();
Logger.log(v);
// 書く:B1に値を入れる
sheet.getRange("B1").setValue("こんにちは");
}
getActiveSpreadsheet().getActiveSheet() で「今開いているシート」を取得し、getRange() で対象セルを指定します。
getRangeでセルの場所を指定する4パターン
getRange は指定の仕方が2系統あります。用途で使い分けます。
| 書き方 | 意味 |
|---|---|
getRange("A1") |
A1の1セル |
getRange("A1:C3") |
A1からC3の範囲 |
getRange(2, 1) |
2行1列目(=A2)の1セル |
getRange(2, 1, 5, 3) |
2行1列目から「5行 × 3列」の範囲 |
注意:行・列の番号は 1始まりです(0始まりではない)。getRange(1, 1) がA1、getRange(1, 2) がB1になります。
読み込み:getValue と getValues
1セルだけなら getValue()、複数セル(範囲)なら getValues() を使います。getValues() は2次元配列(行の配列)で返ります。
function readValues() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// 1セル
const one = sheet.getRange("A1").getValue();
// 範囲(2次元配列で返る)
const values = sheet.getRange("A1:C3").getValues();
Logger.log(values[0][0]); // 1行目1列目(A1)
Logger.log(values[1][2]); // 2行目3列目(C2)
}
注意:範囲に対して getValue()(単数)を使うと、左上の1セルだけしか取れません。範囲は必ず getValues()(複数)です。
書き込み:setValue と setValues
書く側も同じく、1セルは setValue()、範囲は setValues()(2次元配列を渡す)です。
function writeValues() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// 1セル
sheet.getRange("A1").setValue("名前");
// 1行ぶんをまとめて書く(1行 × 3列)
sheet.getRange(1, 1, 1, 3).setValues([["名前", "年齢", "部署"]]);
// 複数行を書く(3行 × 2列)
sheet.getRange(2, 1, 3, 2).setValues([
["田中", 28],
["佐藤", 34],
["鈴木", 41]
]);
}
注意:setValues() に渡す配列の「行数 × 列数」は、getRange で指定した範囲とぴったり一致させる必要があります。ズレると「The number of rows in the data does not match…」というエラーになります。
実践:表データを全部読み込む
実務でよく使うのが「ヘッダーを除いてデータ行を全部取得」する形です。getLastRow() で最終行を取得して範囲を組み立てます。
function readAll() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const lastRow = sheet.getLastRow();
if (lastRow < 2) return; // データが無いときは何もしない
// 2行目から最終行まで、3列分を取得
const data = sheet.getRange(2, 1, lastRow - 1, 3).getValues();
data.forEach(function(row) {
Logger.log(row[0] + " / " + row[1] + " / " + row[2]);
});
}
取得した2次元配列は、map や filter で加工すると一気に処理できます(配列操作は関連記事へ)。
よくあるつまずきと直し方
セルがズレる → 行・列が1始まりか確認(getRange(1,1)=A1)。
範囲なのに1つしか取れない → getValue()ではなくgetValues()(複数形)を使う。
setValuesでエラー → 渡す配列の形(行数×列数)が範囲と一致しているか確認。1行でも [["a","b"]] と2次元にする。
データが無い行まで読んでエラー → getLastRow() で範囲を決め、lastRow - 1 が0以下のときは処理しない。
ヒント:1セルずつ
getValue/setValueをループで回すと遅くなります。範囲でまとめてgetValues/setValuesする方が圧倒的に高速です。
この記事のポイント(まとめ)
| やりたいこと | 使うもの |
|---|---|
| 場所を指定 | getRange("A1") / getRange(行, 列, 行数, 列数) |
| 1セルを読む/書く | getValue() / setValue() |
| 範囲を読む/書く | getValues() / setValues()(2次元配列) |
| 全データ取得 | getRange(2, 1, getLastRow()-1, 列数).getValues() |
| 速度 | 1セルずつより範囲でまとめて |
次のステップ
セルの読み書きができたら、取得したデータの加工や書式設定に進みましょう。
コメント